変更履歴
SpiderHead の変更点をリリースごとにまとめています。各項目には変更の種類と、現在動作しているかどうかを記載しています。
Unreleased
3.1.0 以降65 件2026年10月22日
7 変更2 修正変更動作中A results difference between two scans can now be attributed.#1529
The new read-only
#1529 (GitHub の issue)scan-config-diff(CLIseohead scan-config-diff --before a.sqlite --after b.sqlite, MCPseo_scan_config_diff) reads both scans' recorded effective configurations from their headers — the sites are never re-read — and reports a field-by-field diff over the manifest's dotted setting paths: changed settings with both values, added, removed, an identical flag, and how many settings were compared. Identical configurations report no differences; a free-form map such ashttp.headerscompares as one leaf, exactly as the manifest records it.変更動作中A native crawl now measures its own reading level.#1516
The new
#1516 (GitHub の issue)checks.readabilitymodule computes, offline over each page's retained content area, the sentence count, average words per sentence, the Flesch Reading Ease score (206.835 − 1.015·words/sentences − 84.6·syllables/words, English vowel-group syllable heuristic, versionflesch-reading-ease.v1) and the standard band label. The four values are stored as per-URL scan fields (pages.sentence_count,avg_words_per_sentence,flesch,readability), carried into the analyzer frame under the same column names an SF export uses — so the existing READABILITY_DIFFICULT and LONG_SENTENCES checks now fire on native crawls too, with no new check IDs. A page whose content area was not retained, or holds no word with a letter, records NULL/"" — unmeasured, never a zero that would read as measured-and-easy. Text ratio and word count behavior are unchanged.修正動作中Crawls on hosts that enforce https no longer spend a redirect hop on every http URL.#1484
The new opt-in
#1484 (GitHub の issue)http.upgrade_to_httpssetting rewrites http URLs to https before any request — seed, sitemap seeds and discovered links alike, in both spider and list modes and in native scans: no redirect is recorded for the upgrade, the http and https spellings collapse into one page identity, and each page fetched this way carriestransport_upgraded: truein its record (persisted aspages.transport_upgraded, absent in older scans reads as false). The operator opting in is the declaration that the hosts enforce transport security; a host without https answers with visible connection errors rather than a silent fallback. With the setting off, nothing changes.変更動作中A crawl started deep can now stay in its own subtree.#1481
The new
#1481 (GitHub の issue)scope.start_folder_onlytoggle admits only URLs at or below the start URL's path folder: a crawl started at/blog/postwalks/blog/and everything under it, and links pointing above the folder are counted as unfollowed evidence (excludedunderoutside_start_folder) exactly like any other scope rejection — no hand-written include patterns required. The folder is the directory the start URL sits in (a trailing-slash start keeps its own folder); a start URL at the host root is refused, because the root has no folder to stay below. The setting is recorded per scan in the run manifest like every result-affecting setting, and appears incrawl-describe-settings. With the toggle off nothing changes.修正動作中Pages that link at robots-disallowed targets are no longer silent about it.#1486
When robots.txt disallows a linked URL and the crawl's robots policy is
#1486 (GitHub の issue)respect, the target is never fetched and never becomes a page row, so no target-side check can see it: the link between a page and a whole hidden section existed only in the edge list. The newROBOTS_BLOCKED_OUTLINKfinding (notice) lists, per source page, the outlinks whose destinations the policy kept out — both URLs named, internal and external edges alike, the target still never fetched. The population follows the robots policy mode: underreport_onlythe same targets are reported (they would have been blocked), and underignorethe check skips honestly — no URL was measured against robots.txt. Crawl-list runs without retained link edges skip by name like the other link findings.変更動作中An image-only link now names its destination when the wrapped image carries alt text.#1518
Links whose visible content is an image used to show an empty anchor in link evidence even when the image had a descriptive
#1518 (GitHub の issue)alt, so anchor-text review treated every image link as unnamed. The parser now records that alt as the link's anchor with ananchor_source: "alt"marker distinguishing alt-derived anchors from text-derived ones (absent marker = text or nothing). A link with visible text keeps its text; a link with neither stays empty and keeps feeding the no-anchor-text checks. The marker rides the LinkEdge into the scan (links.anchor_source), the links export and the per-link query views; a scan written before the field reportsnullthere rather than a false text-derived answer.変更動作中Hrefs that cannot become fetchable link targets leave evidence instead of vanishing.#1530
Link parsing drops an unparsable href (malformed syntax, e.g. a truncated
#1530 (GitHub の issue)http://[invalid) or a non-http(s) scheme (mailto:,javascript:) with no trace: the source page keeps nothing to say it points at something broken. The new opt-in crawl settingdiscovery.record_invalid_targetsrecords each rejection per page — the raw href exactly as written plus the reason (unparsable_syntax/unsupported_scheme) — through the parser, the crawl record, the scan schema (pages.invalid_link_targets_json) and the analyzer frame, and the newINVALID_LINK_TARGETcheck turns the pages that have them into findings with the raw values as evidence. A missing href and a pure in-page#anchorare absence, not defects, and are never recorded; a measured clean page records an empty list; a crawl that ran without the setting skips the check honestly instead of reporting a clean site nobody measured. Rejected targets are data: they never enter the frontier. The setting is off by default and is recorded in the run manifest like every finding-changing setting.変更動作中
HEADING_SKIPnow flags heading-order jumps in both directions, completing the#1545heading-sequence check: a content heading that skips a level down (H2 -> H4) and one that jumps back up past an open section (H4 -> H2) are the same defect -- the outline steps over a section that was never opened or never closed. A one-level return (H3 -> H2) closes the current section and starts a sibling, which is correct nesting and stays clean, matching the SF 24.3
#1545 (GitHub の issue)axe.heading_orderbehaviour the check was modelled on. Evidence rows carry from/to levels and texts for both directions.変更動作中Third-party product names now appear only where they describe compatibility: a trademark#1554
and non-affiliation notice was added, the export analyzer is called Export Analyzer, and report reasons and docs describe what an export lacks instead of making claims about another product.
#1554 (GitHub の issue)
2026年10月21日
3 追加4 変更3 修正変更ベータデスクトップ: URLデータセットをフラットなリストまたはパスツリーで表示#1492
グループバー末尾のリスト/ツリー切り替えで、データセットを従来のフラットな一覧と、同じ行とフィルターから作られる折りたたみ式のパスツリーの間で切り替えられます。ホストが最上位ノード、ディレクトリURLはそれ自体がフォルダーのノード、ドキュメントURLは最後のフォルダーの下に並びます。葉を選ぶと共有テーブルの選択が連動するため、切り替えても詳細とフィルターは維持されます。
#1492 (GitHub の issue)追加ベータデスクトップ: データのみのレビューモード#1495
View > Data only(Ctrl+Alt+D)で、長時間のレビュー作業向けにナビゲーションとトップバーを隠し、データだけを表示します。この設定はセッションごとに保持され、各画面の固有のパネルは、それぞれの表示切り替えに従います。
#1495 (GitHub の issue)修正ベータログ: time-takenの位置とidentが1つ・2つのレイアウトに対応#1534
Apacheパーサーは、応答時間がサイズとリファラーの間にある場合やログ行の末尾にある場合でも、referer、user-agent、time-takenを抽出するようになりました。以前はこの2つの引用符付きフィールドを黙って捨てていました。形式判定では、クライアントIPとタイムスタンプの間にidentトークンが1つまたは2つあっても受け付けるため、ハイフン1つのカスタムnginxレイアウトも全体が失敗せずに取り込めます。インポートレポートには受け付けたバリエーション(combined-2-ident、combined-1-ident)が表示されます。#1534と#1535を対象とします。
#1534 (GitHub の issue)変更ベータデスクトップ: スペーシングスケールを完成、スケール外の余白を全廃#1374
残っていた184件のスケール外のsetContentsMargins/setSpacing呼び出しを、60ファイルにわたってトークンのスケールに移行しました。変換は詰める方向のみです。さらに、スケール外の値があるとテストが失敗するようになりました。検索、画像、受信箱、issues、ログ、ジャーナル、オンボーディングの画面は先に正規化しています。
#1374 (GitHub の issue)変更ベータデスクトップ: 小さな改善 — 生のTSV値、ウィンドウタイトルにプロジェクト名、tertiaryテキストのAA対応
copy_tsvは保存されている値をそのまま貼り付けるため、画面に表示される「データなし」のプレースホルダーがスプレッドシートに入ることはなくなりました。ウィンドウタイトルには開いているプロジェクトが表示されます(Project — SpiderHead)。tertiaryテキストは、浮き上がった面の上でもAAのコントラスト基準を満たすようになりました。
修正ベータデスクトップ: キーボード操作の範囲を整理、Returnで詳細を開く動作を修正、エラー表示を改善
F6はナビゲーションと現在のページの間だけを切り替えます。Returnキーで選択中の行の詳細が開きます(行メニューが従来から案内していた動作です)。ステータスバーの読み取りエラーには、生のリクエストIDではなく、操作名(URLテーブル、クロールパラメーター)が表示されます。
変更ベータデスクトップ: 表示メニューが、現在の画面のパネルと連動
画面はpanel_actions()(タイトル、表示中かどうか、切り替えの3つ組)を公開でき、表示メニューのパネル項目は、画面を開いた時点でその画面から組み立てられます。URL画面は実行サマリーと「テーブルのみ」表示を提供します。従来の監査項目は、それぞれの元のページに残ります。
修正ベータデスクトップ: 閉じたウィンドウのログにアクティビティ通知が大量に出ないように修正
グローバルなアクティビティ信号が、削除済みのBusyIndicatorウィジェットを呼び出し続けていました。閉じたウィンドウは静かになりました。
追加ベータデスクトップ: シンプルモードでタブを非表示・復元可能に
タブバーのコンテキストメニューで、タブを非表示にする、非表示のタブを復元する、すべて表示する、を選べます。選択内容は保持されます。最初のタブは常に表示されたままで、表示中の最後のタブは非表示にできません。概要からそのタブに進むと、非表示のタブも自動的に表示されます。
追加ベータデスクトップ: シンプルモードの状態表示、ブランドツールバー、オフラインのキャプチャ
操作付きの状態パネルを追加しました。結果なし(検索をクリア/すべて表示)、失敗(再試行/ログを表示)、コアが見つからない(設定を開く)。停止時の通知には、クロール済みURLとキュー内のURLの数が表示されます。ツールバーにはスパイダーのブランドマークが入り、エラー数はバッジで表示されます。
2026年10月20日
1 追加3 変更変更ベータ
seoheadCLIパッケージをドメイン別のモジュールに分割#1514
#1514 (GitHub の issue)cli/_shared.pyにコマンドの登録情報と入力用のヘルパーをまとめました。checks_cmds、project_cmds、scan_cmds、crawl_cmds、sources_cmds、reports_cmds、misc_cmdsは、従来のcli/__init__.pyにあったkwargの対応付け、argparseのフラグ、メインのディスパッチの特殊処理を、それぞれの担当分として持ちます。公開されているインポートの範囲は変わらず、モジュールは4,506行から513行に縮みました。すべてのコマンドで--helpの出力はバイト単位で同一です。変更ベータMCPハンドラーを専用のhandlersパッケージに移動#1514
サーバーのハンドラーは
#1514 (GitHub の issue)seohead/mcp/handlers/に、ドメインごとに分けて置かれるようになりました。対象は、プロジェクト、トラフィック、ログ、ソース、コンテンツ、セマンティック、ワークフロー、保持されたスキャン、エビデンスとBIエクスポート、環境とカタログです。ドキュメントとソースパスの参照も新しい構成に合わせて更新しています。変更ベータURLテーブル: 複数行の選択と、選択範囲のTSVコピー#1347
#1347のURLテーブルを仕上げました。複数の行を選択し、選択範囲をそのままTSVとしてコピーできます。
#1347 (GitHub の issue)追加ベータライブクロール速度の制御コア(作業中)#1360
スキャンの実行中にクロール速度を変更できるようにするコアです(#1360)。デスクトップ側への接続は後続の作業です。
#1360 (GitHub の issue)
それ以前の日付(4)Show all
2026年10月14日
3 変更変更ベータデスクトップ: スキャンの進捗、URL上限、停止ボタン、終了理由#1358
完了数、待機数、速度、残り時間(ETA)、指定されたURL上限が、スキャン一覧、スキャンの詳細、ナビゲーションカードに表示されます。トップバーの停止ボタンには実行IDではなく「Stop scan」と表示され、ちらつかずに更新され、実行が終了すると非表示になります。終了した実行は、終了理由(URL・リクエスト・時間の上限、エラー、ディスク)を示します。
#1358 (GitHub の issue)変更ベータデスクトップ: ボタンデザインを統一、ページ余白を標準化、利用できない機能のチップを削除
全画面でボタンのデザインを統一し、ページ余白を標準に合わせました。利用できない機能のチップは削除しました。
変更ベータデスクトップ: リダイレクトジェネレーターとスニペットエディターをツールセクションに移動
「Methods」には手法の一覧だけが残り、開くと選択中のスキャンが表示されます。スニペットエディターは、選択中のスキャンのコンテキストを初期選択します。
2026年10月13日
3 変更変更動作中デスクトップクローラー: URL詳細のタブ(内部リンク、外部リンク、リソース、スニペット、保存済みソース、ヘッダー…)#1349
デスクトップクローラーでは、クロールファイルを元に、URL詳細のタブ(内部リンク、外部リンク、リソース、スニペット、保存済みソース、ヘッダー)を利用できるようになりました。各タブには件数付きのフィルターがあり、概要はディレクティブを含めて詳しくなりました。タブごとの列の選択はエクスポートの列と連動し、ヘッダーによる並べ替え、コンテキストメニュー、キーボード操作にも対応しています。新規スキャンでは、設定を名前付きのクロールプロファイルとして保存できます。
#1349 (GitHub の issue)変更動作中デスクトップの未接続箇所を整理: リンクグラフ、Issues、URL表、エクスポート#1347
デスクトップの未接続箇所を解消しました。リンクグラフのセクションは、プレースホルダーではなく、コアの
#1347 (GitHub の issue)scan-graphコマンドからノード数、エッジ数、孤立ページの合計と、ページ分割されたノードの表を読み込みます。Issuesは、コアのチェック別カウンターから件数の多いチェックのグループを表示します。URL表では内部リンク(Inlinks)の列を表示・並べ替えできます(リンクの観測が保存されていないスキャンでは、その旨の注記が出ます)。測定できない「Issue count」の列は提供しないようにしました。エクスポートとレポートは、コアのscan-exportを実行し、ページまたは検出結果をCSV、XLSX、JSON、XMLで選んだフォルダーに書き出します。コアが裏付けられない比較・タスクのデータセット、列のプレースホルダー、エクスポート履歴は削除しました。保存されているが未適用の設定は、理由をホバーで表示しつつ、目に見えるかたちで無効になります。クロール設定のダイアログでは、検証済みのエディターがないパラメーターを、エディターの一覧に混ぜずに、一度だけ読み取り専用で一覧表示します。新規スキャンの「Why this scan」欄には、空である理由が表示されます。変更動作中デスクトップの未接続箇所: クローラーのセクションがプロジェクトなしで単発のクロールを実行#1347
デスクトップのクローラーのセクションは、プロジェクトなしで単発のクロールを実行できるようになりました。アドレス欄、サイト/リスト/サイトマップの切り替え、URL上限、開始/停止、チェックのタブ、アドレス検索、概要のカウンター、詳細ペイン、CSV/XLSXのエクスポートは、コアの
#1347 (GitHub の issue)crawl-site --scan-outとscan-url-queryのコマンドに接続されました。ステータスバーには、コア自身の速度、クロール済みの数、残りの数が表示されます。画面を開いても自動では開始せず、一時的な結果は「Clear」を押したとき、次のクロールの開始時、アプリ終了時に削除されます。クイッククロールのメニュー項目から、このセクションを開けます。トップバーの「Unavailable in this core version」バッジは削除しました。プロジェクトを読み込んだ後、比較画面がエラー状態で開くことはなくなりました。比較をクリアした状態は、2つのスキャンを選ぶよう促す中立的な表示になり、本当に失敗した場合だけ利用不可の表示になります。
2026年10月12日
8 追加10 変更2 修正修正動作中アップグレードとロールバックをまたぐネイティブのスキャン設定の互換性を修正#1344
既存のヘッダーとフィンガープリントを維持し、新しく有効になったオプションはバージョン付きのコンテキストに保持し、コンテキストがない場合は従来のトラッキングパラメーターの動作を保ちます。再開時には有効な設定の全体を検証し、未対応または矛盾する成果物は拒否します。
#1344 (GitHub の issue)修正動作中保持されたRDFaの検出を修正: 相対的なプロパティIRIや無関係なホストでSchema.orgとみなさないように#1344
相対的なプロパティIRIや無関係なホストでは、Schema.orgのマークアップとみなさないように修正しました。絶対的な語彙のIRIと認識済みのプレフィックスは従来どおり扱い、検索の期限テストは軽量なフィクスチャのパターンで有限に保ちます。
#1344 (GitHub の issue)変更動作中プロジェクト設定のタブをウィンドウ内に収め、追加の設定はオーバーフローメニューから開けるように#1315
プロジェクト設定のコンパクトなタブはウィンドウ内に収まり、追加の設定はオーバーフローメニューから開けます。メインのサイトしか利用できない場合は、冗長なスケジュールの選択を隠します。ウィンドウの大きさに関わらず、リンクされたサイト間の選択は保持します。 - カスタムUser-Agentのプレビューは値がある場合だけ表示し、プリセット名を実際に送信されるヘッダーのように見せないようにしました。スケジューラーに設定された遅延の上限は維持します。 - プロジェクトの更新後にオーナー用のタスク作成を再評価し、コアが検証した互換性のある競合他社の実行結果は、無関係なチェックリストの改訂をまたいで保持します。書き込みには、引き続き確認と現在の改訂の確認が必要です。 - 保持されたプロジェクトログが利用できるまではボット検証を無効にし、通常のQtテーブルモデルの呼び出しに対応しました。保存された問題の合計は、上限付きのURLサンプルや未測定のチェックとは別に表示します。 - 同梱フォントは、テーマを変えるたびに登録し直すのではなく、アプリケーションごとに1回だけ登録します。
#1315 (GitHub の issue)追加動作中CLIの標準入力経由で、プロバイダーの認証情報を書き込み専用で管理。GSC OAuthの同意、アカウントリソース検出のプレビューを追加#1343
ローカルCLIの標準入力チャンネル経由で、プロバイダーの認証情報を書き込み専用で管理できるようにしました。GSCのOAuth同意のライフサイクルを明示的に扱い、アカウントのリソース検出はプレビューのみです。プロバイダーの選択とMCPの認証情報の書き込みは、所有者による明示的な判断が必要です。 - 明示的な
#1343 (GitHub の issue)--gsc-inspectオプションを付けた場合に限り、プロジェクトに紐づくSFの出力に、上限付きのURL Inspectionの検出結果を追加しました。プロパティごとのクォータはローカルで集計し、検査履歴は保持し、許可リストに載った項目だけを記録します。SFは、計測済みのGSC、GA4、Metrika、CloudflareのURL履歴も、暗黙のプロバイダー呼び出しなしで結合します。登録されたURL単位の検出結果は通常の監査の問題の流れに入り、データが欠けている場合や一部しかない場合は、その旨を明示します。 - Cloudflareの URL単位の日次集計スナップショット、明示的なEnterprise Logpullの取り込み、呼び出し側が指定したLogpush NDJSONのインポート(ローカルのログストア経由)を追加しました。AIの設定、リダイレクトとWAFのルールセット、Logpushのジョブは、オプトインで読み取り専用に取得できます。プランによって制限される Instant Logs の取得は、別途確認を経て、短く上限付きのWebSocketセッションで行い、ローカルに保存するのは上限付きの先頭部分だけです。このルートは既存のセッションに影響を与えません。Edge APIには停止エンドポイントがないため、Cloudflareが文書化したアイドル時の失効を報告します。Logpushの配信先ストリームは顧客側の所有物であり、取り込みません。 - 現在のMoz JSON-RPCのバックリンク操作を明示的に追加しました。従来のURL指標はデフォルトのまま残し、支出の確認が不確かな領収データは、ジャーナルのレポートでnullとして扱います。 - PageSpeedのアーティファクトの要約を読み取るリーダーを追加しました。所有者を検証し、許可リストに載ったLighthouseのフィールドだけを返します。変更動作中名前付きクロールプロファイルをJSONで検査、
seo_crawl_siteで選択、プロジェクトの既定値として割り当て可能に#1299名前付きのクロールプロファイルは、検証済みのJSONとして確認でき、
#1299 (GitHub の issue)seo_crawl_siteで選択できます。プロジェクトの既定値として割り当てると、プロジェクト単位のクロールの上書き設定をその上に重ねられます。 - クロールの進捗表示は、現在わかっているフロンティアに対する時間の見積もりを表示し、クロール全体の所要時間とは別のラベルで示します。クロール対象では、デフォルトでutm_*とfbclidのパラメーターを正規化します。 - 進行中のネイティブのプロジェクトスキャンは、既存のSQLiteの復旧の仕組みを通じて、実行IDとチェックポイントを指定した一時停止と停止の要求を受け付けます。 - ホストに紐づくHTTP Basic/Digest認証と、オプトインのzstdレスポンスの協調は、環境変数の参照、明示的な承認、HTTPSのみの認証、リクエストの予算を使います。クロール結果には上限付きの負荷見積もりが含まれ、未知のディスクサイズは null のまま保持します。追加動作中プロジェクトの運用ステータス要約を追加: 収集の進行、最新スキャンの完全性、フォルダーの健全性など#1291
収集の進行状況、最新スキャンの完全性、フォルダーの健全性、主要プロジェクトの未完了タスク、最新のエージェントの活動記録、保存されたスキャンディレクトリのサイズを、運用ステータスの要約として表示します。ライブのハートビートがない場合、接続状態は「不明」のままです。
#1291 (GitHub の issue)追加動作中機械可読なコア情報のコントラクトを追加: 検証済みのビルドリビジョンと時刻、対応するCLIとMCPツール、デスクトップとの完全一致の互換性#979
検証済みのビルドのリビジョンと時刻、対応するCLIとMCPツール、リビジョンが完全一致するデスクトップとの互換性を含む、機械可読なコア情報のコントラクトを追加しました。ローカルの前提条件を確認する、読み取り専用の
#979 (GitHub の issue)doctorコマンドとMCPツールも追加しました。seohead --versionはパッケージのバージョンを表示します。 -project-observeとproject-activityに、リビジョンを考慮した不透明な条件付き読み取りを追加しました。リリースの確認は同意が必要で、wheelとソースのダウンロードはチェックサムで検証し、進捗表示とキャンセルに対応します。自動インストールはしません。追加動作中セマンティックコアのプロジェクトに、有料ステージの事前見積もりとステージごとのステータス履歴を追加#1298
有料ステージの事前見積もりと、ステージごとのステータス履歴をセマンティックコアのプロジェクトに追加しました。 - マッピングを指定したCSV/XLSXのインポートのプレビュー、対象を絞ったエクスポート、ページ分割されたクラスターの読み取り、監査可能なランディングページの選択、ローカルのエビデンスに基づくインサイトに対応しました。
#1298 (GitHub の issue)追加動作中レンダリング済みクロールにページアクションとプリセットを追加。生データとレンダリング結果の差分、ブラウザのネットワーク失敗を保持#1302
プロジェクトごとにオプトインした、上限付きのページアクションとプリセットを、レンダリング済みのクロールに追加しました。生のHTMLとレンダリング後の要素の差分、ブラウザのネットワーク失敗を保持します。キャプチャしたレンダリングのレイアウトからは、モバイルでの横はみ出し、文字サイズ、タップターゲットのサイズに関する検出結果を表示します。ファーストビューのスクリーンショット取得と、DOM表現のメタデータ(明示的に記録)を追加しました。
#1302 (GitHub の issue)追加動作中保存済みプロジェクトのスキャン根拠に、
checks_run、checks_skipped、checks_disabled、レジストリ合計の正確な状態を追加#1296保存済みプロジェクトのスキャンの根拠に、
#1296 (GitHub の issue)checks_run、checks_skipped、checks_disabledとレジストリの合計という、正確な状態を追加しました。評価されたチェック数とスキップされたチェック数は互いに重なりません。監査のカバレッジが欠けている場合は、利用不可と報告されます。 - 保存済みスキャンは、共通のCLIとMCPハンドラーを通じて、上限付きの静的/レンダリング済みHTMLの範囲を表示します。範囲には、スキャンとドキュメントの識別子、生のボディとデコード後テキストのハッシュ、完全一致URLの検出結果ページが含まれます。URL詳細には上限付きのソースHTMLの範囲が含まれ、利用不可や曖昧な根拠は明示されたままです。ボディの比較は、静的/レンダリング済みのペアと、スキャンをまたぐペアの両方に対応します。 - スキャンの状態では、整合性の状態、影響を受けたスキャンの識別子、チェックポイントの有無、null を許容する損傷件数を報告します。移植可能なプロジェクトのアーカイブでは、すべてのHTML本文を省略したり、30日または90日より古い本文だけを省略したり、認識された最新のN件のスキャンだけを残したりできます。その際も根拠のテーブルは保持されます。変更動作中保存済みスキャンのURLクエリを拡張: リンク数、title・canonical・hreflang・サイトマップのフィルター#1295
保存済みスキャンのURLクエリを拡張しました。保持されたリンク数、title、canonical、hreflang、サイトマップのフィルター、ソースを意識したファセットを追加しています。リンク、サイトマップ、hreflang、監査の測定値が欠けている場合は、0として表示せず「利用不可」のままにします。 - 保存済みの監査サマリーから、スキャン全体の重大度と、チェックごとのカウンターを追加しました。検出、非検出、スキップ、無効、利用不可のチェック状態を明示します。 - scan.v2のキャプチャまたはオフラインの再分析が完了すると、再構築可能な最短クリック深度のインデックスを保存するようになりました。古いスキャンファイルは、クエリの予算内で、保持されたリンクグラフから深度を導出し続けます。 - 保存済みのリソースの根拠に、ソースのドキュメントに紐づくリソース種別とURLのフィルター、出現回数と種別ごとの件数、保持されたバイト数の状態、ブロックと重みの集計を追加しました。宣言が利用できない場合や部分的な取得の重みは、明示されたままです。 - HTTPXがトレースイベントを出力する場合は、scan.v2で、TCP/接続、TLS、レスポンスヘッダーの待ち時間、ボディのダウンロード時間を記録するようになりました。HTTPXは名前解決を独立したイベントとして出さないため、DNSは利用不可です。その時間は接続に含まれる場合があります。保存済みの編集済みヘッダーと各フェーズの根拠を扱う、オフラインの
#1295 (GitHub の issue)headers-analyzeを追加しました。 - 一時的なSQLite集計を使う、CLI/MCPのディレクトリツリーの読み取りを追加しました。深さ、子の数、ノード数、出力バイト数に上限があります。既存の最短経路の読み取りは、scan-link-inspect --view pathで引き続き利用できます。 - 名前付きの内部被リンクと、リンク切れの送信先のビューとして、scan-link-inspect --view links --preset inlinks|broken_linksを追加しました。 - ネイティブのscan.v2の完了処理とオフラインの再分析は、任意で、ソースに紐づくインデックス付きのURLクエリ投影を作るようになりました。ページのリソース数と種別、重複タイトルのフラグ、カバレッジ、フィルターなしのファセットに使われます。読み取りでは、スキャンUUID、証拠のリビジョン、機能、開始URLが一致する完了済みスキャンだけがこれを使います。再キューは投影を無効にします。古いスキャンは、引き続き読み取り専用で上限付きのフォールバックを使い、scan.v1の移行はありません。 合成した完了スキャン(100万ページの共有HTMLと画像のフィクスチャ)では、実際の投影の生成に6.36秒かかり、ピークのRSSは400.7MBでした。5回の実行の中央値は、リソース列のページで5.23〜43.38ミリ秒、画像フィルターで60.81ミリ秒、全ファセットで5.38ミリ秒で、いずれも200/300ミリ秒の予算の範囲内です。100件の画像行は正確でした。これは合成された保存済みクエリの性能を検証したもので、実際の100万URLのクロールを検証したものではありません。内部リンクとサイトマップのファセットは明示的に利用不可のままで、ファセットの応答は部分的でした。変更動作中プロジェクトのチェックリストv4: 担当者、受け入れ基準、検出結果とメソッドのリンク、タスクコメント#1294
プロジェクトのチェックリストv4では、担当者、受け入れ基準、検出結果とメソッドへのリンク、上限付きの競合他社URL、追記のみで作成者が記録されるタスクコメントに対応しました。以前の網羅形式も引き続き読み込めます。 - 受信箱の目標を受け入れると、元の目標を説明文とした、安定したカスタムのチェックリストタスクが作成されます。受け入れ自体はタスクを実行も完了もしません。 - タスクとレポートでは、タスクごとの影響URLの測定状態を正直に表示し、カスタムタスクのKPIも表示します。保持された根拠が影響URLを列挙していない場合、件数は利用不可のままです。
#1294 (GitHub の issue)変更動作中プロジェクトのレポートにカスタムタスクの件数、担当者、受け入れ項目を追加(Markdown、DOCX、XLSX)#1297
プロジェクトに紐づくMarkdown、DOCX、XLSXのレポートに、カスタムタスクの件数、担当者と受け入れの項目、測定状態を含む影響URLの根拠(null を許容)を追加しました。
#1297 (GitHub の issue)追加動作中MCPツールカタログにカテゴリとプロジェクトの情報、オフセットページングを追加。URLチェックのバッチも追加#1312
MCPツールカタログに、カテゴリとプロジェクトを認識するメタデータ、オフセットによるページングを追加しました。また、明示的なリストまたは保持されたスキャンのページを対象とする、上限付きのURLチェックのバッチを追加しました。 - SSIMに基づく画像品質の自動判定、明示的なEXIFの削除、保持されたスキャンの画像最適化レポートを追加しました。WordPress Redirection向けのCSV出力も追加し、ローカルでリダイレクトのチェーンとループを分析します。 - 従来のクロール深度と遅延のフラグはヘルプに表示し、従来の互換性の動作は維持します。
#1312 (GitHub の issue)追加動作中整合性チェック、並べ替え、URLフィルター付きの、上限付きcompare.v2ストリーム読み取りを追加#1300
整合性チェック、並べ替え、URLフィルターに対応した、上限付きのcompare.v2ストリーム読み取りを追加しました。上限付きのMarkdownサマリーと、URL単位の変更前後のカードを生成します。未再確認の観測は「未再確認」として残します。 - 保存済みURL履歴を、ページの事実と隣接するスキャン間の差分で拡張しました。利用不可の観測と存在しない観測は、比較できないままです。 - 比較のチェックポイントと進捗のスナップショットを保存し、入力が同一の場合の再開に対応しました。検証済みの完了パッケージはキャッシュヒットとして再利用します。変更ごとの主要セグメントのスライスと、外部リンクのレスポンスコードの根拠も追加しました。
#1300 (GitHub の issue)変更動作中完全一致URLの保持済み構造化データリーダーを拡張: 上限付きのJSON-LD、Microdata、RDFa、オフラインのSchema.org検証#1304
完全一致URLの保持済み構造化データリーダーを拡張し、上限付きのJSON-LD、Microdata、RDFa、言語の根拠、ソースの系譜、ローカルでのオフラインSchema.org検証に対応しました。
#1304 (GitHub の issue)変更動作中保持されたコンテンツ検索: 文字オフセット付きの出現箇所を上限付きで表示、オフラインのカスタム抽出サンプルを追加#1301
保持されたコンテンツ検索は、ソーステキストの文字オフセット、1始まりの行番号、ドキュメントごとの一致ナビゲーション、任意で編集済みの6行のウィンドウ付きで、上限付きの出現箇所を表示するようになりました。完全一致のURLフィルターは、SQLiteが保持されたドキュメントをランク付けする前に実行されます。返される出現箇所が10,000オフセットまたは64 KiBのレコード上限で切り詰められた場合も、一致の総数は表示され続け、カバレッジは部分的と示されます。壁時計の期限を強制できない場合、正規表現検索は利用不可になります。利用できない本文は「存在しない」ではなく「不明」のままです。 - 検索インデックスのパッケージは512MiBに制限されます。上限に達した場合は、測定したカバレッジとバイト上限を付けた、明示的に不完全なパッケージを公開します。 - 呼び出し側が指定したHTMLに対する、オフラインのカスタム抽出サンプルのルートを追加しました。任意のURLはラベルとしてのみ扱い、取得は行いません。ライブのURL取得は、引き続き所有者が判断する事項です。
#1301 (GitHub の issue)変更動作中スニペット編集CSVの取り込み、ローカルのタイポグラフィの計測、保存済みスキャンからのクエリ抜粋を追加#1010
スニペット編集のCSVの行を、未適用のレビュータスクとして取り込めるようになりました。呼び出し側が指定したプロファイルに沿って、ローカルのタイポグラフィを計測します。明示的に選んだ保存済みスキャンから、ドキュメントの系譜付きのクエリ抜粋を追加しました。検索エンジンのしきい値やレンダリングについての主張は推論していません。
#1010 (GitHub の issue)変更動作中ネイティブの保存済みクロールで、保持されたレスポンス本文を比較(認識可能なContent-Typeに限定)#1013
ネイティブの保存済みクロールは、保持されたレスポンス本文を、認識可能な上限付きのContent-Typeのファミリーに限って比較します。利用不可、サイズ超過、曖昧な本文は、明示的に未測定のままです。
#1013 (GitHub の issue)変更動作中ネイティブの保持画像解析: サイズ宣言の欠落、情報的・不正な空のalt属性を検出#1303
保持画像の解析は、サイズ宣言の欠落や不正、情報的だが不正な形式の空のalt属性を報告します。有効な装飾用の
#1303 (GitHub の issue)alt=""は、そのまま保持します。alt属性がまったくない場合はARIA名を伴う検出結果として残り、目に見える装飾画像にもサイズ指定が必要です。 - 画像の検出結果は、ソース/ターゲット/ステータスの範囲、理由、ドキュメント、上限付きの順序付きの位置を保持します。本文がない場合は、画像のURLやリソースのレスポンスを作り出さず、既知のページ数の事実を保持します。画像のレスポンスエラーとバイトのしきい値は、ステータスと理由を保持します。 - 画像の選択は、再オープン後にソースページを解決します。リソースの根拠は、取得と宣言の行をソースドキュメントと並べて示します。ネイティブ画像の識別子はソースページと範囲を含むため、ページをまたぐ統合は意図的に防がれ、古いネイティブ画像のフィンガープリントは移行されます。ソースページのない従来の検出結果は、従来の識別子を保持します。繰り返し要素は、正確な件数と上限付きの位置サンプルを保持します。 - 合成のショップは元の欠陥と15件の対照を保持し、既存の商品に、情報的な空のalt属性とサイズ欠落のケースを追加しました。クロールの件数は変わりません。
2026年10月11日
16 変更変更動作中テストスイートをPython 3.15で1回だけ実行(バージョンマトリクスは廃止)、4つのテストグループと統合カバレッジを保持
古いバージョンのマトリクスの代わりに、Python 3.15で全ツールキットのテストスイートを1回実行します。検証済みのテストグループは4つ保持し、統合カバレッジも併せて記録します。CIとリリースビルドの初期化には、同じ安定版のPythonを使います。
変更動作中保持された監査チェックとネイティブのデスクトップ改善を統合
保持された監査チェックとネイティブのデスクトップの改善を統合しました。固定されたスキャンヘッダーを変えずにリソース予算の設定を維持し、安全なオフラインの再分析と再開を保持します。ネイティブのプロジェクト設定コンポーネント、テーマトークン、同梱フォントを共有します。配布ツリーから非公開のデザイン入力を削除しました。 - 修正の再確認を、元のスキャンヘッダーとソースのバイト列を保持したまま、検証済みの有効なアセットポリシーに紐づけました。
変更動作中プロジェクト設定のスケジュールとクロールを再構築、ネイティブのキャンバス部品とオフラインフォントを使用#1323
プロジェクト設定のスケジュールとクロールを、共通のネイティブキャンバス部品、オフラインのRobotoフォント、Material Symbolsで作り直しました。800pxでは1カラムのレイアウトになります。 - アプリケーションのインターフェースは全体を英語にしました。既存のスケジュールコマンドとドキュメントのコントラクトは維持し、コアが裏付けるスケジュールのデータだけを表示します。 - プロジェクト設定を開いている間も、ワークスペースの識別子とエイリアスを維持します。コアが応答している間は、重複した保存を防ぎます。
#1323 (GitHub の issue)変更動作中デスクトップのプロジェクト設定にスケジュールタブとクロールタブを追加#1322
デスクトップのプロジェクト設定に、スケジュールタブ(曜日、月の日付、実行時間帯、タイムゾーン、競合他社)とクロールタブ(クロールモード、User-Agentのプリセットまたはカスタム文字列、リクエスト間の待機時間、URL予算、SpiderHeadBotまたはカスタムのUser-Agent)を追加しました。どちらもコアを通じてプロジェクトを読み書きし、プロジェクトの概要には次回と前回のスケジュール実行が表示されます。--tray モードは、コアの実行予定のスキャンを実行し、スキャン中だけMacのスリープを防ぎます。
#1322 (GitHub の issue)変更動作中ネイティブ監査で、保持HTMLからレンダリングをブロックするheadのマークアップを表示。バイト予算、JS/CSSカバレッジ、Lighthouse JSONの受け入れを追加#1303
固定されたscan.v1スキーマを変えずに、完全な保持HTMLから、レンダリングをブロックするheadのマークアップをネイティブ監査で表示するようになりました。不完全なボディや予算で切り詰められたボディは利用不可のままです。既存のheadリソースの検出とSFのカスタム抽出の入力を再利用します。 - ネイティブの観測ナビゲーションと、個別のリソースのバイト予算を設定可能にしました。保持されたscan.v2の根拠から、キャッシュ/フォント配信のシグナル、圧縮、レガシースクリプトのヒューリスティック、同一ページ内のスクリプトの完全一致の重複を追加しました。取得していないデータと、不完全な実行時のペイロードは明示されたままです。レスポンシブな宣言は、実行時の重みとして合算しません。HTMLだけの下限値、スカラーのカバレッジ件数、フォントのサンプル、ソースの要約は、明示的かつ上限付きで保持されます。 - 要求されたレンダリングでは、ChromiumのJS/CSS精密カバレッジを上限付きで収集し、UTF-16の使用状況の要約と、レンダリングされた画像のサイズ指定の検出結果を保持します。再オープン後やオフライン再分析の後にも読み取ります。対応していないエンジンや測定値がない場合、それが「クリーン」な結果になることはありません。 - 保持されたscan.v2の根拠から、LCPの検出、依存ツリー、レイアウトシフトの原因、画像配信、強制リフロー、スクリプト実行の検出結果のために、上限付きで一致するURL単位のLighthouse JSONを受け付けます。取得元と入力ハッシュの出所を保持します。Lighthouseプロセス、有料プロバイダー、フィールドCWVの推論は追加していません。レジストリ、SFのカバレッジ、生成された参照ドキュメントを更新しました。 - 追加のアセットのしきい値は、固定されたネイティブのスキャンヘッダーには含めず、検証済みのバージョン付きの実行コンテキストに正確な値を保存します。再開時はこれらの値を別々に比較し、オフライン再分析では保持された根拠から復元します。古い軽量リーダーは、変更されていないヘッダー設定の形式を引き続き読み取れます。
#1303 (GitHub の issue)変更動作中既存のスキャンのコンテキスト行に、ドキュメント単位のAMPとアクセシビリティの根拠を保持。Schema.org(Microdata・RDFa)の検証とJSON-LDの提供を追加#1304
固定された
#1304 (GitHub の issue)scan.v1のSQLスキーマを変えずに、既存のスキャンのコンテキスト行に、ドキュメント単位の静的なAMPとアクセシビリティの根拠を保持するようになりました。構造的なAMPの検出結果は、元のdoctype、head/body、UTF-8のcharset、viewport、ランタイムのスクリプト、定型的な宣言を検査します。AMPのルートマーカーがないAMPのペアのターゲットは、別に識別します。AMPの完全なバリデーターのルールは、ライセンスの判断が決まるまで利用できません。 - ドキュメントの言語、フォームのラベル、画像の代替テキスト、見出しの飛び、メインのランドマークについて、アクセシビリティの検出を始めました。検出結果には上限付きの例と、出現件数の全体が保持されます。計算されたコントラストとレンダリングされたaxe-coreのルールは、引き続き未測定です。 - Schema.orgのMicrodataと一般的なRDFaの主語とプロパティを、同梱の語彙と既存のリッチリザルトのルールで検証します。保持されたURL単位のエラー、警告、欠けている必須プロパティは、ネイティブの検出結果になります。サポートされていないRDFaの構文は、明示的な部分的な根拠として扱い、クリーンな検証結果にはしません。 -scan-structured-blocksでは、解析済みのJSON-LDツリーを、各ブロックのソース、位置、構文エラーとともに提供します。幅の広いプロパティのツリーには上限をかけ、その上限を表示します。スキャンを変えずに、要求されたURLと表現について最新のドキュメントを読み取ります。 - 部分的または利用不可の構造化データの根拠は、確認済みの隣接するエラーを隠さずに保持します。サポートされるJSON-LDの識別子は、HTMLマークアップと同じドキュメントのベースに対して解決しつつ、元のJSONを保持します。スカラーや空のJSONブロックは有効なグラフとは見なしません。また、パーサーと提供する投影の間で、正規化されたライブのJSON-LDタグの選択を共有します。変更動作中生のcanonicalとページネーションの属性を、バージョン付きのドキュメントコンテキストとして保持(scanのSQLは変更なし)#1305
固定されたスキャンのSQLを変えずに、生のcanonicalとページネーションの属性を、バージョン付きのドキュメントコンテキストとして保持するようになりました。未対応のhreflang、lang、media、typeの属性を持つcanonicalリンク、不正な注釈、ドメインやプロトコルをまたぐ宣言は、根拠に紐づく検出結果として表示されます。認識されない正しい形式の関係キーワードは、未分類のままです。 - 上限付きの同一ホストのターゲットプローブを、ページネーションにも広げ、測定した noindex と canonical の観測を保持します。ネイティブのcanonicalチェーンと、canonical/hreflangのnoindexの検出結果は、プローブを利用できます。ステータスだけのレガシープローブは読み取れますが、HTMLのディレクティブについては未測定のままです。 - 不透明なネイティブのページネーションチェーンを判定し、明示的な相互の next/prev の矛盾を検出します。番号と刻みのルールを保持し、名前付きの未判定の状態も残します。保存された検出結果のURL(グループのメンバーを含む)は、一時的なSQLiteテーブルを使い、audit.v2の根拠をストリーミングで返す scan-url-query で選択します。 - 認識されない Unicode と句読点を含む関係トークンは未分類のままにします。同等のIDNとデフォルトのポートを持つcanonicalの権威部は正規化し、ネイティブのページネーションのターゲットパスは正確に保持します。読み取れない混在のページトークンは未判定のままです。ショップのページネーションの欠陥は、1ページ目のURLに番号がなくても検出されます。 - ショップのフィクスチャは、宣言された next/prev の注釈を表示するようになりました。これにより、D41のページネーションの正解データが実際に提供され、ネイティブのキャプチャで検証できます。
#1305 (GitHub の issue)変更動作中サーバーログ: ボットIPの正確な合計をディスクに保持(上限付きのサンプルは廃止)。DNS検証とプロジェクトログのインポートを追加#1311
サーバーログは、上限付きのサンプルではなく、ボットIPの正確な合計をディスク上に保持するようになりました。IPごとのレコード、訪問件数、最終訪問、サブネットのフィルターには上限があります。明示的なDNS検証では、選択された各IPを個別に確認し、PTRと正引きの根拠を記録します。IPv6に対応し、利用不可や期限切れの結果は未確認として残します。ローカルのキャッシュは1時間で期限切れになります。読み取りでDNSが実行されることはありません。 - ローカルのプロジェクトログのインポート、ページ分割されたサマリー、ボットの根拠、ネイティブスキャンとの結合のコマンドを、共通のCLIとMCPのハンドラーを通じて追加しました。別々のログのアーティファクトは、日付のパーティションとソースのカバレッジ、出所を保持し、固定されたスキャンのスキーマは変えません。ログが欠けている、または不完全な場合は、不在の結論を出しません。デスクトップのログ画面は、別の表示の後続作業として残しています。
#1311 (GitHub の issue)変更動作中ネイティブの保持監査: 壊れた内部リンクを観測ターゲットごとにグループ化、リダイレクトチェーンとループを記録、XMLサイトマップ生成を追加#1306
保持されたネイティブ監査は、壊れた内部リンクを観測されたターゲットごとにグループ化し、ソースとアンカーの根拠を付けます。リダイレクトのチェーンとループは、各ホップのステータスとともに記録します。パスベースの内部検索と空のアンカーを区別し、キャプチャ時にレスポンスが得られなかった外部リンクの結果を表示します。サイトマップとrobotsの整合性の検出は、保持されたメンバーシップとレスポンスの根拠を使い、ライブでの再取得はしません。欠けている根拠や部分的な根拠は、明示されたままです。 - 保存済みスキャンのリンクグラフを、位置、セクション、ローカルな近傍のフィルターで上限付きに追加しました。セクション単位の集計と、スキャン間のエッジの変化も扱います。オフラインの再分析では、再開可能な派生バッチで位置を補完し、分類されていない根拠をリンク調査とスキャンの状態に報告します。固定された scan.v1 スキーマは維持されます。 - 正規のインデックス対象である、保持された200のページから、観測されたlastmod、除外、プロトコルごとの分割、サイトマップインデックス、任意の画像サイトマップを含むXMLサイトマップをローカルで生成できるようにしました。CLIとMCPは同じ実装を共有します。出力には新しいローカルのディレクトリが必要で、ファイルを公開することはありません。 - 後のサイトマップやシードの処理で、取得済みのカタログにURLが追加された場合でも、キャプチャ時に存在しなかった検出ターゲットを保持します。説明済みで未解決、または除外された根拠は変更しません。既知のターゲットとして主張されたものと、null以外の識別子の不一致は、引き続き無効です。 - クロール済みページとして保存されていないリソースでも、既知の非200のリソースのレスポンスは画像サイトマップから除外します。測定されていない画像のレスポンスは、部分的なカバレッジとして扱います。
#1306 (GitHub の issue)変更動作中Google DataForSEOの本番呼び出しをゲート化、USD上限の強制、被リンクのdisavowエクスポートを追加#1310
Google DataForSEOの本番呼び出しは、クライアントを生成する前にゲートをかけます。提供されたプロバイダー価格からオフラインの見積もりを表示し、SERPの深さと検索演算子の料金を考慮します。既知の1回の呼び出しあたりのUSD上限を、転送の前に強制します。上限付きのバックリンクインデックス操作を拡張し、欠けている費用や不正な応答の形式は、不確かな領収データとしてジャーナルに記録します。プロジェクトと月ごとの通貨上限は、所有者の判断待ちです。 - 明示的な被リンクのソースとインポートの根拠を、relトークンの完全な観測、アンカー、参照ドメイン、フィルター、透明なスパムのレビュー信号とともに、非公開のローカル履歴のスナップショットにマージします。自動送信はせず、プロファイルとレビュー済みのdisavowエクスポートを行うCLI/MCPのルートを追加しました。 - 保持されたネイティブの根拠から、混在するrelトークンと、外部へのスポンサー表示の開示に関するレビュー通知を追加しました。文脈が利用できない情報は保持し、HTMLの母集団がまったく解析されない場合は件数をnullとします。レポートと提供元の確認では、保持されたスキャンのスキーマを変えずに、sponsored/ugc/nofollowの区分を扱います。
#1310 (GitHub の issue)変更動作中ネイティブのDOM・重複チェックが、完全一致URLで各ページの選択された保持ドキュメントを読み込むように。SimHash/LSHによる近似重複の検出を追加#1307
ネイティブのDOMと重複のチェックは、完全一致のURLで各ページの選択された保持ドキュメントを読み込み、レスポンスと本文の系譜を検証します。保持が無効、欠けている、不正、または予算を超える本文は、明示的な除外として残ります。部分的な検出結果にはカバレッジが付きます。本文領域の完全一致ハッシュと、上限付きのSimHash/LSHの検出結果は、SFのHTMLディレクトリを必要とせず、ネイティブ監査に保存されます。しきい値に応じて調整されるLSHのバンドは、条件を満たすペアの再現率を保ちつつ、広すぎる候補バケットを減らします。近似分析の予算を使い切っても、完全一致ハッシュの検出結果は失われません。 - SFの監査では任意で、意味的類似度と、タイトル/H1と保持された本文のレビューを実行できます。使うのは、明示的に指定されたローカルのアダプターか、宣言された埋め込みのみです。モデルやプロバイダーは自動では選びません。アダプターの識別子、ソースのハッシュ、スコア、上限、除外は、レビュー候補とともに示されます。意味的類似度は、重複コンテンツ、クエリとの関連性、カニバリゼーションを主張しません。実際のアダプターが選ばれて検証されるまで、SFの2つの意味的カバレッジの行はギャップのままです。外部プロバイダーの許可には、リテラルの真偽値
#1307 (GitHub の issue)trueが必要です。真の文字列や整数では、埋め込み呼び出しは許可されません。変更動作中受信箱の参照で目標ID(
inbox:<uuid>)を指定可能に。未実行の手動チェック項目の状態と、Issuesのチェック別件数・ページングを追加#1314受信箱の参照で目標のID(
#1314 (GitHub の issue)inbox:<uuid>)を指定できるようになりました。メモが関係する目標を引用できます。 - 一度も試行されず、手動のチェック項目は、状態reviewではなくnot_runと表示されます。判断待ちの試行だけがreviewのままです。 - Issuesの読み取りモデル(observeの検出結果の根拠)は、チェックごとの件数(by_check)と、最初の20件の後のnext_offsetを返します。残りはfindings_pageでページ送りできます。変更動作中スケジュールされたプロジェクトスキャン(#1322、コア):
schedule.json#1322によるサイトごとの独立したスケジュール、既定のUser-AgentをSpiderHeadBotに変更
各プロジェクトディレクトリの
#1322 (GitHub の issue)schedule.jsonに、サイトごとの独立したスケジュールを保存します。曜日や日付、サイトのタイムゾーンでの時間帯、有効/無効、クロールモード(spider/sitemap/list)、実行ごとのURLとリクエストの予算、礼儀としての遅延、User-Agent、プロジェクトからの相対的なスライスの再開状態を含みます。オーナーのプロジェクトには、それぞれ独自の頻度とスキャンポリシーを持つ競合他社をリンクできます。設定はexpected_revisionを付けてschedule-set/seo_schedule_setで編集します。schedule-showは、主要サイトとリンクされた競合他社の実行予定の状態と次回の実行を報告します。schedule-run-dueはヘッドレスの入口で、独立して実行予定のスキャンだけを実行します。各実行が終わるまでプロセス単位のロックを保持し、キャンセルの状態を再送出の前に記録し、結果または競合の重なりを、影響を受ける各プロジェクトに記録します。schedule-installとschedule-uninstallは、明示的に呼び出されたときだけ launchd のplist、cronの行、Task Schedulerのコマンドを書き込み、または削除します。 - クロールのUser-Agentは、プリセット(spiderhead、googlebot、googlebot-desktop、googlebot-smartphone、bingbot、yandexbot、yandexmobilebot、baiduspider、duckduckbot、applebot、gptbot、claudebot、perplexitybot、そしてデスクトップとモバイルのブラウザ)か、任意の1つのカスタム文字列から選べます。デフォルトはSpiderHeadBot/<version> (+https://github.com/PavloSEO/spiderhead)になり、robots.txtのグループの照合も同じ識別子を使います。以前のSEOHEAD-Toolsのrobotsグループに一致していたサイトは、ルールにSpiderHeadBotを指定する必要があります。変更動作中
workflow-startは承認済みの所有者の目標だけで実行可能に(--goal-idまたは#1314context.goal_id)。チェックリストの母集団を部分指定可能に、サイトマップのフォールバックを追加
#1314 (GitHub の issue)workflow-startは、承認済みの所有者の目標があれば実行できます。--goal-id(またはcontext.goal_id)で十分です。登録されたプロンプトのデフォルトはskill:workflow/full-audit-v1、チェックリストのタスクのデフォルトは、目標を受け入れたときに作られたタスク(custom:goal-<entry>)です。拒否される場合は、欠けているリンクを解消するオーナーのコマンドを示します。オプションはseohead workflow-start --helpに記載されています。 - チェックリストの母集団は部分的なオブジェクトを受け付けます。必要なのはkindとsourceだけで、他のキーは未設定がデフォルトです。拒否された母集団は、欠けている、または未知のキーを示します。 - ネイティブのプロジェクトクロールは、robots.txtにサイトマップが宣言されていない場合、オリジンの/sitemap.xmlにフォールバックします。フォールバックが存在しない場合は不完全として記録されますが、クロールは中断されません。変更動作中競合他社のワークスペースは入力URLを保持し、
wwwのURLからクロールを開始。所有者のチェックリストは変更しない#1314競合他社のワークスペースは、入力されたURLをそのまま保持します。競合他社のクロールは、ベアホストではなく、その
#1314 (GitHub の issue)wwwのURLから開始します。競合他社のURLのクロールは、所有者のチェックリスト項目をマークしなくなりました。結果は、競合他社自身のワークスペースにだけ記録されます。破損した競合他社のワークスペースを持つプロジェクトを開くと、その競合他社は失敗するのではなく、利用不可として報告されます。変更動作中
report-build --projectでチェックリストのスナップショットをレポートに紐づけ(xlsx、docx、csv、md、PDF)。URLの予算で止まったスキャンを受け入れ
プロジェクトのチェックリストのカバレッジが、ストリーミングされたaudit.v2レポートに紐づくようになりました。
report-build --projectとaudit-workflow --action reportは、チェックリストのスナップショットを xlsx、docx、csv、md、PDFの概要出力に添付します。紐づかないレポートを作ることはなくなりました。URLの予算で止まったスキャン(stopped_by_budget)は、プロジェクトの最新の監査済みスキャンとして受け入れられ、そのレポートは限定された範囲を示します。report-build --inputはformatキーを受け付けます。ストリーミングの監査に対するreport-build --project --format jsonは、JSONが逐語的に書かれ、チェックリストのスナップショットを含められないため、理由を示して拒否されます。
ロードマップ
未完了 108 件GitHub の未完了マイルストーン。各行は未解決の Issue で、計画中の作業です(未リリース)。
デスクトップの基本
まずデスクトップを動かす: ブロッカー、800×600 表示、機能しないタブ、正直な状態表示(デスクトップ計画の第 1 波)
- 追加予定Windows: ネイティブクロール、プロジェクトジャーナル、Desktop ビルドの失敗、Desktop の空白ウィンドウ大量発生と 4K 環境での使用不能#1345 (GitHub の issue)
デスクトップの同等化
定番の UX パターン: タブ、フィルターごとの列、概要からの掘り下げ、レイアウトの保持(エピック #1522)
クロールエンジン
礼儀正しいクロールと robots ポリシー、リトライ、予算、URL 発見、ストレージの規模、スキャンのライフサイクル(エピック #1520)
- 追加予定WAF が robots.txt に 403 を返すと、robots-check が「no robots.txt (crawl allowed)」と報告する問題#1364 (GitHub の issue)
- 追加予定curl では 200 を返す Cloudflare 配下の Shopify ストアフロントに対し、HTTP クライアントが全リクエストで 403 を受け取る問題#1363 (GitHub の issue)
分析とデータ項目
読みやすさ、ベクトルと意味的特徴、URL ごとの項目、チェックの網羅、サマリー(エピック #1521)
プロジェクトとワークフロー
サイト担当者向けワークフロー: タスク、エクスポート、定期レポートとその配信(エピック #1314)
リブランド
seohead → spiderhead への名称変更: CLI、パッケージ、環境、ドキュメント(#1523)
CLI と MCP のインターフェース
分かりやすいエラー、実用的なヘルプ、上限付きの読み取り出力、MCP トランスポート(エピック #1410 #1421)
AI レイヤー
seo_ai_column 上で SEO 要素ごとにプロンプト対象を設定、プロバイダーに依存しない(#1524)
エンジニアリング品質
巨大ファイルのモジュール分割と依存方向の整理(#1514 #1515)
Distribution: installers & one-command install
Sales-readiness theme: native installers per OS, our own package name, and a one-command CLI install. Being ready to ship is the point of this milestone.
- 追加予定Ship native installers: DMG (macOS), Linux (AppImage/deb), Windows installer#1556 (GitHub の issue)
3.1.0
SEOHEAD Tools からの改名後、最初のタグ付きリリース2026年10月11日455 件 · SEOHEAD Tools からの改名後、最初のタグ付きリリース138 追加275 変更42 修正
2026年10月11日
5 追加54 変更2 修正変更動作中プロジェクト設定のスケジュールとクロールを、共通のネイティブキャンバス部品、オフラインのRobotoフォント、Material Symbolsで再構築#1323
共通のネイティブキャンバス部品、オフラインのRobotoフォント、Material Symbolsを使って、プロジェクト設定のスケジュールとクロールを再構築しました。800pxでは1カラムのレイアウトになります。
#1323 (GitHub の issue)変更動作中アプリケーションのインターフェースを英語に統一。既存のスケジュールコマンドとドキュメントのコントラクトは維持し、コアが裏付けるスケジュールのデータだけを表示#1323
アプリケーションのインターフェース全体を英語にしました。既存のスケジュールコマンドとドキュメントのコントラクトは維持し、コアが裏付けるスケジュールのデータだけを表示します。
#1323 (GitHub の issue)変更動作中プロジェクト設定を開いている間もワークスペースの識別子とエイリアスを維持。コアの応答中は重複保存を防止#1323
プロジェクト設定を開いている間も、ワークスペースの識別子とエイリアスを維持します。コアが応答している間は、重複した保存を防ぎます。
#1323 (GitHub の issue)変更動作中デスクトップのプロジェクト設定にスケジュールタブとクロールタブを追加#1322
デスクトップのプロジェクト設定に、スケジュールタブ(曜日、月の日付、実行時間帯、タイムゾーン、競合他社)とクロールタブ(クロールモード、User-Agentのプリセットまたはカスタム文字列、リクエスト間の待機時間、URL予算、SpiderHeadBotまたはカスタムのUser-Agent)を追加しました。どちらもコアを通じてプロジェクトを読み書きし、プロジェクトの概要には次回と前回のスケジュール実行が表示されます。--tray モードは、コアの実行予定のスキャンを実行し、スキャン中だけMacのスリープを防ぎます。
#1322 (GitHub の issue)変更動作中スケジュール実行のプロジェクトスキャン(#1322、コア):
schedule.json…#1322スケジュール実行のプロジェクトスキャン(#1322、コア)では、プロジェクトフォルダーの
#1322 (GitHub の issue)schedule.jsonにスケジュールを保存します。曜日または日付、サイトのタイムゾーンでの実行時間帯、有効・無効の切り替え、競合サイト、クロールモード(spider/sitemap/list)、実行ごとのURLとリクエストの上限、ポライトネスの待機時間、前回の途中で止まったクロールを再開するスライスモードを指定できます。編集はexpected_revisionを付けてschedule-setまたはseo_schedule_setで行います。schedule-showでは前回の実行と次回の実行時間帯を確認できます。schedule-run-dueはヘッドレスの入口で、期限が来たスキャンだけを実行し、リースで重複実行を防ぎ、すべての判断をプロジェクトのジャーナルに記録します。schedule-installとschedule-uninstallは、明示的に呼び出したときだけ、launchdのplist、cronの行、タスクスケジューラーのコマンドを作成または削除します。変更動作中クロールのユーザーエージェント(#1322):
spiderhead、googlebot、googlebot-desktopなどのプリセット#1322クロールのユーザーエージェント(#1322)には、プリセットとして
#1322 (GitHub の issue)spiderhead、googlebot、googlebot-desktop、googlebot-smartphone、bingbot、yandexbot、yandexmobilebot、baiduspider、duckduckbot、applebot、gptbot、claudebot、perplexitybot、デスクトップとモバイルのブラウザがあり、任意の文字列を1つ指定することもできます。既定値はSpiderHeadBot/<version> (+https://github.com/PavloSEO/spiderhead)になりました。robots.txtのグループの照合も同じ識別子を使います。以前のSEOHEAD-Toolsのrobots.txtグループに一致していたサイトは、ルールでSpiderHeadBotを指定する必要があります。変更動作中保存済みのプロジェクトクロールが、測定した自動チェックリスト項目に結果を記録するように#1314
保存済みのプロジェクトクロールは、測定した自動チェックリスト項目に結果を記録するようになりました。有効なチェック項目は、次の3つのいずれかになります。保存された監査でそのチェックが実行された場合は
#1314 (GitHub の issue)succeededで、根拠としてスキャンを保持します。クロールがそのチェックをスキップまたは無効にした場合はunavailableで、クロールの理由を保持します。監査がそのチェックに触れていない場合はunmeasuredです。unmeasuredの項目は以前の記録を保持し、checklist_evidenceに名前付きで報告されるため、0として扱われることはありません。クロールが失敗または中断した場合は、自動チェックを失敗理由付きのfailedにします。prepareフローも同じ記録処理を使うようになりました。以前は独自にループを持っていました。チェックリストが初期化されていないプロジェクトは、理由を明示してスキップされます。変更動作中競合ワークスペースは入力どおりのURLを保持し、クロールは
www付きURLから開始#1314競合ワークスペースは、入力されたURLをそのまま保持します。競合のクロールは、裸のホストではなく、
#1314 (GitHub の issue)www付きのURLから開始されます。競合URLのクロールは、オーナー側のチェックリスト項目をもう更新しません。結果は、競合自身のワークスペースにだけ記録されます。破損した競合ワークスペースを持つプロジェクトを開くと、その競合は失敗せずに利用不可として報告されます。変更動作中競合候補をCLIとMCPから記録、一覧表示、削除できるように#1314
競合候補は、CLI(
#1314 (GitHub の issue)project-competitors-add、project-competitors-list、project-competitors-remove)と、対応するseo_project_competitors_*のMCPツールから記録、一覧表示、削除できます。各候補は入力されたURLを保持します。www付きのホストも同じです。wwwありとなしのホストは、重複チェックでは同じサイトとして扱います。www付きホストの競合があっても、準備処理が止まることはなくなり、project-observeも失敗しなくなりました。変更動作中
--max-urlsがクロールのページ数上限に#1314
#1314 (GitHub の issue)--max-urlsはクロールのページ数上限になりました。明示的なページ数上限を指定すると、未設定のリクエスト数と時間の上限を補完します(1ページあたり3リクエスト、2秒)。そのため、50〜300ページのクロールはapprove_large_crawlなしで実行できます。プロジェクトの閾値を超える上限は、引き続き拒否されます。変更動作中URL上限による意図的な停止は、
finish_reason付きで完了として保存#1314URL上限による意図的な停止は、
#1314 (GitHub の issue)interruptedで終了時刻なしとして保存されるのではなく、finish_reasonがstopped_by_budget、finished_atに終了時刻が入った完了済みのキャプチャとして保存されるようになりました。キューに残ったURLは、再開のために保持されます。変更動作中競合URLは、ホストを入力どおりに保持(例:
www.)#1314競合URLは、ホストを入力どおりに保持します(例:
#1314 (GitHub の issue)www.は残ります)。以前のようにホストを省いて保存されることはなくなりました。変更動作中デスクトップアプリが、クリップボードや1サイトずつ競合サイトを追加できるように#1314
デスクトップアプリは、クリップボードから、または1サイトずつコア経由で競合サイトを追加できます。サイトごとのURL上限を設定でき、競合のスキャンは並列に開始します。競合が「スキャン済み」と表示されるのは、完了して保持されたスキャンがあるときだけです。
#1314 (GitHub の issue)変更動作中ネイティブスキャンがHSTS、混在コンテンツ、構造化データを自身の保存済み根拠から測定#1314
ネイティブスキャンは、HSTS、混在コンテンツ、構造化データを、自身が保存した根拠から測定するようになりました。そのため、SFエクスポートが欠けていたり古かったりしても、これらが不足していると報告されることはありません。
#1314 (GitHub の issue)duplicate-checkは、比較したペアが0件の実行を未測定としてマークします。サイト全体に共通するテンプレートの検出結果(同じヘッダーの見出しや低いテキスト比率など)は、ページ数を付けた1件にまとめられます(#1314)。変更動作中オーナーの目標を承認すると、その目標のチェックリストタスクだけを追加#1314
オーナーの目標を承認すると、その目標のチェックリストタスクだけが追加されます。組み込みカタログ全体を
#1314 (GitHub の issue)coverage.jsonに反映することはなくなりました。組み込みの行は、触れられたときに必要に応じて追加されます。変更動作中使用中のチェックリストは、ロックの保持者(実行中のネイティブクロールとそのpidなど)を明示#1314
チェックリストがビジー状態のとき、ロックを残骸と呼ぶのではなく、現在の保持者(例: 実行中のネイティブクロールとそのpid)を示すようになりました。ロックには書き込み元のpidを記録します。生きている保持者がいないロックは、引き続き残骸として報告されます。
#1314 (GitHub の issue)変更動作中失敗・利用不可・スキップ・中断したステップで止まったワークフローも再開可能に#1314
失敗、利用不可、スキップ、中断のいずれかのステップで止まったワークフロー実行も、引き続き再開できます。後続の保留中のステップは、成功以外の結果となったステップを飛び越えてチェックポイントを記録できる場合があります。ステップは登録された順序どおりにチェックポイントを記録する必要があります。中断された実行は、それ以上のステップを受け付けません。
#1314 (GitHub の issue)変更動作中エージェントの記録したレビューで、手動・成果物の項目が完了扱いにならないように#1314
その項目は、オーナーの承認、またはエージェント以外のレビュー担当者による確認を待つ状態のままです。
#1314 (GitHub の issue)変更動作中インボックスの参照で目標ID(
inbox:<uuid>)を指定可能に#1314インボックスの参照に目標ID(
#1314 (GitHub の issue)inbox:<uuid>)を指定できるようになりました。これにより、メモが関係する目標を参照できます。変更動作中未実行の手動項目は、状態が
not_runと表示される#1314一度も試行されておらず手動の項目は、状態が
#1314 (GitHub の issue)reviewではなくnot_runと表示されます。判断待ちの試行だけがreviewのままです。変更動作中Issuesの読み取りモデルが、チェックごとの件数と次のオフセットを報告(
observeの検出結果)#1314Issuesの読み取りモデル(
#1314 (GitHub の issue)observeの検出結果の根拠)は、チェックごとの件数(by_check)を報告します。最初の20件の後にはnext_offsetを返し、残りの検出結果はfindings_pageでページ送りできます。変更動作中ネイティブクロールのチェック(#1314): 画像サイズ(
IMG_OVER_KB)をクロール自身の取得結果から測定#1314ネイティブクロールのチェック(#1314)では、画像サイズ(
#1314 (GitHub の issue)IMG_OVER_KB)をクロール自身の画像取得から測定し、サイトマップの状態(SITEMAP_URL_4XX_5XX、SITEMAP_URL_3XX、SITEMAP_URL_NON_INDEXABLE)は、サイトマップに載っている各URLに対するクロール自身の取得結果から測定します。クロールがリクエストしていないサイトマップのURLは、問題なしとしてではなく未測定として数えられます。IMG_MISSING_ALT、IMG_MISSING_DIMENSIONS、HREFLANG_ERRORについては、ネイティブスキャンでは、SFエクスポートの定義どおりにはクロールで測定していないと明示します。SFのフィルターを案内する代わりです。hreflangと混在コンテンツの根拠が欠けている場合は、SFエクスポートの欠落ではなく、ネイティブクロールでは測定されていないと報告されます。変更動作中プロジェクトジャーナル(#1314): すべてのイベントを log.md に1行ずつ記録#1314
プロジェクトジャーナル(#1314)では、すべてのプロジェクトイベントを、
#1314 (GitHub の issue)log.mdに1行の箇条書きとしても記録するようになりました。コアは、完了したクロール(scans)、作成されたプロジェクトレポート、チェックリストの試行(agent)について、自動的にエントリーを記録します。エントリーはevents.jsonlに保存され、project-event-pageで読み取られます。自動の仕組みが、対象となるクロール、レポート、チェックリストの手順を失敗させることはありません。project-event-appendとseo_project_event_appendはインターフェースを維持したまま、log.mdの行を追加します。変更動作中ネイティブクロールがチェックで使うセキュリティヘッダーを保存するように#1314
ネイティブクロールは、チェックが読み取るセキュリティヘッダー(
#1314 (GitHub の issue)Strict-Transport-Security、Content-Security-Policy、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy)を保存するようになりました。以前は取り込み時に破棄されていたため、HSTSを送信しているサイトでも欠落として報告されていました。Set-Cookieヘッダーは、フラグ(secure、httponly、samesite=)だけを保存し、Cookieの名前や値は保存しません。同じページで複数回送られたセキュリティヘッダーは、DUPLICATE_SECURITY_HEADERとして報告されます。変更動作中
workflow-startは承認済みの目標と、--goal-idかcontext.goal_idだけで実行可能に#1314
#1314 (GitHub の issue)workflow-startには、承認済みのオーナー目標があれば十分です。--goal-id(またはcontext.goal_id)を指定するだけで足ります。登録済みのプロンプトは既定でskill:workflow/full-audit-v1になり、チェックリストのタスクは、目標の承認で作成されたタスク(custom:goal-<entry>)が既定になります。拒否された場合は、不足しているリンクを補うオーナーのコマンドを示します。オプションはseohead workflow-start --helpに記載されています。変更動作中チェックリストの対象は、
kindとsourceだけで指定可能に#1314チェックリストの対象(population)は、部分的なオブジェクトを受け付けるようになりました。必須なのは
#1314 (GitHub の issue)kindとsourceだけで、他のキーは未設定が既定値です。拒否された場合は、不足しているキーや不明なキーを名前で示します。変更動作中robots.txtにサイトマップの記載がないとき、ネイティブクロールは
/sitemap.xmlを参照#1314robots.txtにサイトマップの記載がない場合、ネイティブのプロジェクトクロールは、オリジンの
#1314 (GitHub の issue)/sitemap.xmlにフォールバックします。フォールバック先が存在しない場合は不完全として記録されますが、クロールは中断されません。変更動作中サーバーログのボットIP集計を、上限付きのサンプルではなく正確なディスク保存の全件に#1311
サーバーログは、上限付きのサンプルではなく、ディスクに保存された正確なボットIPの集計を保持するようになりました。IPごとのレコードには上限があり、訪問数、最終訪問、サブネットによるフィルターも上限付きです。明示的なDNS検証では、選択された各IPを個別に確認し、PTRと正引きの根拠を記録し、IPv6に対応します。利用不可や期限切れの結果は、未確認として保持します。ローカルのキャッシュは1時間で期限切れになります。読み取り時にDNSの問い合わせが発生することはありません。
#1311 (GitHub の issue)追加動作中プロジェクトのローカルログの取り込み、集計、ボットの根拠、ネイティブスキャンとの結合コマンドを追加#1311
CLIとMCPの共通ハンドラーを通じて、プロジェクトのローカルログの取り込み、ページ分割された集計、ボットの根拠、ネイティブスキャンとの結合コマンドを追加しました。ログの成果物は、固定されたスキャンのスキーマを変えずに、日付によるパーティションとソースのカバレッジ・出所を保持します。根拠が欠けているか不完全な場合は、「存在しない」という結論を出しません。デスクトップのログ画面は、別途の表示対応として残っています。
#1311 (GitHub の issue)変更動作中Google DataForSEOの本番呼び出しをクライアント生成前に制限し、オフライン見積もりを提供#1310
Google DataForSEOの本番呼び出しは、クライアントを生成する前に制限するようになりました。提供されたプロバイダー価格からオフラインの見積もりを出し、SERPの深さと検索演算子の課金を考慮します。1回の呼び出しあたりのUSD上限が分かっている場合は、送信前に強制します。被リンクインデックス操作は上限付きで拡張され、欠けているコストや形式の不正な応答は、確実ではない記録としてジャーナルに残します。プロジェクト単位・月単位の通貨上限は、オーナーの判断待ちです。
#1310 (GitHub の issue)変更動作中被リンクの取り込み根拠を非公開のローカル履歴スナップショットに統合し、否認ファイルのエクスポートを追加#1310
明示的な被リンクのソースと取り込みの根拠を、非公開のローカル履歴スナップショットに統合します。rel トークンの観測を完全な形で含み、アンカー、参照ドメイン、フィルター、透明性のあるスパム審査シグナルも含みます。CLIとMCPのプロファイルと、審査済みの否認(disavow)エクスポートの経路を追加しました。自動送信は行いません。
#1310 (GitHub の issue)追加動作中ネイティブの根拠で、混在したrelトークンとスポンサー表示の審査通知を追加#1310
保持されたネイティブの根拠から、混在したrelトークンとアウトバウンドのスポンサー表示について審査通知を追加します。利用できなかった文脈は保持し、まったく解析できなかったHTMLの母集団では件数をnullとします。レポートと被リンク元(donor)のチェックでは、sponsored、ugc、nofollowのクラスを表示します。凍結された保持スキャンのスキーマは変更しません。
#1310 (GitHub の issue)変更動作中DOMと重複チェックが、各ページの保持文書を正確なURLで読み取るように#1307
ネイティブのDOMチェックと重複チェックは、各ページで選択された保持文書を正確なURLで読み取るようになりました。その際、検証済みのレスポンスと本文の系統(lineage)を使います。保持が無効、欠落、不正、または上限超過の本文は、明示的な除外として残ります。部分的な検出結果にはカバレッジを付けます。本文領域の完全一致ハッシュと、上限付きのSimHash/LSHの検出結果は、SFのHTMLディレクトリを必要とせず、ネイティブの監査に保持されます。LSHのバンドは閾値に応じて調整され、条件を満たすペアの再現率を保ちつつ、広すぎる候補バケットを減らします。近似分析の上限を使い切っても、完全一致ハッシュの検出結果は破棄されません。
#1307 (GitHub の issue)変更動作中SF監査で、任意に意味的類似度とタイトル・H1と保持本文のレビューを実行可能に#1307
SF監査では、任意で意味的類似度と、タイトルおよびH1と保持本文のレビューを実行できます。これには、明示的に指定したローカルのアダプターか、宣言された埋め込みを使います。モデルやプロバイダーは自動では選ばれません。アダプターの識別子、ソースのハッシュ、スコア、上限と省略された項目は、レビュー候補とともに示されます。意味的類似度は、重複コンテンツ、クエリとの関連性、カニバリゼーションを主張するものではありません。意味的なSFのカバレッジの2行は、実際のアダプターが選ばれて検証されるまでギャップのままです。外部プロバイダーへの承認には、厳密なブール値の
#1307 (GitHub の issue)trueが必要です。真とみなせる文字列や整数では、埋め込みの呼び出しは承認されません。変更動作中ネイティブ保持監査で、リンク切れの内部リンクを観測先ごとにまとめ、リダイレクトチェーンを記録#1306
ネイティブの保持監査は、リンク切れの内部リンクを観測された移動先ごとにまとめ、リンク元とアンカーの根拠を付けるようになりました。リダイレクトのチェーンとループは、ホップごとのステータスとともに記録します。パスベースの内部検索と空のアンカーを区別します。キャプチャされた外部リンクの無応答の結果も表示します。サイトマップとrobots.txtの整合性の検出結果は、保持されたメンバーシップとレスポンスの根拠を使い、ライブの再取得は行いません。欠落や部分的な根拠は、明示されたままです。
#1306 (GitHub の issue)追加動作中保存スキャンのリンクグラフを、位置・セクション・近傍による絞り込みに対応#1306
保存スキャンの上限付きリンクグラフを追加しました。位置、セクション、ローカルな近傍によるフィルター、セクションごとの集計、スキャン間のエッジの変化に対応します。オフラインの再分析では、再開可能な派生バッチで位置を補完し、リンクの検査とスキャンの状態で分類されていない根拠を報告します。固定されたscan.v1のスキーマは維持されます。
#1306 (GitHub の issue)追加動作中正規URLでインデックス可能な保持200ページからXMLサイトマップをローカルで生成#1306
正規URLでインデックス可能な、保持された200ページから、ローカルでXMLサイトマップを生成できるようになりました。観測されたlastmod、除外設定、プロトコルの分割、サイトマップインデックス、任意の画像サイトマップに対応します。CLIとMCPは同じ実装を共有します。出力の公開には新しいローカルディレクトリが必要で、ファイルをデプロイすることはありません。
#1306 (GitHub の issue)変更動作中取得時に見つからなかった探索対象を、後のサイトマップやシード処理の後も保持#1306
取得時に見つからなかった探索対象は、後からサイトマップやシード処理によって保持カタログにURLが追加されても保持されます。説明済みの未解決・除外の根拠は不変のまま残ります。一方、既知の対象として主張されたものや、識別子がnullでない不一致は、引き続き無効です。
#1306 (GitHub の issue)変更動作中画像サイトマップは、クロール済みページとして保存されていないリソースでも、既知の200以外の応答を除外#1306
画像サイトマップの生成では、リソースがクロール済みページとして保存されていなくても、既知の200以外のリソース応答を除外します。未測定の画像応答は、部分的なカバレッジとしてマークされます。
#1306 (GitHub の issue)変更動作中正規URLとページネーションの生の属性を、バージョン付きの文書コンテキストとして保持#1305
canonicalとページネーションの生の属性を、固定されたスキャンのSQLを変えずに、バージョン付きの文書コンテキストとして保持します。サポートされていないhreflang、lang、media、typeの属性を持つcanonicalリンク、不正な注釈、ホストやプロトコルをまたぐ宣言は、根拠に紐づいた検出結果になります。形式の正しい未知の関係キーワードは、分類されないまま残ります。
#1305 (GitHub の issue)変更動作中同一ホストのターゲットプローブをページネーションにも拡張し、測定済みのnoindexとcanonicalを保持#1305
上限付きの同一ホストのターゲットプローブを、ページネーションにも拡張し、測定されたnoindexとcanonicalの観測結果を保持します。ネイティブのcanonicalチェーンと、canonicalおよびhreflangのnoindexの検出結果は、プローブを利用できます。従来のステータスのみのプローブは読み取り可能なままですが、HTMLのディレクティブについては未測定として扱われます。
#1305 (GitHub の issue)変更動作中不透明なネイティブのページネーションチェーンを、next/prevの明示的な相互矛盾で判定#1305
不透明なネイティブのページネーションチェーンを、next/prevの明示的な相互矛盾について判定します。番号付けと刻み幅のルールは保持し、判定されなかった状態は名前を付けて示します。保存された検出結果のURL(グループ化されたメンバーを含む)は、一時的なSQLiteテーブルとストリーミングのaudit.v2の根拠を使い、scan-url-queryで選択します。
#1305 (GitHub の issue)修正動作中未知のUnicodeや句読点を含む関係トークンは未分類のまま、IDNとデフォルトポートのcanonicalを正規化#1305
未知のUnicodeや句読点を含む関係トークンは、未分類のまま残します。同等のIDNやデフォルトポートのcanonicalのauthorityは正規化し、ネイティブのページネーションの正確なターゲットパスを保持します。読めない混在のページトークンは未判定のまま残ります。ページ1のURLに番号が含まれていなくても、ショップのページネーションの欠陥は検出されます。
#1305 (GitHub の issue)変更動作中ショップのフィクスチャで宣言したnext/prev注釈を描画#1305
ショップのフィクスチャで宣言されたnext/prev注釈を描画するようにしました。これにより、D41のページネーションの正解データが実際に配信され、ネイティブのキャプチャで検証できるようになりました。
#1305 (GitHub の issue)変更動作中既存のスキャンコンテキスト行に、文書に紐づく静的なAMPとアクセシビリティの根拠を保持#1304
文書に紐づく静的なAMPとアクセシビリティの根拠を、既存のスキャンコンテキスト行に保持します。固定された
#1304 (GitHub の issue)scan.v1のSQLスキーマは維持されます。構造的なAMPの検出結果では、元のdoctype、head/body、UTF-8のcharset、viewport、ランタイムのscript、定型コードの宣言を確認します。AMPのルートマーカーがないAMPのペアのターゲットは、別に識別されます。AMPの完全なバリデーターのルールは、ライセンスの判断待ちのため、引き続き利用できません。変更動作中文書の言語、フォームのラベル、画像の代替テキスト、見出しレベルの飛び、mainランドマークのアクセシビリティ検出を開始#1304
文書の言語、フォームのラベル、画像の代替テキスト、見出しレベルの飛び、mainランドマークについて、アクセシビリティの検出結果を開始しました。検出結果には、上限付きの例と、出現件数の全体が含まれます。算出されたコントラストと、レンダリング後のaxe-coreのルールは、未測定のままです。
#1304 (GitHub の issue)変更動作中バンドルされた語彙で、Schema.org Microdataと一般的なRDFaの主語・プロパティを検証#1304
バンドルされた語彙と既存のリッチリザルトのルールを使って、Schema.org Microdataと一般的なRDFaの主語・プロパティを検証します。URLごとに保持されたエラー、警告、必須プロパティの欠落は、ネイティブの検出結果になります。サポートされていないRDFaの構文は、明示的な部分的根拠として扱われ、クリーンな検証結果にはなりません。
#1304 (GitHub の issue)変更動作中scan-structured-blocksで、解析済みJSON-LDツリーと各ブロックのソース・位置・構文エラーを提供#1304
#1304 (GitHub の issue)scan-structured-blocksでは、解析済みのJSON-LDツリーを、各ブロックのソース、位置、構文エラーとともに提供します。広いプロパティツリーには上限を設け、その上限を表示します。要求されたURLと表現について、最新の文書を、そのスキャンを変えずに読み取ります。変更動作中部分的・利用不可の構造化データの根拠を保持し、確認済みのエラーを隠さない#1304
サポートされているJSON-LDの識別子を、HTMLマークアップと同じ文書のベースで解決し、元のJSONのソースを保持します。スカラーや空のJSONブロックは有効なグラフとして扱いません。パーサーと配信用の投影で、正規化されたライブのJSON-LDタグの選択を共有します。
#1304 (GitHub の issue)変更動作中完全な保持HTMLから、レンダリングをブロックするheadのマークアップを表示するようになりました。その際、固定されたscan.v1のスキーマは変えません。欠落、不完全、または予算#1303
上限に達した本文は、利用不可のままです。既存のheadリソースの検出とSFのカスタム抽出の入力は再利用されています。
#1303 (GitHub の issue)追加動作中ネイティブのナビゲーションとリソースのバイト上限を設定可能に。キャッシュ、フォント、ミニファイ、重複scriptのシグナルも追加#1303
設定可能なネイティブの観測ナビゲーションと個別リソースのバイト上限、キャッシュとフォントの配信シグナル、ミニファイとレガシーscriptのヒューリスティック、保持されたscan.v2の根拠からの同一ページ内の完全に重複したscriptを追加しました。取得されていないデータと不完全なランタイムのペイロードは、明示的に残ります。レスポンシブの宣言は、ランタイムの重さとして合算しません。HTMLのみによる下限値、スカラーのカバレッジ件数、フォントのサンプル、ソースの要約は、明示的かつ上限付きのまま残ります。
#1303 (GitHub の issue)変更動作中要求したレンダリング時にChromiumのJS/CSS精密カバレッジを収集し、UTF-16の使用量の要約を保持#1303
要求されたレンダリングで、Chromiumの上限付きJS/CSS精密カバレッジを収集します。UTF-16の使用量の要約と、レンダリング済み画像のサイズ指定に関する検出結果を保持し、再度開いた後やオフラインの再分析の際に読み取ります。サポートされていないエンジンや測定値の欠落は、クリーンな結果にはなりません。
#1303 (GitHub の issue)変更動作中一致するURLごとのLighthouse JSONを受け付け、LCP要素の発見や依存関係ツリーなどの検出に対応#1303
一致するURLごとのLighthouse JSONを、上限付きで受け付けるようになりました。対象は、LCP要素の発見、依存関係ツリー、レイアウトシフトの原因、画像の配信、強制リフロー、スクリプトの実行に関する検出結果です。取得元の出所と入力のハッシュを伴います。Lighthouseプロセス、有料プロバイダー、フィールドのCWV推定は追加していません。レジストリ、SFのカバレッジ、生成される参考ドキュメントを更新しました。
#1303 (GitHub の issue)修正動作中追加のアセット閾値をネイティブスキャンの固定ヘッダーから分離し、検証済みの実行コンテキストに保存#1303
追加のアセット閾値は、固定されたネイティブスキャンのヘッダーの外に置き、正確な値を検証済みのバージョン付き実行コンテキストに保存します。再開時にはこれらの値を別に比較し、オフラインの再分析では保持された根拠から復元します。古い軽量のリーダーは、変わらないヘッダーの設定形式を引き続き読み取れます。
#1303 (GitHub の issue)変更動作中チェックリストの
recordが、ストリーミングのaudit.v2スキャンの自動チェックを受け付けるようにチェックリストの
recordは、保存されたスキャンがストリーミング形式のaudit.v2である、成功した自動チェックを受け付けるようになりました。以前は'NoneType' object is not subscriptableで失敗していました。監査の内容はスキャンの従来のテーブルではなく、付随するcompanionに保存されているためです。受け付けられる記録の形式は、seohead project checklist-record --help、MCPのseo_project_checklist_recordのスキーマ、およびdocs/INPUTS.mdに記載されています。変更動作中古いバージョンのマトリクスではなく、Python 3.15で全テストスイートを1回実行
古いバージョンごとのマトリクスは使わず、ツールキットの全テストスイートをPython 3.15で1回だけ実行します。検証済みのテストグループは4つで、カバレッジは統合して集計します。CIとリリースビルドのブートストラップでは、同じ安定版のPythonバージョンを使用します。
変更動作中デスクトップのWork一覧が全チェックリストページを読み込み、Issuesで「その他のチェック」を表示しない
デスクトップのWork一覧は、先頭50行ではなく、すべてのチェックリストページを読み込みます(1リクエストあたり100件)。Issuesは「その他のチェック」と表示する代わりに、レジストリのすべてのコアチェックを名前で表示します。
変更動作中デスクトップのWorkは大きなチェックリストでも失敗せず、タスクパネルはページ送りで表示
デスクトップのWorkは、すべてのチェックリストページを読み込みますが、プロジェクトのタスクパネルは1ページずつ表示します。そのため、どれだけ大きなチェックリストでも、「最大100行まで」というエラーで失敗しなくなりました。オーナーがスキャンを選んでいない場合、デスクトップは完全な監査が残した最大の完全なスキャンを開きます。コアのディスカバリーは、PATHより先にデスクトップのインタープリターが持つ環境(
sys.prefix)も確認します。変更動作中保持された監査チェックとネイティブのデスクトップ機能の改善を統合
固定されたスキャンヘッダーを変えずに、リソースの上限設定を保持し、安全なオフラインの再分析と再開を維持します。プロジェクト設定のネイティブなコンポーネント、テーマトークン、同梱フォントを共有します。配布されるツリーから、非公開のデザイン入力を削除しました。
変更動作中修正の再チェックを、検証済みの有効なアセットポリシーに紐づける
元のスキャンヘッダーとソースのバイト列を保持したまま、修正の再チェックを、検証済みの有効なアセットポリシーに紐づけます。
変更動作中プロジェクトのチェックリストのカバレッジを、
report-build --projectでストリーミングのaudit.v2レポートに紐づけプロジェクトのチェックリストのカバレッジが、ストリーミングのaudit.v2レポートに紐づくようになりました。
report-build --projectとaudit-workflow --action reportは、チェックリストのスナップショットを、xlsx、docx、csv、md、PDFの概要出力に添付します。紐づかないレポートを作成することはありません。URL上限で停止した(stopped_by_budget)スキャンは、プロジェクトの最新の監査済みスキャンとして受け付けられ、そのレポートには限定された範囲が明記されます。report-build --inputはformatキーを受け付けます。ストリーミング監査に対するreport-build --project --format jsonは、理由を説明して拒否されます。JSONはそのまま書き出されるため、チェックリストのスナップショットを含められないからです。
2026年10月10日
16 追加51 変更変更動作中デスクトップのスキャンモニターがScanRunのデザインボードに従い、実際の進捗率を表示#1203
デスクトップのスキャンモニターは、ScanRunのデザインボードに従います。取得済み・検出済みのカウンターから実際の進捗率を表示し、10pxの進捗バー、コレクターのレート制限、そして未実装であることを正直に示す120pxの速度グラフのプレースホルダーを表示します。コアのレート履歴は#1203で追跡しています。
#1203 (GitHub の issue)変更動作中
seohead/checks/custom_extract.pyのcheck_sampleで、CSS・XPath・正規表現の抽出を保存済みHTMLに対して実行#1059
#1059 (GitHub の issue)seohead/checks/custom_extract.pyのcheck_sampleは、スキャンやネットワークリクエストなしで、保存済みの1つのHTML文書に対してCSS、XPath、正規表現の抽出を実行します。各結果には値と、空の結果の理由(no_match、empty_html、budget_exceeded)を示すreasonが付くため、空の答えがクリーンな結果として示されることはありません(#1059)。これはコアの呼び出しだけです。CLIやMCPのツールはまだ登録されていません。ライブURLの取得は、意図的に含めていません。変更動作中ページネーション順序チェック(
PAGINATION_SEQUENCE_ERROR)が刻み幅のある系列を判定#1057ページネーション順序チェック(
#1057 (GitHub の issue)PAGINATION_SEQUENCE_ERROR)は、刻み幅のある系列を判定するようになりました。系列の手順の大半を1つの刻み幅が占める場合、その刻み幅からの逸脱が報告されます(例:?page=1,3,5,8は5から8で逸脱します)。不規則なオフセットの方式や、番号のない系列は、判定されずにスキップされたものとして名前付きで示されます。追加動作中新しいクロールチェック
INTERNAL_NOFOLLOW_OUTLINKS(notice)を追加しました。内部リンクにnofollow#1052の外向きリンクを持つ各ソースページを、件数と上限付きのリンク先サンプルとともに報告します。Screaming Frogの「Internal Nofollow Outlinks」に対応するページ単位のギャップを埋めるもので、これまでは
#1052 (GitHub の issue)partial扱いでした。ネイティブクロールで動作し、エクスポートのみの実行とURLリストの実行では、名前を明示したうえでスキップされます。変更動作中
hreflangのないメディア指定付き<link rel="alternate">を解析#1051
#1051 (GitHub の issue)hreflangのないメディア指定付きの<link rel="alternate">(別のモバイル用URL)を、parse_htmlのmobile_alternatesとして読み取るようになりました(#1051)。SFチェックMobile Alternate Linkはまだギャップのままです。モバイルURLのcanonicalを比較するチェックは、まだ実装されていません。追加動作中
HREFLANG_UNLINKED_TARGET#1050チェック(warning)を追加しました。クロール内のどの通常のハイパーリンクからも指されていないhreflangの代替ターゲットを報告します。これにより、Screaming Frogの「Unlinked Hreflang URLs」をカバーできるようになりました。All Hreflangのエクスポートと「Internal:All Inlinks」列を読み込む方式で、
#1050 (GitHub の issue)UNLINKED_CANONICALと同じ仕組みです。自己参照はカウントせず、部分的なクロールの場合は検出結果を保留します。レジストリのチェック数は182から183に増えました。変更動作中レンダリング済みルートの画像サイズ検証を記録#1049
レンダリング済みルートの画像サイズを検証します。render-checkが各画像の固有ピクセルサイズを、描画時のボックスサイズおよびデバイスピクセル比と比較して記録するようになりました(
#1049 (GitHub の issue)image_sizing:過大表示と拡大表示のエビデンス)。これはエビデンスのみで、SF-analyzerのチェックIDはまだありません。そのため「Incorrectly Sized Images」はギャップから部分対応(partial)に移りました(#1049)。変更動作中Semantically Similarは
gapのまま。阻害要因を明記#1041意味的類似度のコマンドとMCPツールは存在しますが、埋め込みアダプターはまだ同梱されておらず、SF実行もこのモジュールをまだ呼び出していません(#1041)。
#1041 (GitHub の issue)追加動作中
INTERNAL_LINK_SPONSORED_UGCチェック(notice)を追加しました。同一サイト内のリンクでrel="sponsored"または#1040
#1040 (GitHub の issue)rel="ugc"が付いたものを、relトークンの完全な一覧とともに報告します。他のrelベースのリンクチェックと同様にlink_attributes.captureが必要で、設定がない場合は計測対象外として報告されます。追加動作中
select_indexableによるXMLサイトマップ生成の核を追加#1039保存済みスキャンからXMLサイトマップを生成する処理の核を追加しました。
#1039 (GitHub の issue)select_indexableは、200のHTMLページのうち、自己canonicalで、noindexではなく、robotsでブロックされていないページだけを残し、除外された各URLの理由を報告します。render_sitemapsは<urlset>を書き出します。1ファイルあたり50,000URLまたは52,428,800バイトに達すると、分割したファイルと<sitemapindex>を出力します。CLIとMCPへの公開は後続の作業です。追加動作中
cloudflare-traffic(CLI)と#1026
#1026 (GitHub の issue)seo_cloudflare_traffic(MCP)を追加しました。オリジンのログがない場合に備えた、ログ分析器向けの読み取り専用Cloudflare GraphQL Analyticsソースです(#1026、#1009)。log-analyzeと同じ形式で、日ごとにボット×URL×ステータスコード×キャッシュ状態を返します。集計されたエッジデータであり生ログではないため(クライアントIPがなく、逆引きDNSによる検証はできません)、source: cloudflare-aggregatedとラベル付けされます。10,000行のページ上限に達した日は時間帯で分割します。この呼び出しは支出台帳に無料のプロバイダーとして記録されます。トークンはCLOUDFLARE_API_TOKENまたはSEOHEAD_CLOUDFLARE_TOKEN_FILEから取得され、表示されることはありません。変更動作中Search Consoleの検出結果評価器(レポート未接続)#1025
Search Consoleの検出結果を評価する内部モジュールを追加しました。まだレポートには組み込まれていません。
#1025 (GitHub の issue)seohead/checks/search_console_findings.pyがクロールのページを、正規化されたGSCエビデンス文書と結合し、GSC_ORPHAN、NO_SEARCH_DATA、NON_INDEXABLE_WITH_SEARCH_DATA を評価します。クロールが部分的な場合、期間が不完全な場合、収集がサンプリングまたは切り詰められている場合、エビデンスが与えられていない場合には、理由を付けてチェックをスキップします。スキップされたチェックが「問題なし」として報告されることはありません。変更動作中
crawl-enrichでWeb解析の検出結果を4種類報告(オフラインCSV)#1024
#1024 (GitHub の issue)crawl-enrichは、URLをキーとするオフラインCSVから、Web解析に関する検出結果を4種類報告します。解析データ上の孤立URL、解析データのないインデックス可能ページ、訪問のある非インデックス可能ページ、直帰率70%超です。名前を指定する列--visits-columnと--bounce-columnでデータを選びます。列が見つからない場合は列名を示して拒否し、読み取れない値は件数として数え、ゼロとして扱うことはありません。部分的なクロールでは、解析データ上の孤立URLの検出結果を保留します。URLごとのMetrika/GA4からのリアルタイム取得はまだ含まれていません(#990、#984)。変更動作中SF課題カバレッジマップ:Web解析の課題4件を対象に#1024
SFの課題カバレッジマップで、Web解析の4つの課題(Orphan URLs、Bounce Rate Above 70%、No GA Data、Non-Indexable with GA Data)を、対象外ではなく、オフラインCSVから
#1024 (GitHub の issue)crawl-enrichで検出されるものとして扱うようになりました。sf runはまだこれらを出力しません。変更動作中未使用のCSS/JavaScriptを測るラボ計測コア(#1023、第1段階)#1023
未使用のCSSとJavaScriptを対象としたラボ計測のコア(#1023、第1段階)です。純粋な分析器がPlaywrightの
#1023 (GitHub の issue)page.coverageのペイロードを受け取り、リソースごとの未使用文字数を報告します。リソースの大部分が未使用で、かつサイズが大きい場合に検出結果を出します。レンダリング済みページからカバレッジを収集する処理は次の段階です。変更動作中
AMP_NON_200とAMP_MISSING_CANONICALなどAMPペアのチェックを追加(#1020)#1020AMPペアのチェック(#1020)を追加しました。
#1020 (GitHub の issue)AMP_NON_200、AMP_MISSING_CANONICAL、AMP_MISSING_RETURN_LINK、AMP_NON_INDEXABLE_CANONICAL、AMP_INDEXABLEは、デスクトップページが<link rel="amphtml">で宣言するAMPターゲットを読み取って判定します。判定の対象はクロールで取得されたAMPページだけで、取得されなかったターゲットは理由を明示したスキップになります。ネイティブクロールは、解決されたターゲットをAMP HTML列として記録するようになりました。SFのAMPルールのうち残る10件は、引き続き対象外です。追加動作中
HTML_OVER_2MBを追加(HTML文書の絶対上限2MB)#1019
#1019 (GitHub の issue)HTML_OVER_2MBを追加しました。中央値との相対比較で判定するLARGE_HTMLとは別に、HTML文書の絶対上限として2MBを設定します。Screaming Frogの「HTML Document Over 2MB」は、従来の200KBのルールではなく、この新しいチェックに対応付けられるようになりました。追加動作中クロール監査に#1018
#1018 (GitHub の issue)URL_HAS_PARAMETERS(notice)を追加しました。クエリパラメーターを持つ内部HTMLページは、canonicalの状態を問わず報告されます。URL_HAS_PARAMSは従来どおり、canonicalがない場合に限定した意味のままです(#1018)。変更動作中robotsディレクティブ:
noodp、noydir、X-Robots-Tag(#1017)#1017robotsディレクティブ(#1017):metaのrobotsまたは
#1017 (GitHub の issue)X-Robots-Tagに含まれる旧式のnoodpとnoydirは、SF監査でNOODPとNOYDIRのnoticeとして報告されるようになりました。従来は対象外の一覧に載っていたものです。none(noindex+nofollow)は、metaの経路だけでなくX-Robots-Tagの経路についても回帰テストでカバーされています。追加動作中
JS_CONSOLE_ERRORSチェックを追加(「Pages with JavaScript Errors」相当)#1015
#1015 (GitHub の issue)JS_CONSOLE_ERRORSチェックを追加しました(SFの「Pages with JavaScript Errors」に相当)。保存済みのレンダリングで、コンソールにエラーが記録されたページを検出します。ネイティブスキャンで保存されたコンソールのサイドカーファイルからオフラインで読み取り、再レンダリングはしません。読み取れなかったレコードは、クリーンなページではなく、理由を明示したスキップとして扱われます。rendering.artifacts.console_errorsが必要です。変更動作中HTMLページごとのセキュリティヘッダー欠落4種を報告#1013
クロールは、保存された最終レスポンスから、HTMLページごとに4種類のセキュリティヘッダーの欠落を報告するようになりました。
#1013 (GitHub の issue)MISSING_CSP、MISSING_X_CONTENT_TYPE_OPTIONS、MISSING_X_FRAME_OPTIONS(CSPのframe-ancestorsディレクティブで充足)、MISSING_REFERRER_POLICYです。保存済みヘッダーを解析できないページは、クリーンではなく「未計測」として数えます。保存済みスキャンのないクロールでは、理由を付けてこの判定をスキップします。追加動作中
click、scroll、wait_for_selectorを含むページ操作仕様のバリデーター#1011レンダリングクロール向けに、定義済みのページ操作仕様(
#1011 (GitHub の issue)click、scroll、wait_for_selector、wait_ms)を検証するバリデーターを、静的な時間予算付きで追加しました。まだレンダリングには接続されていないため、クロールの動作は変わりません(#1011)。変更動作中
log-analyzeがaccess.log.N.gzなどのgzipログを直接読めるように#1009
#1009 (GitHub の issue)log-analyzeが、gzip圧縮のアクセスログ(ローテーションされたaccess.log.N.gzファイルや、名前を変えたアーカイブ)を直接読み取るようになりました。形式は拡張子ではなく内容で判定します。切り詰められた、または破損したアーカイブはエラーとして報告され、部分的な件数は出力されません。変更動作中
scan-url-queryに--preset(例:status_4xx)と書き出しを追加#1007
#1007 (GitHub の issue)scan-url-queryに、そのまま使える表示プリセットを追加しました(--preset。例:status_4xx、title_missing、title_over_60、h1_missing、noindex_meta)。ユーザーのフィルターとAND条件で組み合わされます。また、--export PATHと--export-format csv|xlsxを指定すると、一致するすべての行を新しいファイルに書き出します。書き出しは--export-max-rows(既定値は100,000)を超えると拒否され、既存のファイルを上書きすることはありません。変更動作中リッチリザルトの適格性ルールをデータファイルへ移動#1001
リッチリザルトの適格性ルールを、Pythonのソースから
#1001 (GitHub の issue)seohead/data/rich_results_rules.jsonへ移しました。パッケージに同梱される、バージョン管理されたデータファイルです。ファイル内のversionは、すべてのリッチリザルトの判定にrules_versionとして記録されます。つまり、ルールを変えるにはコードではなくデータを変更します。変更動作中
check_schemaのリッチリザルト判定に、ルールの版を記録#1001リッチリザルトの判定(
#1001 (GitHub の issue)check_schemaと、保存された構造化エビデンスを使うチェック)にrules_versionを追加しました。これにより、各結果がどのオフラインのルールセットで生成されたかが分かります。変更動作中保守・生成用スクリプト6件をドキュメントに追記(#997)#997
これまでドキュメントに記載がなかった保守・生成用のスクリプト6件を
#997 (GitHub の issue)docs/README.mdに追記しました(scripts/generate_project_catalogue.py、generate_registry_inventory.py、render_readme_visuals.py、linux_lifecycle_smoke.py、capacity_watchdog.py、profile_million_audit.py)。各スクリプトが何を書き出すか、どれがCIで実行されるかを記載しています(#997)。追加動作中セマンティックコアのパイプラインを
seohead/semanticsとして追加しました。プロジェクトごとに独立したSQLiteデータベースを持ちます。seohead semantics <stage> --project DIR#995(init、import、collect、clean、graph、exact、cluster、competitors、synonyms、report、excel、mine、sitematch、relevance、status、export)、MCPツールの
#995 (GitHub の issue)seo_semantics_status、seo_semantics_run、seo_semantics_mine、seo_semantics_paid(有料ステージにはconfirm_paid=trueが必要)、新しいsemanticsエクストラで有効になるLouvainクラスタリング、同梱のsemantic-coreスキル、合成データによるサンプルプロジェクトを含みます。セマンティックステージの外部プロバイダーの費用は、共有の支出ジャーナルにタグ付けされます(#995)。変更動作中Telegramボットのガイド付きアダプター
seohead/integrations/botを削除しました。モニターの配信受領記録は#995
#995 (GitHub の issue)seohead/projects/service_delivery.pyに移りました(#995)。変更動作中
scan-url-queryがclick_depthを返すように#992
#992 (GitHub の issue)scan-url-queryが、スキャンの開始ページから内部リンクをたどった最短経路の長さclick_depthを、列・フィルター・並べ替えのキーとして返すようになりました。保存されたリンクでどこからも到達できないページ(オーファン)の値はNULLです。crawl_depthは変わらず、引き続きクロールのフロンティアの深さを表します。サイトマップから投入されたURLでは、常に0です。リンクを保存していないスキャンは、誤ったNULLを返す代わりにreason_code: click_depth_unavailableで失敗します。この値はlinksテーブルからクエリごとに再計算されています。スキャン完了時にインデックス付きの列として保存する処理は、スキーマバージョンの判断が必要なため、まだ未対応です(#992)。変更動作中
scan-url-queryにfacets引数を追加(グループごとの件数を一度に取得)#991
#991 (GitHub の issue)scan-url-queryとそのMCPツールに、任意のfacets引数を追加しました。グループIDのリストかallを指定でき、同じフィルター条件のもとで、グループごとの件数を1回の処理で返します(status_2xx〜5xx、title_missing、canonical_missing、directives_noindex/nofollow、with_outlinks)。追加の計算が必要なグループ(内部/外部、サイトマップ、タイトルの重複と長さ、canonicalの自己/他)は、まだ含まれていません。変更動作中
project-sources-linkなどでプロジェクトのソースを紐付け(第1段階、#990)#990プロジェクトとデータソースの紐付け、第1段階(#990)です。
#990 (GitHub の issue)project-sources-link、project-sources-unlink、project-sources-list(CLI)と、MCPのseo_project_sources_link|unlink|listにより、ローカルプロジェクトが使うプロバイダーのリソースIDを、project.jsonの隣にあるsources.jsonに記録します。オフラインのみで動作し、探索もプロバイダーへの呼び出しも認証情報の扱いもありません。project.jsonは一切書き換えられません。変更動作中ネイティブクロールにIMG_BROKENを追加(#989、第1段階)#989
ネイティブクロールに新しいチェック IMG_BROKEN を追加しました(#989、第1段階)。<img> のターゲットのうち4xx/5xxを返したものを、エビデンスとしてソースページとともに報告します。保存済みのリソースグラフを読み取り、画像が計測されていない場合は、その旨を正直にスキップします。
#989 (GitHub の issue)追加動作中
classify_stored_soft404:保存済みページ本文のソフト404判定を追加#988保存済みのページ本文を対象とした、純粋なソフト404の判定関数(
#988 (GitHub の issue)classify_stored_soft404)を追加しました。テキストが空の場合、薄いページにエラー文言がある場合、404テンプレートとsimhashが一致する場合を判定します。まだクロールには接続されておらず、検出結果も出力しません。これは #988 の最初の段階です。変更動作中どのリンクからも到達されないcanonicalとhreflangのターゲットを確認#987
ネイティブクロールは、どのリンクからも到達されなかったcanonicalとhreflangのターゲットを、クロール後にターゲットごとに一度ずつ確認します(最大5,000件)。4xx/5xxまたはリダイレクトを返すターゲットは、クロール済みのターゲットと同様に、CANONICAL_TARGET_ERROR、CANONICAL_TO_REDIRECT、HREFLANG_BROKEN_TARGET として報告されます(#987)。
#987 (GitHub の issue)変更動作中リダイレクトチェーンとループの検出結果に、ホップの完全な経路を記録#985
ネイティブクロールのリダイレクトチェーンとループの検出結果に、ホップの完全な経路(
#985 (GitHub の issue)details.path)を含めるようにしました。これにより、修正時にどのホップを置き換えるかを明示できます。関連:#985。変更動作中リダイレクトチェーンとループの検出結果に内部リンクの情報を追加#985
ネイティブクロールのリダイレクトチェーンとループの検出結果に、
#985 (GitHub の issue)details.inbound_links(チェーンの最初のURLを指している内部リンクの一覧。アンカーテキスト付きで、最大20件)とinbound_links_countを追加しました。all_inlinksの一覧がない場合、そのフィールドは理由付きのnullになります。関連:#985。変更動作中プロジェクトにセマンティックコアへのリンクを手入力で記録可能に#984
プロジェクトは、セマンティックコアへのリンクを、運用者が入力したファクトとして記録できるようになりました(
#984 (GitHub の issue)semcore_project、semcore_cluster_count、semcore_landing_mapping)。セマンティックコア自体は独自のデータベースに保持され、プロジェクトのデータベースには統合されません。検出処理がこれらのファクトを書き込むことはなく、与えられたファクトが検出由来の出所を名乗ることもできません。「Linking a semantic core」の節としてdocs/PROJECTS.mdに記載しています(#984の一部)。変更動作中デスクトップ:リンクグラフ画面をGraphFiltersデザインに準拠#975
デスクトップ:リンクグラフ画面を、GraphFiltersのデザイン(キャンバスとフィルターパネル)に合わせました。コアがまだリンクグラフ全体を返さないため、キャンバスには待機中の状態を正直に表示し、フィルターはコアが対応するまで無効のままです(#975)。
#975 (GitHub の issue)変更動作中GSC OAuth:
provider-auth --action cancel、seo_provider_authのaction=cancelを追加#964GSC OAuthで、
#964 (GitHub の issue)provider-auth --action cancel(CLI)とseo_provider_authのaction=cancel(MCP)により、保留中のブラウザ同意フローの記録をキャンセルできるようになりました。statusは、保留中のフローがあればそれを報告します。フローの記録には認可情報が一切保存されず、10分で期限切れになります。これは #964 の第1段階です。ブラウザでの開始とコールバックはまだないため、公開インターフェースからフローが作られることはなく、接続済みのアクセスも引き続き主張されません。変更動作中
crawl-site --urls/--urls-file --projectでURLリストのクロールを登録#962
#962 (GitHub の issue)crawl-site --urls/--urls-file --projectで実行したURLリストのクロールは、オブザーバー実行(mode=list)としてプロジェクトに登録されるようになりました。そのため、project-observeとproject-scansに、プロジェクトのscans/ディレクトリにある成果物とともに表示されます。収集処理が失敗した場合はfailedとして記録されます。リスト実行の進捗表示と再開には、まだ対応していません(#962)。追加動作中手順書の構造化された概要を追加(
skill-listとscenario-list)#955手順書の構造化された概要を追加しました。
#955 (GitHub の issue)skill-listとscenario-listは、各手順書の順序付きステップを返します。skill-showとscenario-showは、見出しとステップを追加で返します。これにより、エージェントはMarkdownを解析しなくても手法の構成を読み取れます(#955)。新しいCLIコマンドscenario-listとMCPツールseo_scenario_listを追加しました。変更動作中
scan-content-searchに--kind regex(MCPではkind="regex")を追加#954
#954 (GitHub の issue)scan-content-searchが--kind regex(MCPではkind="regex")を受け付け、保持されたドキュメントをPythonの正規表現で検索できるようになりました。不正な式はスキャン前に拒否されます。正規表現の時間予算を超えたドキュメントは、存在しないものとしてではなく、「利用不可」として報告されます。変更動作中応答が失われたDataForSEOの呼び出しを「不確実」として支出レポートに記録#949
応答が失われた(リクエスト送信後のネットワークエラー)DataForSEOの呼び出しは、
#949 (GitHub の issue)cost_unknownとcharge_status: unknown付きで記録されるようになりました。そのためspend-reportは、それらを費用ゼロの計測済み呼び出しとして数えず、不確実なものとして一覧に表示します(#949)。追加動作中
scan-structured-blocks(CLI)とseo_scan_structured_blocks(MCP)を新規追加#948新しいコマンド
#948 (GitHub の issue)scan-structured-blocks(CLI)とMCPツールseo_scan_structured_blocksを追加しました。保持されたURL 1件について、JSON-LDブロックごとに説明を返します。ソースの行番号、ステータス(valid/errors/warnings/parse_error)、型、プロパティのフラットな一覧、上限付きのソースJSON、Schema.orgのグラフエラーを含みます。保持された完全なページ本文のみを使い、オフラインで動作します。ネットワークリクエストは行わず、成果物も変更しません。変更動作中プロジェクトなしの
crawl-siteも、同一ホストへのリクエスト上限を並行実行間で共有#942SQLiteのスキャン成果物を書き出す、プロジェクトなしの
#942 (GitHub の issue)crawl-siteは、ユーザーの状態ディレクトリにあるプライベートなスケジュール(~/.config/seohead/.origin-pacing.sqlite)を通じて、同じホストへの並行クロールとホストごとのリクエスト上限を共有するようになりました。これまでプロジェクトなしのクロールは、プロセスをまたいでペーシングされていませんでした。変更動作中
crawl-profile listでプロファイル名を一覧表示(#941)#941crawl-siteプロファイル(#941):
#941 (GitHub の issue)crawl-profile listで保存済みのプロファイル名を表示し、crawl-profile delete NAMEで1つ削除できます。どちらもJSONを出力し、未知の名前は拒否して、保存済みプロファイルの一覧を示します。変更動作中
--save-profile NAME --config FILEでクロールプロファイルを保存(#941)#941crawl-siteプロファイル(#941):
#941 (GitHub の issue)--save-profile NAME --config FILEで、検証済みのクローラー設定を名前付きプロファイルとして保存できます(認証情報ヘッダーを含む場合は保存を拒否します)。--profile NAMEを指定すると、そのプロファイルでクロールし、--setはその上にさらに適用されます。プロファイルは~/.config/seohead/crawl-profiles、またはSEOHEAD_CRAWL_PROFILESで指定したディレクトリに保存されます。プロファイルの一覧表示と削除は、この段階には含まれていません。変更動作中
compare.v1:片方のクロールにしかないページをurl_sets(only_in_beforeなど)で一覧表示#938
#938 (GitHub の issue)compare.v1が、片方のクロールにしか存在しないページを一覧表示するようになりました(url_sets:only_in_before、only_in_afterと件数)。どちらかのクロールが部分的な場合はurl_sets.unprovenが true になり、ページがないことを証明されたものとして示しません。変更動作中リダイレクトとcanonicalのチェーンの各ホップに、ステータスと応答時間を記録#930
リダイレクトとcanonicalのチェーンの各ホップについて、ステータス、次のLocation(リダイレクトの場合)、応答時間を記録するようになりました。これにより、追加のリクエストなしで、保存されたエビデンスからURLのチェーンを読み取れます(#930)。
#930 (GitHub の issue)変更動作中リダイレクトループの終端に
{"url": ..., "loop": true}のマーカーステップ#930URLごとのチェーンでリダイレクトループが発生した場合、最後にマーカーのステップ
#930 (GitHub の issue){"url": ..., "loop": true}を記録するようになりました。このステップは再取得されません。そのため、繰り返されたURLが保存済みのエビデンスで見えるようになりました。final_urlは、引き続き最後に取得したホップを指します(#930)。追加動作中修正台帳の作成とスキャン取り込みをCLIとMCPに公開#926
修正台帳の作成とスキャン取り込みの手順を、CLIとMCPに公開しました。
#926 (GitHub の issue)remediation-createとseo_remediation_createは、プロジェクトに紐づく新しい空の台帳を1つ作成します(producer_buildは40文字の完全なGit SHAである必要があります。既存のパスは拒否されます)。remediation-ingestとseo_remediation_ingestは、保存済みの監査を1件、クロールを再実行せずにベースラインおよび履歴として取り込みます(同じリビジョンを再取り込みしても結果は変わりません)。ストレージのロジックは変更されていません。これは #926 の第1段階です。変更動作中
crawl_siteとスキャン実行にeffective_max_requests_per_secondとwarningsを追加(毎秒2リクエスト超で警告)#925
#925 (GitHub の issue)crawl_siteとスキャン実行は、effective_max_requests_per_secondとwarningsを報告するようになりました。実効レートが毎秒2リクエストを超える場合に警告します(しきい値は2より大きい値に限ります)。CLIは同じ警告を標準エラー出力に表示します。標準出力のJSONと既定値は変わりません。ペーサーには手を加えていません。変更動作中プロジェクトの構造化イベントログ(
events.jsonl)を追加#923構造化されたプロジェクトのイベントログ(
#923 (GitHub の issue)events.jsonl)を追加しました。ソース、実行者、上限付きのテキストを持つ追記専用のイベントです。新しいものから順にページ単位で読み取り、ソースとテキストでフィルターできます。CLIではproject-event-appendとproject-event-page、MCPではseo_project_event_appendとseo_project_event_pageとして公開しています(#923)。追加動作中AIカスタム列の第1段階:
ai-columnコマンドとseo_ai_columnツールを追加ai-columnコマンドとseo_ai_columnのMCPツールを追加しました。AIカスタム列の第1段階です(#1012関連)。選択された保持済みスキャンのページ、または渡された正規化済みの項目について、タイトル、見出し、本文の抜粋から、文字数に基づくサイズ見積もり(価格は適用なし)付きの上限付きプランを作成します。また、呼び出し元のエージェントが、データを送信する前に守るべき同意の範囲も示します。URLごとに与えられる値は、各ページのソースハッシュと照合して検証されます。欠落、古い、空、サイズ超過の値は、その旨が報告され、埋められることはありません。任意で、数式として解釈されないよう無害化したCSVに列を書き出せます。SEOHEADはプロバイダーのキーを保持せず、モデルの呼び出しも行いません。変更動作中SQLiteの読み取り用・書き込み用オープナーを
seohead.core.sqliteに共通化ストレージの読み取り、スキャン取り込み、GSCアーカイブ、ソースストア、エビデンス結合のストア、および2つのチェッククラスは、接続、行ファクトリ、PRAGMAの設定を1つのヘルパーを通じて行うようになりました。2つのチェッククラスは、接続を明示的に閉じます。動作は変わりません。パスの正規化とPRAGMAの順序は、各呼び出し箇所に残しています。
変更動作中チェック・データソース・エビデンス取り込みのレビューによる修正(意図的な動作変更を含む)
これらの処理では、意図的に動作を変更しています: - 上限(既定値20)とちょうど同じホップ数のリダイレクトチェーンは、未解決として報告されず、正しく解決されるようになりました。ループのチェックは、チェーンの解決とホップ経路の走査の両方で、上限のチェックより先に実行されます。 - EEAT(信頼性と引用)のチェックは、リンク先のホストをポート付き(
netloc)で比較するようになりました。内部リンクのホストの扱いと揃えています。明示的なポートを持つサイトでは結果が変わることがあります。 - llms.txtのキーワードチェックは、ASCIIの語を単語全体で照合し、複数形も任意に許容するようになりました。そのためrapid、Showcase、Toolbarはもう通過しません。キリル文字の語幹は、引き続き部分一致で照合されます。 - ナビゲーション取得は、reloadの理由をrefresh_navigationに対応付けます。対応付けのない要求された理由(例:pageBlockInterstitial)は、バリデーターが受け入れるフレーム観測として記録されます。 - 技術検出は、否定の含意(["not", X])を、何も含意しないものとして扱います。 - エビデンスの取り込みは、重複したメトリクス名の宣言を拒否するようになりました。Search Consoleの検出は、渡された行を使います。 - Yandex Cloudの再試行は、試行の間にのみスリープします。Yandex Webmasterのクエリ分析の再試行は、次の試行の前にバックオフします。 - スキーマ構築は、そのtimeoutをHTTPクライアントに渡すようになりました(既定値は変わりません)。 - 配信の受領記録ストアは、SQLiteが開く前にモード0600で作成されます。 - セマンティックのグラフ実行は直列化されるようになりました。ストップワードの集合がモジュールの状態であるためです。セマンティックランナーは、SQLiteのエラーを例外として送出せず、ok: falseとして報告します。 - CrUXのエラーパーサーは、オブジェクトではないレスポンス本文を許容します。 - 台帳の到達不能なsqlite3 is Noneのガードを削除しました。変更動作中デスクトップ:design-v2レイアウトの被リンク画面
コアがプロジェクトのリンクプロファイルを保存するまで(#999)、待機中の状態を正直に表示します。サンプルの行は表示せず、グループフィルターは同じ理由で無効にしています。
変更動作中デスクトップのクローラー画面:一時結果のバナーとレイアウト調整
デスクトップのクローラー画面:選択中のアドレスとステータステキストを含む一時結果のバナーを追加しました(プロジェクトなしのクロールで結果が返された場合のみ表示)。クリアと「プロジェクトとして保存」の操作は、幅1000px未満でオーバーフローメニューに移しました。狭い幅でもアドレス欄とチェックタブの一覧が使えるようにし、結果ヘッダーは列を潰さず、スクロールするようにしました。シェルのステータスバーには、ダークテーマとライトテーマの両方で同じ8pxの右パディングを適用しました。
変更動作中デスクトップ:致命的な状態の画面をErrorsCoreに合わせて更新
デスクトップ:キャンバスのErrorsCoreに対応する、致命的な状態の画面です。コアが見つからない、ディスクの空きが少ない、書き込み権限がないという状態は、実際の事実に基づいて表示されます。コアのバージョンとスキャンの整合性は、コアが報告するまで、中立的な「このコアバージョンでは利用できません」のピルで表示されます。
変更動作中デスクトップ:メニュー構成をキャンバスのMenusボードに合わせる
デスクトップ:URL行メニューと列ヘッダーメニュー、メニューバーのグループ(Edit、Scan、Window)、検出結果とタスクのコンテキストメニューを、キャンバスのMenusボードに合わせました。コアがまだ提供していない項目は、無効化された状態で表示されたままになり、理由はツールチップに示されます。
変更動作中デスクトップ:「Export and reports」画面をProjExportのデザインに準拠
デスクトップ:「Export and reports」画面を、ProjExportのデザインキャンバスに合わせました(データセットと形式の選択、フォルダーのカード、最近のエクスポート)。コアがまだエクスポートできないデータセットと形式(比較、タスク、PDF)は、利用不可として表示されます。エクスポートが接続されるまで、実行ボタンは無効のままです(#1191)。
変更動作中CSV書き出しで先頭のTABとCRを無害化
マーケティングインベントリの識別子と、メタディスクリプション草案のレビューCSVで、先頭のTABとCRを無害化しました。
=、+、-、@にすでに適用している先頭のアポストロフィによる無害化と同じ方式です。両方の無害化処理は、seohead.core.tabular.neutralize_formulaを共有するようになりました。変更動作中認証情報を送るプロバイダー向けリクエスト(Arsenkin、Metrika、Yandex Cloud、IndexNow…
認証情報を含むプロバイダー向けリクエスト(Arsenkin、Metrika、Yandex Cloud、IndexNow、Topvisor、BIの送信先)は、HTTPリダイレクトに従わなくなりました。そのため、Authorizationヘッダーが別のホストへ再送されることはありません。リダイレクトはプロバイダーのHTTPエラーとして表示されます。
追加動作中
csvリダイレクト形式(source,target,301の行、必要な場合は引用符付き)を追加…generate_ruleとredirects-generateCLIのヘルプに、csvリダイレクト形式(source,target,301の行。必要な場合は引用符付き)を追加しました。wordpress-redirection形式は、インポート構文が未検証のため含めていません(#998)。変更動作中実行ジャーナル(
runs.jsonl)は、サイズ上限(既定5MiB)を超えるとローテーション…実行ジャーナル(
runs.jsonl)は、サイズ上限を超えるとローテーションされるようになりました。既定の上限は5MiBで、SEOHEAD_RUN_LOG_MAX_BYTESで変更できます。直前の世代はruns.jsonl.1として保存されます。読み取りは両方のファイルを対象にするため、再利用の検索では直近の呼び出しも引き続き見つかります。変更動作中デスクトップ版URLカードのSchemaタブを design-v2 キャンバス構成で配置(ブロック一覧…
デスクトップ版URLカードのSchemaタブを、design-v2 キャンバス構成(ブロック一覧、ブロックツリー、チェック)で配置しました。コアが返すのはURLごとのJSON-LDブロック数だけなので、列にはコア側のissue 948に紐づく「待機中」の状態を表示します。既知のブロック数は実数のまま表示し、サンプルブロックは表示しません。
2026年10月9日
4 追加4 変更追加動作中ロケールに応じたRU/EN端末ラベル、現在のスキャンの進捗ブロック、明示的なスキャン選択…#951
ロケールに応じたRU/ENの端末ラベル、現在のスキャンの進捗ブロック、明示的なスキャン選択、コンパクトなオブザーバー出力を追加しました。
#951 (GitHub の issue)変更動作中保存済みスキャンを読み取り用に軽量に開くように(#931)。#931
#931 (GitHub の issue)scan-status、scan-url-detail、scan-link-inspect、およびプロジェクトオブザーバー(project-scans、project-observe)は、開くたびにアーティファクト全体を検証しなくなりました。ID、スキーマ、バージョン、ヘッダー行だけを確認し、カウンターはSQL(pages_statusに対するGROUP BY)から取得します。結果は追加フィールドのvalidation("light"または"full")で示します。完全な検証は、リクエストされたとき(scan-statusのfull_validation: true、またはCLIの--input '{"input_path": "...", "full_validation": true}')か、同じバイト列(パス、サイズ、mtime、WAL状態、ヘッダーのハッシュ)がプロセス内で既に完全検証済みのときに実行されます。軽量チェックに失敗したスキャンは、以前と同じエラーで拒否されます。書き込みや証跡の記録を行う経路は、常に完全検証を行います。scan-url-detailはリダイレクト先の検索を0.5秒の予算内で実行します(responses.effective_url_idにインデックスがありません)。大きなテーブルを走査する代わりに、responses.redirect_target_lookupをskippedと報告します。追加動作中起動時およびライブのツール呼び出し取り消しに対応した、共有・監査済みのMCP状態を追加…#929
起動時およびライブでのツール呼び出し取り消しに対応した、共有・監査済みのMCP状態を追加しました。安全なクライアントの稼働状況をCLIで確認できます。
#929 (GitHub の issue)追加動作中明示的な許可を伴うクライアント登録を追加(プレビュー、アトミックな書き込み、検証済みバックアップ…#929
明示的な許可を伴うクライアント登録を追加しました。プレビュー表示、アトミックな書き込み、検証済みバックアップ、競合に安全な復元に対応しています。
#929 (GitHub の issue)追加動作中
scan-url-query(MCPseo_scan_url_query)を追加:保存済みスキャン1件のページ表全体を…#927
#927 (GitHub の issue)scan-url-query(MCPseo_scan_url_query)を追加しました。保存済みスキャン1件のページ表全体を、サーバー側でフィルタ、並べ替え、ページング付きで読み取り専用に取得できます。返される項目はtotal、filtered_total(件数が時間予算を超えた場合はnullとfiltered_total_state: capped)、列の絞り込み、スキャンの範囲ラベル、seohead.scan-url-query.v1形式、そして失敗ごとの機械可読なreason_codeです。1回の呼び出しは最大200行です。url、status_code、page_ordinal、url_idによる並べ替えはインデックスを使います。それ以外の列で並べ替えるには、残る行が100,000行以下になるフィルタが必要です(満たさない場合はsort_not_indexed)。スキャンは完全検証ではなく、軽量な識別とスキーマ世代のチェックで開きます。内容は一切変更しません。変更動作中
scan-link-inspect --view links(MCPseo_scan_link_inspect)で、URLの送信・受信リンクをページ単位で取得…#924
#924 (GitHub の issue)scan-link-inspect --view links(MCPseo_scan_link_inspect)で、URLの送信リンクまたは受信リンクをページ単位で取得できるようになりました。URLは文書IDではなくアドレスで指定します。取得できるのは、アンカーテキスト、rel(nofollow、sponsored、ugcのフラグ付き)、内部・外部の区別、保存された位置、target属性、リンク先のHTTPステータスです(リンク先が未スキャンの場合はnull)。リンクの種類、follow、ステータスの区分、部分一致で絞り込めます。offsetとlimitは最大200です。totalとfiltered_totalは正確な値か、上限に達したことを示すフラグ付きです。スキャンは読み取り専用で、完全検証なしに開きます。失敗時は機械可読なreason_code(url_not_found、scan_not_available、url_not_scanned、links_not_retained)を返します。既存のビューとフィールドは変更していません。変更動作中パッケージ構成を再編(互換用シムなし):
seohead.serversの移行先が変わる…パッケージ構成を再編しました。互換用のシムは置いていません。
seohead.serversはseohead.mcpに、seohead.toolsはseohead.checksになりました。seohead.botとseohead.remote_apiはseohead.integrationsの下に移動しました。CLIはseohead.cliパッケージに置かれ(seohead.cli.terminal_progressを含みます)、共通のルートモジュール(models、graph、filesystem、runlog、verification、canonical_policy、input_contracts、job_contracts、provider_matrix)はseohead.coreに移りました。ビルドの来歴情報はseohead._build.provenanceに移動しています。examples/とconfig.example.jsonはdocs/examples/に、PROVENANCE.mdとTRADEMARKS.mdはdocs/legal/に移動しました。seoheadとsf-analyzerのコマンドは変わりません。古いモジュールパスを使っているPythonのimportは更新が必要です。変更動作中READMEを全面的に書き直し:インストール、3つのクイックスタート(ネイティブクロールからレポートまで…
READMEを全面的に書き直しました。内容は、インストール、3つのクイックスタート(ネイティブクロールからレポートまで、Screaming Frogのオフラインエクスポート、プロジェクトとエージェント)、領域別の機能マップ、CLIの概要、Claude CodeとClaude Desktop向けのMCP設定、コンパニオンのデスクトップアプリ、そして計測済みと未計測の境界です。実際のターミナルのスクリーンショットは
docs/assets/に置き、ローカルのQA用フィクスチャと合成エクスポート用フィクスチャから取得しました。docs/CLI.mdを追加しました。登録済みの全コマンドを用途別にまとめ、ネットワーク、書き込み、有料の注記を付けています(コマンドが抜けるとドリフトテストが失敗します)。また、これまで参照のみだったワークフロー実行、受信箱、モニター記録のコマンドをdocs/WORKFLOWS.mdに記載しました。
2026年10月8日
1 追加10 変更1 修正修正動作中保持するHTML/DOMのバイト計算を、トランザクション単位・増分方式で維持(全本文の再スキャンなし)…#914
保持するHTML/DOMのバイト計算を、一意のレスポンスごとに保存済みの全本文を再スキャンする代わりに、トランザクション単位・増分方式で行うようにしました。再オープンされたライターは、カウンターを一度だけ再構築します。重複排除、ロールバック、セーブポイント、本文保持の上限は従来どおり機能します。
#914 (GitHub の issue)変更動作中BIレポートでは、未検証のプロバイダー収集状態と品質フラグを「不明」のまま扱い…#833
BIレポートでは、未検証のプロバイダー収集状態と品質フラグを、指標・カバレッジ・マニフェストで「不明」のまま扱います。サンプリング、しきい値処理、切り捨てが確認された場合のみ「部分的」とします。検索とセッションのコホート比較には、明示的な収集品質、0以上の件数の測定値、限定された出典範囲が必要です。各軸について、出典ID、帰属、検索範囲、カレンダーポリシーを保持します。合成レポートのパッケージはオフラインのままです。Sheets と Looker のネイティブ対応の受け入れ検証は、別途行います。
#833 (GitHub の issue)変更動作中ネイティブSQLiteサイトスキャンは
max_urls=0を受け付け、キューが空になるまで収集…#818ネイティブSQLiteのサイトスキャンは、キューが空になるまで収集する
#818 (GitHub の issue)max_urls=0と、深さ制限を無効にするmax_depth=-1を受け付けます。時間とHTTPの予算は別々に設定できます。ストレージのガードと、中断・再開の機能は引き続き有効です。従来の実体化ルートでは、URL数に上限のない母集団は拒否されます。変更動作中サイトマップのみのスキャンも、無効化されたURL上限を維持し、最初の宣言済みメンバーを拒否しないように…#818
サイトマップのみのスキャンでも、設定された上限がゼロのときに最初の宣言済みメンバーを拒否せず、無効化されたURL上限を維持するようにしました。
#818 (GitHub の issue)変更動作中既定の2リクエスト/秒を超える明示的な有限のリクエストレートが、共有のプロジェクトオリジン・ペーシングにも届くように…#818
既定の2リクエスト/秒を超える明示的な有限のリクエストレートが、スキャンごとのリミッターに加えて、共有のプロジェクトオリジン・ペーシングのレーンにも適用されるようになりました。並列スキャンでも、共通のホストスケジュールを1つだけ確保します。レートが倍々に膨らむことはありません。
#818 (GitHub の issue)変更動作中ネイティブ解析を中断すると、KeyboardInterruptを出す代わりに再開可能な中断結果を返す…#754
ネイティブ解析を中断した場合、KeyboardInterrupt のトレースバックを出す代わりに、明示的に再開可能な「中断」結果を返すようになりました。取得済みのページも保持されます。
#754 (GitHub の issue)変更動作中不正なBing Webmasterの応答行を、完全な空の結果として報告せず拒否…#753
不正なBing Webmasterの応答行は、完全な空の結果として報告せず拒否するようにしました。生の応答データ、元の行、返された正確な件数は、保存されたプロバイダーの証跡に残します。リンク数の応答は、文書化されたページ単位の応答形式を維持します。要求したページのうち1ページしか取得できなかった場合、複数ページにわたる母集団は「部分的」と報告します。
#753 (GitHub の issue)変更動作中GA4の準備状況確認で、既存の共有Googleサービスアカウントのフォールバックを認識…#753
GA4のプロバイダー準備状況とクレデンシャル検出で、既存の共有Googleサービスアカウントへのフォールバックを認識するようにしました。アカウントの権限とターゲットへのアクセスは未検証のまま扱い、不正な認証情報は明示的に報告します。両方の情報源を必須とせず、OAuthのベアラートークンへの対応も維持しています。
#753 (GitHub の issue)変更動作中ヘッドレス機能の参照を、ネイティブの実行隔離と公開の外部クロールのルーティング境界に結び付けました。内部実装とCLI/MCPでの提供状況は区別しています。クロールの動作と、容量に関#743
する主張は変更していません。
#743 (GitHub の issue)追加動作中CLIとMCPの
project-observeに、終了済み実行の上限付きページングを追加しました。保存されているすべての実行中レコードは引き続き表示されます。ページを移動しても実行IDは正確に保たれ、受付の逆順で並びます。件数と保持情報は、これまでの全履歴ではなく、現在の100件の保存領域を示します。参照しても保存された実行状態は変わりません。JSONのCLI入力は、明示的な名前付きフラグで上書きしない限り、従来のページング設定とプロジェクトの範囲を保持します。
変更動作中収集後のネイティブ処理全体(保存済みスキャンを開く処理を含む)で Ctrl+C を適切に処理…
収集後のネイティブ処理の全体で Ctrl+C を処理するようになりました。対象は、保存済みスキャンを開く処理、任意の後続フェーズ、解析、確定処理です。未完了の取得は、データと再開可能なチェックポイントを保持し、明示的な中断のJSON結果を返します。最終コミット後に中断された場合は、完成したアーティファクトを保持し、実際の監査の利用可能状況を報告します。明示的な再開では、フロンティアが空になっていても未完了の収集後処理を完了します。既存の証跡省略フラグと、保持されたサイトマップ入力もそのまま維持されます。
2026年10月7日
4 追加4 変更1 修正追加動作中使い捨てのLinux受け入れフィクスチャを追加:キー認証によるSSHワーカー実行…#754
実際のキー認証によるSSHワーカー実行、認証付きのAPI/TLSダウンロード、ジョブ専用の上限付きtmpfs上でのネイティブワーカーのENOSPCを検証する、使い捨てのLinux受け入れフィクスチャを追加しました。キューと証跡は保持されます。再実行は行わず、新しいJS復旧ジョブの前に、明示的な非成功結果を必須とします。ローカルのライフサイクル計測と、SSHおよびOSの隔離に関する証跡は、明確に区別して記載しています。
#754 (GitHub の issue)変更動作中リモートジョブ結果に部分的なJavaScript証跡を保持(完了済みの古いジョブの読み取り専用修正を含む)…#754
保存済みアーティファクトと描画の予算を変えずに、リモートジョブ結果の部分的なJavaScript証跡を保持するようにしました。完了済みの古いジョブは、読み取り専用で修正されます。認証付きのステータス、ダウンロード、永続的な冪等性を通じて、キューのバックアップと復元を実際に検証しました。2ページの復旧フィクスチャは、既存の有限な予算内で完全描画を維持します。
#754 (GitHub の issue)変更動作中最終JSON出力中にSIGINTで割り込まれた場合、トレースバックなしで終了コード130を返す…
ハンドラーの処理が完了した後、最終JSON出力中にSIGINTで割り込まれた場合、トレースバックを出さずに終了コード130を返すようになりました。保存済みのアーティファクトは変更されません。途中で切れた出力ストリームを、成功として報告することはありません。
追加動作中保持されたハッシュとトークン数の生成に使ったコンテンツ領域の戦略を記録(パーサーの既定領域ではなく)…
保持されたハッシュとトークン数の生成に使ったコンテンツ領域の戦略を記録するようにしました。パーサーの既定の領域戦略ではありません。明示的なセレクターと除外指定には、ページパーサーが既定の領域を使った場合でも、対応する抽出の来歴が付くようになりました。
修正動作中未公開のネイティブSQLite作業ファイルを、スキャン履歴と保持候補から除外…
未公開のネイティブSQLite作業ファイルは、スキャン履歴と保持候補から除外します。不正な公開済みファイルは引き続き報告し、利用者が名前を付けた通常の非表示スキャンは許可します。
追加動作中ネイティブSQLiteのサイトマップのみの収集を追加:明示的なサイトマップが母集団全体を定義…
ネイティブSQLiteでサイトマップのみの収集を追加しました。明示的なサイトマップが、要求されたURL母集団の全体を定義します。スタートページへのフォールバック、ハイパーリンクの展開、リダイレクト先の展開は行いません。空、不完全、予算超過のサイトマップ母集団は明示的に停止します。再開時は保持済みの母集団を再利用し、XMLを再取得しません。
変更動作中同時実行のネイティブ収集ごとに別々の実行記録を保持し、同一ホストへの送信ゲートを共有…
同時に実行されるネイティブ収集ごとに別々の実行記録を保持し、同じパブリックホストに対してはプロジェクト単位の2リクエスト/秒の送信ゲートを共有するようにしました。各実行のソース種別、オリジン、設定フィンガープリント、集計レートの境界を、オブザーバーに表示します。
追加動作中保持されたHEAD、HTML、本文テキスト、CSSセレクターで選んだマークアップに対する、オフラインのリテラル検索を追加…
保持されたHEAD、HTML、本文テキスト、CSSセレクターで選んだマークアップを対象に、オフラインのリテラル検索を追加しました。静的と描画済みのカバレッジを明示し、欠けた本文は「不明」として扱います。スニペットは任意で、機微な部分を伏せて表示できます。新しいローカルの結果パッケージは、整合性を検証したうえでページ送りできます。
変更動作中保存済みのScreaming Frogクロールを書き出す際、そのクロール自身の設定を保持:load-crawlは現在のスパイダー設定を注入しない…
保存済みのScreaming Frogクロールを書き出す際、そのクロール自身の設定を保持するようにしました。load-crawl は現在のスパイダー設定を注入しなくなりました。ライブのスパイダー実行とリスト実行は、引き続き実行ごとに明示的に指定されたプロファイルを受け取ります。
2026年10月6日
9 追加14 変更9 修正修正動作中select のディスクリプタ上限を超えても端末入力を動かし、Deleteや未対応の制御シーケンスで未保存のメモが消えないように…#896
select のファイルディスクリプタ上限を超えても端末入力が機能するようにしました。また、Deleteキーや未対応の制御シーケンスで未保存のメモが消えないようにしました。
#896 (GitHub の issue)変更動作中バージョン付きのブラウザ・ナビゲーションイベントを、省略の上限、キャプチャ状態、レンダラーポリシー、URLの来歴とともに保持…#826
バージョン付きのブラウザ・ナビゲーションイベントを、制限付きの省略、キャプチャ状態、レンダラーポリシー、URLの来歴とともに保持するようにしました。観測されたHTTPリダイレクト、Chromiumのスクリプト・履歴・フラグメントによるナビゲーション、原因不明のものを区別します。人間のクリックであるとは断定しません。
#826 (GitHub の issue)追加動作中同じ証跡を render-check と、上限付きのオフライン scan-navigation#826
レポートで公開しました。レンダリングが失敗した場合も、部分的な観測結果は保持されます。
#826 (GitHub の issue)変更動作中拡張可能なレンダラー設定の中にナビゲーションの証跡を保持し、ロールバック互換性を維持…#826
ナビゲーションの証跡を拡張可能なレンダラー設定の中に保持し、ロールバック互換性を維持しました。以前のプレリリースのエンコーディングは、来歴チェックを弱めることなく検証します。観測されたイベントを、レンダラーのポリシーとして扱うことはありません。
#826 (GitHub の issue)修正動作中深さのヒストグラムを含む大きなネスト要約データを、完全なPDFの付属ファイルに保持…#818
深さのヒストグラムを含む大規模でネストされた要約データを、表示用メタデータの上限予算に計上せず、完全なPDFの付属ファイルに保持するようにしました。ポータブルな付属リンクを書き換える際は、完全なPDF文書を複製し、名前付きの宛先、アウトライン、内部リンクを保持します。
#818 (GitHub の issue)追加動作中保持された audit.v2 のPDFリクエスト向けに、明示的な
pdf_policy="overview-v1"を追加。#8181ページ目は、完全な元データ、表示された件数、省略された件数を区別します。決定的な表示の先頭部分は、完全なカバレッジの状態と理由を保持し、完全なストリーミング監査JSONと、findings/pages/scope のCSV付属ファイルへのリンクを付けます。ハッシュと件数のマニフェストで来歴とリソース上限を記録します。既存の出力先は拒否され、エクスポートは段階的にステージングされます。PDFの完了マーカーは、必須の付属ファイルがすべて検証された後にのみ公開されます。既定のPDF動作は変わりません。概要版が黙って選ばれることも、網羅的なPDFとして説明されることもありません。正確な上限とクラッシュ時の扱いは
#818 (GitHub の issue)docs/PDF_OVERVIEW.mdを参照してください。追加動作中日付・ホスト名・訪問パス別の表示回数を取得する、読み取り専用のGA4
page_views操作を追加…#782日付、ホスト名、訪問パス別の表示回数を取得する、読み取り専用のGA4
#782 (GitHub の issue)page_viewsプロバイダー操作を追加しました。ランディングページのセッションとは独立して取得できます。既存のGA4認証情報、転送処理、ページ分割されたレポート読み取り処理を再利用し、再試行は上限付きです。クォータや権限の結果、タイムゾーン、サンプリング、しきい値のメタデータを明示し、宣言されたオリジンへのURL紐付けを行います。保存された制限付きのプロバイダー証跡は、既存の結合処理とBIパイプラインを通じて正規化されます。トラフィックが欠けている場合はゼロとせず、「取得不可」のまま扱います。修正動作中オブザーバーの更新を上限内に保つ:サイト単位カバレッジを再利用し、ライブ収集を別に投影…#777
オブザーバーの更新を上限内に保つようにしました。サイト単位のカバレッジを再利用し、ライブの収集活動を別に投影し、audit.v2の検出結果をページ分割して返します。無関係なグラフのコレクションは実体化しません。
#777 (GitHub の issue)変更動作中上限付き履歴で稼働中の収集機能をすべて保持し、タイムスタンプ付きの計測カウンターを公開…#777
上限付きの履歴に稼働中のすべての収集機能を保持し、タイムスタンプ付きの計測カウンターのウィンドウを公開するようにしました。未計測のカウンターは0と区別して表示します。Screaming Frogの進捗は検証済みのものを逐次ストリーミングし、両方の診断パイプを上限付きで扱います。
#777 (GitHub の issue)- 追加動作中読み取り専用のチェックリスト、タスク詳細、保存済みスキャンのページを追加しました。適用可能なメソッドの範囲を明示し、最新の受信箱の投影も加えています。#777 (GitHub の issue)
修正動作中明示的に関連付けられたサイトマップの実行を別々に保持:進行中のカウンターは不明のまま…#777
明示的に関連付けられたサイトマップの実行を、別々に保持するようにしました。進行中のカウンターは「不明」のままです。最終計測では、解析されたサイトマップ文書の数を、宣言されたURL、エラー、切り捨てとは別に数えます。
#777 (GitHub の issue)変更動作中チェックリストの成果物の受領記録を、保護されたファイル識別メタデータで観測…#777
チェックリストの成果物の受領記録を、更新時に保持されたバイト列を再ハッシュせず、保護されたファイル識別メタデータで観測するようにしました。バイト検証を伴う明示的なカバレッジ読み取りは従来どおりです。変更されたもの、または未検証の旧式の証跡は、古い・未検証として表示され続けます。
#777 (GitHub の issue)修正動作中準備後に追加されたタスクでも、過去の優先度の受領記録を元の項目範囲に結び付けたまま保持…#777
準備後に新しいタスクが追加されても、過去の優先度の受領記録を元の項目範囲に結び付けたまま保持します。完全なカバレッジの候補はすべて、アトミックに公開する前に検証します。範囲を絞った競合の詳細読み取りは、受動的なメタデータのみの検証を維持します。
#777 (GitHub の issue)追加動作中完全なNDJSON結果を伴う、ディスク上の保存済み監査比較を明示的に追加…#762
ディスク上で行う、保存済み監査の明示的な比較を追加しました。完全なNDJSON結果、決定的な順序、出典ID、ファイルごとのチェックサム、修正前後の検出結果の件数整合に対応しています。大きなaudit.v2の比較には、新しい出力ディレクトリが必要です。重複するIDやURLの対応の衝突はエラーになり、行が失われることはありません。
#762 (GitHub の issue)修正動作中重複行がある場合も audit.v2 の対象検証を上限内に保ち、検証済みのスキャンIDを保持…#762
重複行がある場合でも、audit.v2 の対象検証を上限内に保つようにしました。選択された文書では、検証済みのスキャンIDを保持します。矛盾するIDや無効な後続クロールは、修正の証拠としては受け付けません。
#762 (GitHub の issue)追加動作中完全な compare.v2 NDJSONファイル向けに、オプトインのストリーミングgzip圧縮を追加…#762
完全な compare.v2 NDJSONファイルに対して、オプトインのストリーミングgzip圧縮を追加しました。圧縮バイトは決定的で、圧縮後のハッシュを正確に記録し、復号後の行数とバイト数も記録します。平文か gzip かを検証する上限付きのリーダーも追加しました。破損したストリームや、マニフェストの件数が一致しないものは拒否します。平文の出力は既定のままです。
#762 (GitHub の issue)修正動作中どちらかの完全性フラグが欠けている場合、保存済みコーパスの比較互換性を「不明」のまま扱い…#762
どちらかの完全性フラグが欠けている場合、保存済みコーパスの比較互換性は「不明」のまま扱います。既知の部分的なコーパスには、明示的に警告します。スキップされたチェックIDと無効化されたチェックIDは、その理由とともに検出結果の差分と一緒に保持します。そのため、欠けた計測値が検証済みの修正として見えることはありません。
#762 (GitHub の issue)変更動作中端末のプロジェクト・オブザーバーで、タスク、メソッド、スキャン、受信箱、証跡の詳細を閲覧…#752
端末のプロジェクト・オブザーバーで、タスク、メソッド、構造化データ、スキャン、実行、受信箱、保持された証跡の詳細を、読みやすい形で閲覧できるようにしました。表示は上限付きのページで行い、スコープのカバレッジは実態に即して示します。ストレージの読み取りと、明示的なメモの送信は入力ループの外で処理します。
#752 (GitHub の issue)変更動作中セッション中のメモと目標の下書きを別々に保持し、カーソル編集と切り捨てのない貼り付けに対応…#752
セッション中、メモと目標の下書きを別々に保持するようにしました。カーソル編集に対応し、大きな貼り付けも切り捨てずに残します。すべてのレイアウトで保存の受付表示を出し、通常の終了後には未保存の下書きを出力して復旧できるようにしました。
#752 (GitHub の issue)追加動作中自社サイトと競合のカバレッジ・成果物の閲覧を追加し、選択サイトを保持…#752
自社サイトと競合のカバレッジ・成果物の閲覧を明示的に追加しました。選択したサイトは、スキャンや検出結果のページを移動しても保持されます。最近のメモに基づく競合候補も表示します。コンパクトな端末では、計測された収集の進捗を表示し続けます。古いサンプルがライブの進捗のように動くことはなくなりました。
#752 (GitHub の issue)- 追加動作中実際のクローラー設定から生成される、バージョン付きのヘッドレス機能一覧を追加しました。実装、CLI/MCP、テストの参照と、受け入れ上の明示的なギャップの参照を含みます。#743 (GitHub の issue)
追加動作中オプトインの自社オリジン向けHTML/JavaScriptベンチマークを追加…#743
凍結されたフェーズ、プロセスツリーのメモリ、ディスク、復旧の予算を備えた、オプトインの自社オリジン向けHTML/JavaScriptベンチマークを追加しました。計測対象のDOMは実際のブラウザが作成します。このプロファイル自体は、大規模サイトのJavaScriptの処理能力を立証するものではありません。
#743 (GitHub の issue)修正動作中ネイティブJavaScriptブリッジの未対応のストリーミング引数を修正し、描画カウンターを保持…#743
ネイティブJavaScriptブリッジの未対応のストリーミング引数を修正しました。また、正常なキャンセルと再開をまたいで、すでに観測された描画カウンターを保持します。
#743 (GitHub の issue)変更動作中log-scan は、レガシーなJSONを実体化せずに、保持されたネイティブのスキャンパスと audit.v2#711
の付属ファイルを読めるようになりました。整合性の検出結果はストリーミングで処理し、ネイティブのページ所属と検出結果の重複排除はディスク上で行います。異常件数は正確に数えたまま、例の表示だけを制限します。ネイティブ版には除外判定のトレースがないことも、明示的に報告します。
#711 (GitHub の issue)変更動作中ホームページ未クロールでも、測定対象サイトのベースオリジンのサイト全体の lastmod 検出結果を認識…#711
ホームページがクロールされていない場合でも、測定対象サイトのベースオリジンにあるサイト全体のサイトマップ lastmod の検出結果を認識するようにしました。この例外は、対応するサイトマップの要約証跡がある場合にのみ適用されます。ページ単位の検出結果、無関係なホスト、対応していないターゲットパスは、この例外の対象になりません。
#711 (GitHub の issue)変更動作中保存済みの audit.v2 スキャンを、完全一致キーと順序インデックスで比較…
保存済みの audit.v2 スキャンを、完全一致のキーと順序インデックスで比較するようにしました。ページと検出結果のペイロードを、一時的なSQLiteストレージに重複させません。完全な行、決定的なプレーン/gzipエクスポート、出典ID、レガシー入力は引き続きサポートします。監査の読み取り処理は、インデックス付きの行読み取りを通じて、検証済みのスナップショットに固定されます。
変更動作中公開失敗時に所有する比較出力を巻き戻し、競合する出力先を拒否
公開処理が後半で失敗した場合、比較出力のうち自身が作成したメンバーをロールバックし、競合して作られた出力先を拒否します。最終的なパッケージのコミット印は、引き続きマニフェストです。
変更動作中公開の入口ページを、エージェントによる設定可能なSEOエンジニアリングの説明に刷新
公開の入口ページを、エージェントで設定可能なSEOエンジニアリングの説明に刷新し、全機能を対応するメソッド、入力、根拠の範囲へのリンクでつなぎました。古いネイティブ/SF、プロジェクトのカバレッジ、修正の案内を訂正しました。エージェントが作成する開発者用ワークブックは、事実ベースのレポート出力とは別に文書化しました。レビュー済みの受け入れ基準とソースリンクも含みます。
修正動作中audit.v2のストリーム入力と同等のaudit JSONで、人向けレポートの同等性を復元
Markdownは、利用不可だったチェックの説明、除外記録、末尾のカバレッジ注記を含め、単一の増分レンダラーを共有するようになりました。XLSXは共通のメタデータレイアウトを使い、上限付きの書き込み専用ワークシートで検出結果とページを出力します。すべてのワークシート、列、フィルター、グラフ、ソース件数を保持します。保持された抑制済みの検出結果は、コレクションを実体化せずに再生できます。実行URLが欠けている場合も、同じ1ページ目へのフォールバックを使います。
変更動作中PDF監査の由来表示を共有スキーマから独立させる
PDF監査の由来を、共有の監査スキーマとは独立して表示するようになりました。区分は、ネイティブクローラー、Screaming Frogのエクスポート、明示的に識別されたSFコレクター、不明なコレクターです。SF Analyzerのスキーマを使うネイティブ監査に、Screaming Frogの見出しが付かなくなりました。
変更動作中抑制された検出結果の対象行を、描画済みの説明をメモリに蓄積せずCSVへストリーム出力
抑制された検出結果の対象行を、描画済みの説明をメモリに蓄積せずにCSVへストリーム出力するようにしました。完全な除外エクスポートは、順序とソースの事実を保持します。大量の保持済み除外コレクションでも、メモリ割り当てを有限に抑えます。
2026年10月5日
1 変更変更動作中カバレッジギャップ行を実際のMode列から照合し、対象のチェック/ツールを公開レジストリで検証#830
各カバレッジギャップ行は、実際のMode列から照合します。対象のチェックとツールの参照は、公開レジストリに照らして検証します。優先度は、未解決の行から生成します。
#830 (GitHub の issue)
2026年10月4日
56 追加75 変更5 修正追加動作中Unicode対応の明示的な別名を持つ、オフラインのブランド/非ブランドGSC進捗プロジェクションを追加しました。加重CTRとの互換性を保ち、平均掲載順位は区間ラベル付きで表示しま#880
追加動作中
check_assignmentによるタスクのグループ化を任意機能として追加#878宣言されたテンプレート/コンポーネントのURLマッピング、または検証済みのクロールセグメントに対して、任意の
#878 (GitHub の issue)check_assignmentタスクのグループ化を追加しました。グループ化された作業項目は、出現回数とURL件数、上限付きの根拠、グループ化の由来、検証範囲、そして宣言済み/候補/確定/未割り当ての状態を保持します。追加動作中
url-correspondence.v1のリリース比較マップをオプトインで追加#877宣言済みのオリジンとURLペア、衝突の拒否、ページ事実の由来を備えた、オプトインの
#877 (GitHub の issue)url-correspondence.v1リリース比較マップを追加しました。出力はrelease_review.v1です。追加動作中証拠に基づくオフラインの公開コホート・プロジェクションを追加#876
日付の由来、著者の一覧、ラベル付きのプロバイダー観測、任意の経過期間ウィンドウを備えた、証拠に基づくオフラインの公開コホート・プロジェクションを追加しました。
#876 (GitHub の issue)追加動作中提供されたHTML向けに、オフラインのCTA・埋め込みフォームのインベントリを追加#875
提供されたHTML向けに、出現を保持するオフラインのCTAと埋め込みフォームのインベントリを追加しました。リンク先が欠けている場合はnullを許容し、JSON/CSVの出力は上限付きです。本文が不完全な場合のカバレッジを明示します。
#875 (GitHub の issue)変更動作中リモートのタイムアウト分類を保持し、プロキシのマニフェストを安全に再実行#866
トランスポートエラーを秘匿化しつつ、リモートのタイムアウト分類を保持するようにしました。また、直接プロキシのマニフェストを、対象を絞った検証のために安全に再実行できるようにしました。
#866 (GitHub の issue)変更動作中由来の読み取り元をSQLリンクグラフに変更し、外部リンクチェックを再開後も保持#866
由来の証拠を保持されたSQLリンクグラフから読み取り、エクスポート時に明示的なnullの由来を保持します。また、スプールされた外部リンクのチェックを、再開をまたいで保持します。
#866 (GitHub の issue)変更動作中統合カタログとレポート契約を再生成し、PDFバリデーターを導入#866
統合カタログとレポート契約を再生成しました。PDFバリデーターはallエクストラでインストールし、偽ブラウザーを使うテストはローカルのChrome選択に依存しないようにしました。
#866 (GitHub の issue)追加動作中オフラインのBigQueryロード計画を任意機能として追加#837
クラウドにアクセスせずに、スキーマバージョン付きのテーブル、課金要件、明示的な認可の前提条件を示す、オフラインで任意のBigQueryロード計画を追加しました。
#837 (GitHub の issue)追加動作中許可リスト制のBigQuery#837
RESTトランスポートを追加しました。決定的なステージングのロードジョブと行数の照合を備え、テーブルごとのアトミックな公開を文書化しています。架空のテーブル横断トランザクションは前提にしていません。
#837 (GitHub の issue)変更動作中BigQueryの
cost_authorized承認を必須に#837トークン取得、データセット確認、ステージング書き込みの前に、ホスト側で管理する別個のBigQuery
#837 (GitHub の issue)cost_authorized承認を必須にしました。追加動作中合成5ページレポートパック向けのLooker Studioコピーリンク生成を追加#836
合成5ページ分のレポートパック用に、ローカルのみで動作し検証を行うLooker Studioコピーリンク生成を追加しました。元レポートのIDと、正確なSheetsまたはBigQueryのソース別名が必要です。レポートの公開やテンプレートの作成は行いません。
#836 (GitHub の issue)追加動作中コミット済みの合成ワークシート・フィクスチャ(
examples/reporting-pack/worksheets/)を追加しました。BIデータセットごとに1つのCSVと、マニ#836フェストを含みます。
#836 (GitHub の issue)examples/audit.jsonと2つの合成GSC/GA4入力から、バイト単位で決定的に生成されます。測定値ゼロ、抑制/欠落、外部データのみ、キーを作れない行、スキップされたチェック、利用不可のデータセット、不完全な象限の各状態を示します。再現性はscripts/generate_reporting_pack_worksheets.py --checkで検証します。追加動作中レポートパックの設定手順書(
examples/reporting-pack/SETUP.md)を追加#836
#836 (GitHub の issue)examples/reporting-pack/SETUP.mdを追加しました。所有者向けの機械的な手順書で、6枚のワークシートをGoogle Sheetsに取り込み、予約済みのデータソース別名を接続し、宣言済みのコントロールと計算フィールドで5ページ分のブループリントを作成し、コピー権限を有効にして、新規コピーを検証する流れをまとめています。ネイティブのLooker Studioテンプレート自体は、所有者が承認する外部作業として残ります。レポートID、リンク、Googleへの書き込みは含みません。変更動作中生成BIパッケージのパーティション名・件数・チェックサムを保持#836
生成されたBIパッケージのパーティション名、件数、チェックサムを保持するようにしました。これにより、ワークシート・フィクスチャは既存のSheets事前チェックと、フィルター済みエクスポートの利用側を通過します。Linking APIの別名フィールドを文書化し、手動でソースを修正せず、生成URL経由で新規コピーを検証することを必須にしました。
#836 (GitHub の issue)変更動作中重複するLinking API別名を正規化後に拒否し、正確な別名を返す#836
空白を正規化した後に重複するLinking API別名を拒否し、URLパラメーターで実際に使われた正確な別名を返します。実行フィールドの共通IDと、グループ化された提供元の日付コントロールを定義し、重複する母集団を除外したカバレッジのグラフを定義します。ネイティブテンプレートの作成と新規コピーの検証は、外部の受け入れ条件として残ります。
#836 (GitHub の issue)追加動作中証拠に基づくURLコホート行をローカルBIパッケージに追加#835
明示的で証拠に基づくURLコホート行をローカルBIパッケージに追加しました。Search Console/GA4の象限は、1対1で完全に比較可能な観測に限り、測定値ゼロを安全に扱います。
#835 (GitHub の issue)変更動作中内部リンク比率を、対象範囲内のリンク元ページから算出#835
完了したHTML抽出を伴う、対象範囲内のリンク元の一意ページから観測インリンク比率を算出します。繰り返し出現は別に保持し、部分的な母集団にはそのことをラベルで明示します。
#835 (GitHub の issue)追加動作中保存済みスキャンと監査のための型付きオフラインBIパッケージを追加#834
保存済みのスキャン・監査と、提供されたプロバイダーの証拠のための、型付きで決定的なオフラインBIパッケージを追加しました。パーティションの上限、null状態、行数の整合性、数式として解釈されないCSVセルに対応します。
#834 (GitHub の issue)変更動作中最大1,000,000件のスキャンURLをSQLite証拠で結合し、BIへストリーム出力#834
上限付きのaudit.v2コンパニオンからの検出結果を保持し、最大1,000,000件の保存済みスキャンURLを、耐久性のあるSQLite証拠成果物を通じて結合します。ページや一致したURLの一覧を実体化せずに、その成果物をBIへストリーム出力します。コピー可能なLooker Studioテンプレートは提供しません。
#834 (GitHub の issue)変更動作中検出結果グループと象限候補を上限付きSQLiteインデックスで投影#834
検出結果のグループ、プロバイダーの象限候補、対象のインリンク元を、上限付きで使い捨てのSQLiteインデックスを通じて投影します。動的なプロバイダーのディメンションは、選択されたエクスポートおよびオフラインのSheets/BigQuery計画を通じて有効に保ちます。パーティション数とディスク使用量には上限を設けています。
#834 (GitHub の issue)変更動作中検出結果の対象URLとメッセージを型付きのBI列として保持#834
ネイティブ監査の検出結果の対象URLとメッセージを、保持されたソースJSON内だけでなく、型付きのBI列としても保持するようにしました。これにより、正確なURL選択で該当する検出結果が欠けなくなります。
#834 (GitHub の issue)追加動作中
scan-fragment-links(seo_scan_fragment_links)とBROKEN_BOOKMARKチェックを追加#827
#827 (GitHub の issue)scan-fragment-links(seo_scan_fragment_links)とBROKEN_BOOKMARK監査チェックを追加しました。フラグメント付きの<a href>はすべて、保持された完全なHTML/DOMに対し、移動先文書のid属性と<a name>のターゲットに照らして解決されます。解決には、WHATWGのscroll-to-the-fragmentアルゴリズムを使います。シリアル化されたフラグメントをまずidと名前に照合し、次にパーセントエンコードとUTF-8デコードした値を両方に照合します。+はリテラルのプラス記号のままです。#と#topは文書の先頭に解決されます。静的、描画後、レガシーのフラグメントの各表現は個別に評価し、リダイレクトと<base href>のルールに従います。クエリ文字列が異なれば別の文書として扱います。欠落、切り詰め、未対応、失敗、または予算を使い切った本文は、壊れた検出結果ではなく名前付きのスキップとして報告します。Screaming Frogのエクスポートとレガシーのインポートは、このチェックが実行されたとは主張せず、利用不可と明記します。結果は上限付きで、決定的にページ分割されます(total、returned、offset/limit、next_offset、カバレッジ状態)。CLI、MCP、保持済みスキャンの監査サマリーで同一です。何も取得しません。評価は読み取り専用でオフラインです。変更動作中hreflangの戻りリンクを完全な宣言に照らして検証#825
ネイティブのhreflang戻りリンクを、完全な対象の宣言に照らして検証します。既知の戻りリンク欠落と、未クロールまたは本文が取得できない対象を区別します。観測されたnoindexの代替リンクを報告し、生のラベルと正規化したURLの識別子を、重複と衝突の文脈とともに保持します。部分的な母集団の関係は未計測として扱います。既存の監査、CLI、MCP、レポートの各出力に、追加の取得なしで同じ検出結果を反映します。
#825 (GitHub の issue)追加動作中
CANONICAL_TARGET_ERRORを追加: 4xx/5xxを返すcanonical先を報告#824取得済みのcanonical先が4xx/5xxを返す場合に報告する
#824 (GitHub の issue)CANONICAL_TARGET_ERRORを追加しました。ソース、対象、レスポンス、インデックス可否の根拠を伴います。未知の対象、またはステータスが不完全な対象は利用不可のままです。既知の2xxのバリアントはエラー判定を解除します。3xxの対象は引き続きCANONICAL_TO_REDIRECTの下に置きます。追加動作中
CANONICAL_HOMEPAGE_GROUPを追加: ホームページへのcanonical集中を検出#824
#824 (GitHub の issue)CANONICAL_HOMEPAGE_GROUPを追加しました。取得済みでインデックス可能なページが3件以上あり、2つ以上のパス階層にまたがり、タイトルとH1が互いに異なり、取得済みのホームページへcanonicalを向けているグループを対象とします。自己参照/ホーム、クエリ、認識可能なページネーション、設定済みのページネーションやフィルターのパターン、不完全なホームページの証拠、部分的なネイティブクロールは、サイト全体の検出結果を生みません。追加動作中スコープ付き監査に、著者・日付・信頼ページの客観的な証拠を追加(#823)#823
スコープ付き監査に、客観的な著者情報、日付、信頼ページの証拠を追加しました(#823)。
#823 (GitHub の issue)seohead/sf/core/eeat.pyの8つの注意(notice)レベルのチェックは、クロールで観測できる事実だけを報告し、E-E-A-Tのスコアは算出しません。NO_AUTHOR_BYLINEとNO_CONTENT_DATESは、コンテンツらしいページでのみ発火します。判定は、JSON-LDの記事タイプ、og:type=article、<article>要素、一般的なコンテンツパスのいずれかで行います。読み取る担体(meta_author、rel_author、itemprop=author、bylineクラス、<time datetime>、JSON-LDのauthor/datePublished/dateModified、日付形式のURLパス)を名指しし、それぞれに宣言された信頼度を付けます。MISSING_ABOUT_PAGE、MISSING_CONTACT_PAGE、MISSING_PRIVACY_POLICY、MISSING_TERMS_PAGEは、found_indexable(沈黙)、found_non_indexable、found_error、discovered_not_crawled、not_discoveredのいずれかを報告します。存在するが応答しないページと、誰もリンクしていないページを同じに見せないためです。FEW_CITATIONSは、リンク位置が証明できる事柄、つまり本文中の外部リンクまたは宣言された件数ゼロだけを報告します。YMYL_REVIEW_CANDIDATEは、パスとタイトルの単語単位の決定的な一致に人の確認用のフラグを立てるもので、分類ではありません。未計測と不在は全体を通じて区別されます。本文を解析していないページはtrust_signalsがNULLのままで、スキップ理由に数えられます。summary.trust_evidenceには、評価した範囲、種類ごとのページ状態、そしてnot_discoveredの判定に対する部分クロールの注意書きを記録します。変更動作中CrUXのLCP・INP・CLSのp75を公式しきい値で分類#822
CrUXの現行ウィンドウのフィールドLCP、INP、CLSのp75を、バージョン管理された公式しきい値に照らして分類します。URL/オリジン、フォームファクター、収集期間の範囲は保持します。欠落、不完全、失敗したフィールドの証拠は、利用不可または部分的として扱います。
#822 (GitHub の issue)追加動作中明示的なURLサンプリングを追加し、保存済みCrUX証拠を受け入れ#822
任意のプライベートキャッシュを伴う、明示的で上限付きのURLサンプリングを追加しました。また、プロバイダーへの自動リクエストなしで、保存済みのCrUX証拠をサイト監査とレポートで受け入れるようにしました。レスポンスとキャッシュのバイト数には上限を設けます。保存済みのサンプル件数が矛盾する場合や、同じURLの記録が繰り返される場合は、フィールドのカバレッジが完全だと報告せず拒否します。
#822 (GitHub の issue)変更動作中1回限りのDocker CLIの境界を文書化#820
現在の1回限りのDocker CLIの境界を、任意で明示的に構築されるリモートAPIおよびワーカーサービスとは別に文書化しました。
#820 (GitHub の issue)- 追加動作中永続ワークスペースでのSSH実行手順を追加しました。また、CLIの終了状態と成果物の状態は、HTTPサービスのヘルスチェックではないことを説明しています。#820 (GitHub の issue)
変更動作中ネイティブSQLiteクロールで最大1,000,000 URLを受け付け#818
明示的なネイティブSQLiteクロール設定を、最大1,000,000 URLまで受け付けるようにしました。HTTPリクエストの予算は別に2,000,000件とし、既存のストレージ専用の合成プロファイルを併用します。CLI、MCP、リモートのキュー、ワーカーは、宣言された予算を同じように扱います。実体化されるレガシー/リストのAPIには、明示的な50,000 URLの安全上限を残します。リストのrobots、リトライ、リダイレクト、canonicalのホップは、リクエスト予算を共有するようになりました。ネイティブ監査とオフラインの再分析は、以前の10,000ページおよび20,000フォームのブリッジによる拒否なしで、上限付きのaudit.v2経路を使います。トランザクショナルな書き込みカウンターにより、バッチごとに伸びるフロンティアを再スキャンしなくなりました。手動の受け入れ用ドライバーは、読み込んだソースの識別子、中断と再開、下流の利用側を記録します。受け付けただけでは、100万URLの受け入れが完了した証拠にはなりません。
#818 (GitHub の issue)変更動作中手動の受け入れステージをリソース監視下で実行し、成果物と行を検証#818
各手動のネイティブ受け入れステージを、サブプロセスのリソース監視(ウォッチドッグ)の下で実行します。中断された成果物は保持し、すべてのCSV/XLSX行とタスクのカバレッジを検証します。また、既定のペーシングを変えずに、ガード付きの所有するループバックHTTPを別に検証します。
#818 (GitHub の issue)変更動作中リモートクロールの許可期間を最大14日まで延長#818
明示的に許可されたリモートクロールの時間を最大14日まで許可します。既定値の1時間と、独立したプロジェクト、リクエスト、ディスク、リース、レンダリングの各予算は維持します。これにより、100万ページのターゲットを、変更しない丁寧なリクエスト頻度の範囲内に収められます。期間の上限を超える値や不正な型は、収集の前に失敗します。
#818 (GitHub の issue)変更動作中オフライン再分析のSQLite操作ごとに新しい期限を設定#818
オフラインの再分析は、SQLiteの実行/取得操作ごとに新しい期限を使うようになりました。クエリの中断とキャンセルは維持します。Pythonのパース処理や派生データの書き込みは、スキャン開始時の検証の期限には計上しません。
#818 (GitHub の issue)変更動作中
crawl-site --out-dirの証拠を追記専用JSONLサイドカーに保持#817レガシーの
#817 (GitHub の issue)crawl-site --out-dirは、収集と再開の間、ページ、リンク、フォームの証拠を、重複するメモリ内リストに保持する代わりに、追記専用のJSONLサイドカーに保持するようになりました。チェックポイントはサイドカーの件数を照合します。v4のインラインフォームのチェックポイントは、フォームの検出結果を失わずに移行します。既存の監査ブリッジは、ページ・フォーム・リンクの実体化の上限を明示し、監査が利用できない場合も収集済みの証拠を保持します。以前のレポートは、現行の実行結果として提示せず、古いファイル名で保持します。ネイティブのJavaScriptエスカレーションは、すべてのページオブジェクトを再構築せず、再反復可能なSQLiteビューからページレコードを読みます。大規模な監査の完全なストリーミングは、#816/#817で追跡しています。変更動作中大きなネイティブ監査を、監査の可用性を捨てずに順序付きaudit.v2コンパニオンへ保存#817
大きすぎるネイティブ監査は、監査の可用性を捨てる代わりに、順序付きのaudit.v2コンパニオンに保存するようになりました。
#817 (GitHub の issue)修正動作中ページマップと派生指標を一時SQLiteコンテキストに保持#817
ネイティブ監査のページマップとページごとの派生指標を、一時的なSQLiteコンテキストストアに保持します。
#817 (GitHub の issue)変更動作中ネイティブの探索深度を解決し、ページ参照と被リンク取得を上限付きに#817
繰り返されるページ参照を制限し、検出結果の被リンクを一括取得します。すべてのルートを再構築したり、すべてのノードをPythonに読み込んだりせずに、ネイティブの探索深度を解決します。長いルートは、正確な深度と、明示的に切り詰められた終点を保持します。
#817 (GitHub の issue)変更動作中ネイティブのページ入力とインリンク参照を、コンテキスト構築の前にストリーム処理#817
空ではないコーパスとhreflangの関係を、ディスクベースのインデックスで導出します。完全な証拠の集合はaudit.v2に保持します。上限付きの関係の検出結果サンプルには、正確な出現件数を付けます。
#817 (GitHub の issue)変更動作中ページキャッシュをバイト数でも制限し、HTMLサイズ順位をスカラー化#817
ページキャッシュを、エントリー数だけでなく推定デコード済みPythonバイト数でも制限しました。キャッシュされていない大きなページも引き続き読み取れます。変更は古いキャッシュの重みを無効化します。HTMLサイズの順位は、ページモデル全体を保持せず、安定したスカラーのURL/サイズのペアとして保持します。変更コールバックでは、シリアライズ済みのページJSONを保持しないようにしました。
#817 (GitHub の issue)変更動作中末尾スラッシュ確認ではスカラー情報のみ保持し、SQLite接続を明示的に閉じる#817
末尾スラッシュのペアを確認する際、URL、ステータス、インデックス可否、canonical、リダイレクトのスカラー情報だけを保持するようにしました。また、永続アダプターとリモートジョブのSQLite接続を明示的に閉じます。
#817 (GitHub の issue)変更動作中カバレッジ件数をストリーム処理し、DOM一致を固定インデックス上の2パスで処理#817
本文が利用できないページと、charsetのカバレッジ件数をストリーム処理します。信頼ページの選択状態は、候補のページ母集団ではなくスカラーで保持します。保存済みHTMLのDOM一致は、固定ファイルインデックス上の2パスで処理します。正規化したバリアントの代表の順序、既存のURL例、一致したソースの完全なカバレッジ、すべての検出結果は維持します。
#817 (GitHub の issue)変更動作中クロールのチェックポイントJSONLを行ごとに検証してから追記#817
追記の前にレガシーのクロールチェックポイントJSONLを行ごとに検証するようにしました。欠落、破損、未終端の証拠は、置き換えずに拒否します。古いインラインフォームのチェックポイントは、2つ目のフォームリストを割り当てずにサイドカーと比較します。
#817 (GitHub の issue)追加動作中JavaScriptベンチマークを完了したペア間で継続実行可能に#817
完了済みのペアの間で、来歴を検証しながらJavaScriptベンチマークを継続実行できるようにしました。以前の受領記録とディスク予算は保持します。中断されたケースは明示的なブロッカーとして残します。ベンチマークのケースを合格とする前に、クエリ/再分析の成功と、完全なページCSVの証拠を必須にしました。
#817 (GitHub の issue)変更動作中URLリストをネイティブSQLiteライターで保持し、入力順序を維持#817
入力の順序、複数ホスト、探索なしという意味を正確に保ったまま、ネイティブSQLiteライターでURLリストを保持します。交換ファイルの入力はストリーム処理し、収集の再開をまたいでリクエストと時間の予算を保持します。上限付きのレスポンスとホップの証拠を保持し、グラフとフォームのチェックは明示的に利用不可のままにします。大きなディレクトリのリストは、同じスプールを使い、上限を別に設けたJSON監査ブリッジを用います。
#817 (GitHub の issue)追加動作中インラインJSON上限を超える監査のためのaudit.v2 SQLiteコンパニオンを追加#816
インラインのJSONサイズ上限を超える、順序付きの完全な監査コレクションのための、バージョン付きのaudit.v2 SQLiteコンパニオンを追加しました。スキャンの由来との紐付けと、エンドツーエンドの整合性検証を含みます。
#816 (GitHub の issue)変更動作中audit.v2レポートをストリーム処理し、スナップショットとプルーニングをコンパニオンと対で実行#816
audit.v2のJSON、CSV、XLSX、Markdown、DOCXレポートをストリーム処理するようにしました。検出結果の多い母集団を比較でき、スナップショットとプルーニングの操作はコンパニオンと対にして保持します。scan.v1スキーマは維持しています。
#816 (GitHub の issue)変更動作中大きなグループのメンバーシップをaudit.v2ストレージに一度だけ保持#816
audit.v2ストレージのリビジョン3とレジャーのリビジョン5で、大きな順序付きグループのメンバーシップを一度だけ保持するようにしました。以前の読み取りとの後方互換性を保ち、レジャーのアトミックな移行、CLI/MCPを通じた明示的なメンバーのページング、ソースに紐付いた完全なBIメンバーシップのコンパニオンを提供します。
#816 (GitHub の issue)変更動作中再分析でソースのダイジェストを保持し、不完全なレジャー範囲を保存#816
オフライン再分析の間、ソースのaudit.v2ダイジェストを保持します。不完全なレジャーグループの範囲を保存し、検証に失敗した場合はインジェストのリソースを閉じます。
#816 (GitHub の issue)変更動作中メタデータのみのスキャンで、コーパス能力の概要を再利用#815
ネイティブのメタデータのみのスキャンで、レスポンス、ドキュメント、本文、リソースの証拠がない間は、正確なコーパス能力の概要を再利用します。これにより、スキャンのストレージを変えずに、疎なページのコミットごとにコーパス全体を読み直すことを避けます。
#815 (GitHub の issue)追加動作中オプトイン式のオフラインでネイティブなスキャン容量プロファイラーを追加しました。リンク、保持済みHTML、レンダリング後DOMをそれぞれ独立したサイズで扱い、リソース予算を明示し、#815
プロセス喪失からの再開も検証します。既存の50,000 URLの受付上限と、完了処理が未完了のままになる問題は、容量ではなくブロック中の証跡として報告します。
#815 (GitHub の issue)変更動作中ピン留めしたブラウザーリクエストの取り消しを
render_cancelledと命名し、分離されたリモートのコンテキストを閉じる…#811ピン留めしたブラウザーリクエストの取り消しを
#811 (GitHub の issue)render_cancelledと命名しました。取り消しや切断時には、分離されたリモートのコンテキストとブラウザーを閉じます。ローカルでのフォールバックは行いません。変更動作中信頼済みのリモートプロジェクト設定で、ホストに紐づく環境変数の認証情報参照を指定可能に#810
信頼済みのリモートプロジェクト設定で、ホストに紐づいた環境変数の認証情報参照を指定できるようにしました。参照の来歴は秘匿化して保存します。参照が利用できない場合は、収集を始める前に失敗させます。
#810 (GitHub の issue)変更動作中キューに入れられたプロジェクト向けに、サービスが管理するバージョン確認済みのリモートPlaywrightトランスポートを許可…#809
キューに入れられたプロジェクトで、サービスが管理するバージョン確認済みのリモートPlaywrightトランスポートを使えるようにしました。エンドポイントは送信内容に含めず、ピン留めとポリシー制約付きのブラウザーリクエストは維持します。
#809 (GitHub の issue)追加動作中保存済みスキャンの観測パス、逆向き内部リンク、出現箇所の文脈を一つの読み取り専用クエリで公開…#807
保存済みスキャンの観測パス、逆向き内部リンク、出現箇所の文脈を、スキャンIDを明示した一つの有界な読み取り専用クエリとして、CLIとMCPの両方から参照できるようにしました。エラーも明示的な結果として返します。
#807 (GitHub の issue)追加動作中保持済みの静的HTMLとレンダリング後DOMから、出現箇所単位のリンク配置と最も近い見出しの文脈を取得する機能を追加しました。件数に上限を設けた読み取り専用の処理です。重複するリン#806
クIDは保持し、取得できなかった場合や一部のみ取得できた場合は、その状態を明示します。
#806 (GitHub の issue)追加動作中
semantic-inputsコマンド(MCPではseo_semantic_inputs)を新設し、再現可能な正規化入力マニフェストを作成…#801新しい
#801 (GitHub の issue)semantic-inputsコマンド(MCPではseo_semantic_inputs)は、今後の意味類似度の処理で使う、再現可能な正規化入力マニフェストを作成します。文書ごとに、保持済み本文のハッシュ、デコード後の入力そのもののハッシュ、正規化後の出力ハッシュ、本文領域の決め方、言語の根拠(ページ自身の<html lang>と文字種の割合)を記録します。正規化後のテキストそのものは保存しません。--scanは、クロールで記録された本文領域の設定に従い、保持済みの本文をオフラインでストリーム処理します。再取得はしません。本文が欠けている場合や一部のみの場合は、空の結果として扱わず、省略として明示します(#801)。変更動作中公開前に技術監査PDFのページ数、バイトサイズ、抽出可能なテキスト、ソースモデル記録の保存を検証#800
レンダリング済みレポートを公開する前に、技術監査PDFのページ数、バイトサイズ、抽出可能なテキスト、そしてソースモデルの記録が欠けずに保存されていることを検証します。
#800 (GitHub の issue)追加動作中共有のレポート生成CLIとMCPの経路に、オフラインのバイリンガルChromium PDF出力を追加…#799
共有のレポート生成CLIとMCPの両方に、オフラインで動作するバイリンガルのChromium PDF出力を追加しました。一時ファイルは検証とサニタイズを行い、そのうえでアトミックに置き換えます。
#799 (GitHub の issue)追加動作中英語とロシア語の技術監査PDFレイアウトを追加。ブランド中立のトークンと長いコンテンツのページ送りに対応…#798
英語とロシア語に対応した、自己完結型の技術監査PDFレイアウトを追加しました。ブランドに依存しない中立的なトークン、重大度とカバレッジのチャート、未完了の実行状態の明示、長い内容のページ送りに対応します。
#798 (GitHub の issue)追加動作中両方の対応監査契約について、ソースの記録、正確なソース・投影後の件数、範囲、カバレッジ状態を保持する…#797
両方の対応監査契約に対し、ソースの記録、ソースと投影後の正確な件数、範囲、カバレッジ状態を保持する、バージョン管理されたオフラインの技術監査PDFコンテンツモデルを追加しました。
#797 (GitHub の issue)変更動作中登録済みワークフローのシナリオ版、サイトと競合の文脈、ステップごとの証跡、レビューゲートを保存…#796
登録済みワークフローのシナリオのバージョン、サイトと競合の文脈、ステップごとの証跡、レビューゲートを保存します。中断された実行は、依存関係がまだ有効な場合に限り、後のローカルセッションで再開できます。
#796 (GitHub の issue)変更動作中ワークフローの開始にはコントローラーのワークリストを必須化し、専門家メモの仕分け受領を保持…#796
ワークフローを開始するには、コントローラーのワークリストが必要になりました。タスク、目標、競合、保留、却下の各結果に対する専門家メモの仕分け受領は、明示的に保持します。
#796 (GitHub の issue)変更動作中ワークフローのチェックポイントで、保存済み成果物のバイト列をSHA-256の受領記録と照合#796
成功したワークフローのチェックポイントは、プロジェクトに紐づく保存済み成果物のバイト列を、SHA-256の受領記録と照合することが必須になりました。証跡が欠けている、または変更されている場合は、履歴を書き換えずに以前の完了を古い扱いにします。検証の予算を超えた場合も、証跡を黙って確定させたり受領記録を捨てたりはしません。
#796 (GitHub の issue)変更動作中明示的で有界な証跡ハッシュのポリシープロファイルを許可し、古いポリシーを正規化#796
受動的なワークフロー観測は、成果物を再ハッシュせず、保存済みの検証メタデータだけを確認します。変更された受領記録や未検証の受領記録は、明示的に残ります。
#796 (GitHub の issue)追加動作中有界でページ分割された
project progressCLIコマンドとseo_project_progress#795MCPツールを追加しました。チェックリストの状態件数と、次に実行可能な項目を返します。この表示は既存のスコープ付きカバレッジ結果を再利用します。すべての対象サイトに合意済みの計画があり、測定済みで空でないタスクの分母がある場合にのみ、「監査タスクの完了率」と明示したパーセンテージを表示します。URL母集団のカバレッジは別に扱います。
#795 (GitHub の issue)変更動作中プロジェクトのチェックリストで合意済みの監査スコープを記録し、誠実なカバレッジ比率を報告可能に(#794)#794
プロジェクトのチェックリストに、合意済みの監査スコープを記録し、誠実なカバレッジ比率を報告できるようになりました(#794)。
#794 (GitHub の issue)project-checklist-initとseo_project_checklist_initは、任意のplanを受け付けます。計画には、レビュー担当者、complete_setとして宣言されたURLpopulation、名前付きのsample、またはunknownを指定でき、それぞれsource、size、または列挙されたurlsを伴います。テンプレートごとの母集団(templates)と、任意のtasks合意(all_agreed、または既存のチェックリスト項目IDによる出典付きのselection)も指定できます。計画はプロジェクトのサイトIDに紐づけられ、書き込みのリビジョンが刻印されます。計画を記録するとチェックリストはseohead.coverage.v3に更新され、保持された計画履歴に追記されます。同じ合意を再記録しても冪等な no-op です。合意内容が変わった場合は、以前の証跡を新しい分母で再評価せず、古いものとしてマークします。単一計画のv3文書は読み込み時に移行されます。読み取り、照合、優先度の適用では、母集団を昇格させたり作り出したりしません。v1とv2の文書は、これまでどおり変更なく読み込めます。選択範囲外の項目はnot_agreedとして報告され、どの分母にも含まれないまま可視化されます。変更動作中チェックリストの完了は測定範囲に従うように。部分スキャンによる項目は完了扱いにせず、complete は監査の完了を意味…#794
チェックリストの完了判定は、測定された範囲に従うようになりました。部分スキャンによる制限付きの測定に基づくサイト単位の自動項目は、完了扱いにならず未完了のままです。一方、明示的なサンプルURLに限定された項目は、成果物がその範囲をちょうどカバーしていれば完了になります。トップレベルの
#794 (GitHub の issue)completeフラグは、監査スコープが完了したことを意味するようになりました。すなわち、合意済みのタスクがすべて完了し、保留中の除外がなく、合意済みのURL母集団が検証済みの測定で完全にカバーされている状態です。そのため、不明または未測定のスコープが完了した監査として報告されることはありません。変更動作中チェックリストのステータスは
coverageを返すようになり、audit_tasks、checksなどの5つの比率を分けて報告…#794チェックリストのステータスは
#794 (GitHub の issue)coverageを返すようになりました。audit_tasks、checks(measured_urls付き)、manual_review、deliverable_review、url_populationの5つの独立した比率で、それぞれにbasis、numerator、denominator、stateがあります。これにより、URL件数がチェックやタスクの件数と混ざることはありません。正当化できない分母は、0/0や100%にはせず、nullとstate: "unknown"と理由を付けて保持します。合意された母集団に照らして検証できない測定では、URL軸はpartialのままとなり、検証済みで対象となるURLのみを数えます。URLの所属は合意された列挙と照合するため、sizeだけで宣言された母集団では測定済みURLは数えられず、分子が分母を超えることはありません。テンプレートごとの母集団は、計画の記録時と読み取り時に、サイト母集団の合意済みの部分母集団であることを検証します。列挙されたテンプレートのURLはサイトの列挙集合に含まれている必要があり、宣言されたテンプレートの所属数は合意済みのサイトサイズを超えられません。不整合な計画は、切り詰めたり分母を超えて数えたりせず、拒否されます。保存されたチェックの証跡には測定済みのURL列挙が含まれるようになり、URL分子は行数ではなく監査可能な集合になりました。複数サイトの集計は、サイトごとに各軸を合算します。あるサイトが分母を正当化できない場合は、unknownに格下げされます。変更動作中
not_applicableレコードは、理由、レビュー担当者、証跡の根拠を必要とするレビュー済みの除外に…#794
#794 (GitHub の issue)not_applicableレコードは、レビュー済みの除外になりました。理由、レビュー担当者、そして検証可能な証跡の根拠が必要です。根拠は、プロジェクト相対でダイジェスト付きのartifact、または明示的なevidence参照のいずれかです。レビュー済みの除外は、安定したIDと履歴を保持し、記録された判断を通じてのみ作業タスクの分母から外れます。また、exclusionsの下に別途一覧表示されます。無効化された項目、古くなった除外レコード、証跡の根拠ルールより前に書かれた従来のnot_applicableレコードは、再レビューされるまでpending_exclusionとして分母の中に残ります。そのため、無効化、カタログからの削除、再分類によって合意済みの件数が黙って減ることはありません。カタログから削除された項目に対する新しいレビュー済みの除外は、通常どおり解決され、永久に保留のままになることはありません。追加動作中
workflow/full-audit-v1プロンプトとfull-auditシナリオを、既存のCLIおよびMCPのカタログ経由で追加…#793
#793 (GitHub の issue)workflow/full-audit-v1プロンプトとfull-auditシナリオを、既存のスキル・シナリオのCLIおよびMCPカタログのルート経由で参照可能にしました。このワークフローは、既存の収集と手法のパスを再利用します。検証とレポート作成は、実際の証跡があるかどうかでゲートされます。また、プロジェクトの準備とフル監査の完了は分けて扱います。変更動作中修正判断を、不変の検証成果物と、修正前後の正確な証跡ハッシュに紐づける#792
修正の判断を、不変の検証成果物と、修正前後の正確な証跡ハッシュに紐づけました。ストリーム処理された audit.v2 のベースラインも対象です。
#792 (GitHub の issue)変更動作中保存済みの修正結果を、表示済みと全範囲のカバレッジ状態付きで報告し、大規模な台帳にはケースのページを追加#791
保存済みの修正結果を、表示済みと全範囲のカバレッジ状態付きで報告できるようになりました。タスクごとの分母と、大規模な台帳向けの有界なケースページにも対応しています。
#791 (GitHub の issue)追加動作中台帳キーによる有界な修正の再チェックを追加し、保護された検証器を再利用してスコープのずれを拒否#790
台帳キーによる有界な修正の再チェックを追加しました。保護された検証器を再利用し、audit.v2 の選択範囲をストリーム処理します。スコープがずれている場合は拒否します。
#790 (GitHub の issue)変更動作中修正の検証を、保持された監査の識別子と元の結果に影響するポリシーに紐づける#790
修正の検証を、保持された監査の識別子と、結果に影響する元のポリシーに紐づけました。スキャンUUIDが再利用されていても、それだけで古いケースを解決することはなくなりました。
#790 (GitHub の issue)追加動作中
ledger.v1修正台帳を追加(seohead.storage.ledger、SEOLアプリケーションID)#788
#788 (GitHub の issue)ledger.v1修正台帳を追加しました(seohead.storage.ledger、SEOLアプリケーションID)。これは、検証済みのscan.v1/scan.v2監査から、所見、出現箇所ごとの識別子、影響URLの所属、追記専用の観測履歴を記録する、プロジェクトに紐づいた独立のSQLite成果物です。元のスキャンは変更しません。取り込みでは、各ソースをスキャンUUIDとエビデンスのリビジョン、監査ダイジェスト、プロデューサーと設定の識別情報で紐づけます。同一の再取り込みは冪等です。同じリビジョンで内容が衝突する場合は、アトミックに拒否します。cappedとaggregate_onlyのカバレッジ、およびunavailableの証跡は、解決済みとして黙って扱わず、データとして保持します。0→1のトランザクション移行、開く際の完全なスキーマと整合性の検証を含みます。docs/LEDGER.mdも追加しました(#788)。追加動作中認証済み成果物の分離、バックアップと復元、期限切れ、アトミックなアップグレードのロールバックを検証する、使い捨てのループバックTLSリバースプロキシのプロファイルを追加#787
認証済み成果物の分離、バックアップと復元、有効期限、アトミックなアップグレードのロールバックを検証する、使い捨てのループバックTLSリバースプロキシのプロファイルを追加しました。サービスは本番にデプロイしません。
#787 (GitHub の issue)変更動作中ワンショットのSSH CLIジョブ、成果物とインシデントの記録、合成リカバリーの文書を追加し、将来のサービスの境界を分離#787
ワンショットのSSH CLIジョブ、成果物とインシデントの記録、合成リカバリーについて文書を追加しました。また、将来のサービス向けのヘルス、プロキシ、TLS、ファイアウォールの境界を、それらとは別に文書化しました。
#787 (GitHub の issue)追加動作中自己ホスト型リモートサービスの運用プロファイルを追加しました。対象は、プライベートバインド、認証済みヘルス証跡、シークレットファイル参照、インシデント記録、SQLiteの整合性を保#787
った復元、リリースのロールバック、終端成果物の期限を明示した失効です。
#787 (GitHub の issue)追加動作中将来のキュー投入ジョブ向けに、プロジェクトに紐づいたリモートターゲットのポリシーを追加#786
ワーカーに紐づけられると、ターゲットと設定を検証し、ディスパッチ時にDNSを再チェックし、HTTPおよびブラウザーのリソースリクエストをピン留めします。オリジンごとおよび全体のリクエスト予算も適用します。リモートプロキシと代替のブラウザーバックエンドは、外向き通信が安全だと証明されるまで拒否されます。
#786 (GitHub の issue)追加動作中任意の認証付きリモートAPI向けに、プロジェクト単位で分離されたSQLiteキューとリース式のネイティブスキャンワーカーを追加#785
任意の認証付きリモートAPI向けに、プロジェクト単位で分離されたSQLiteキューと、リース方式のネイティブスキャンワーカーを追加しました。ジョブは、ネイティブスキャンと JSON / Markdown のレポートを保持します。冪等な送信、キャンセル、再起動後の失敗からの回復、スコープ付きの成果物ダウンロード、明示的な保持期間をサポートします。リスナーはデフォルトでは有効にしません。
#785 (GitHub の issue)変更動作中任意の認証付きリモートスキャンAPIの契約を定義#784
任意の認証付きでバージョン管理されたリモートスキャンAPIの契約を定義しました。ネイティブクロールの設定に上限を設け、プロジェクト単位の権限、冪等な送信、OpenAPIスキーマ、スキャン状態と互換性のある証跡を備えます。独立した永続ワーカーと、ターゲットと外向き通信のポリシーが必要です。ローカルのCLI/MCPの導入は変更ありません(#784)。
#784 (GitHub の issue)追加動作中固定版のUbuntu#783
SSH運用手順書と、使い捨てのLinuxライフサイクル検証を追加しました。インストール、JavaScriptのレンダリング、成果物の検出、アップグレード、バージョンの証跡、ロールバックを、リモートサービスなしで検証します。
#783 (GitHub の issue)変更動作中インポートしたアナリティクスと検索の証跡を、スキャン結合用に正規化(#781)#781
#781 (GitHub の issue)evidence-normalizeは、提供されたCSV/XLSX/JSONのエクスポート、または保存済みのseohead.provider-evidence.v1エンベロープを、完全にオフラインで読み込みます。任意のseohead.evidence-mapping.v1マニフェストに基づいて、バージョン管理されたseohead.normalized-evidence.v1ドキュメントを生成します。ソース、レポートの識別情報、期間、タイムゾーン、帰属、エンジン、収集カバレッジ、URLの紐づけについて、フィールドごとの来歴(エンベロープ由来、宣言、または不明)を保持します。測定値の0は0のままです。行の欠落、null や空白のセル、数式のセル、抑制された値、未収集の期間、収集の失敗やスキップは、明示的に取得不可として扱います。evidence-joinは、正規化された証跡をスキャン、監査、またはページ一覧に、厳格なexternal_join.v1のキーポリシーで結合します。緩和は明示的なものだけです。一致、クロールのみ、外部のみ、キー化不能の各母集団は、宣言された粒度のまま保持します。キーの衝突は報告し、行を増やしません。--compareと宣言されたポリシーを組み合わせると、期間、タイムゾーンの境界、識別情報、帰属、エンジン、粒度を基に、互換・非互換・不明の判定を副作用のない計算で追加します。また、後続のコホート分析に向けて、測定値0の象限の適格性も報告します。制限付きのソースは、行と識別子を非公開のローカル成果物に残し、返すのは件数だけです。追加動作中オフラインのプロバイダー準備状況の表示を追加#780
秘匿化された認証情報参照、操作ルートのスキーマ、クォータとプライバシーのメタデータ、明示的な対象アクセス状態を備えた、オフラインのプロバイダー準備状況の表示を追加しました。認証情報が存在するだけでは、権限は確認できません。
#780 (GitHub の issue)変更動作中
seohead watchを、保存済みの所見ナビゲーションと証跡詳細を備えた読み取り専用のプロジェクト監視ツールに拡張#775
#775 (GitHub の issue)seohead watchを読み取り専用のプロジェクト監視ツールに拡張しました。保存済みの所見をたどる機能、証跡の詳細、保存ビューとレビュー状態、スコープを明示したMCP受信通知を備えます。追加動作中永続的な冪等性の受領記録付きで、認可された合成レポートの配信を追加#773
認可された合成レポートの配信を追加しました。永続的な冪等性の受領記録と、再起動後も安全に再試行できる動作を備えています。
#773 (GitHub の issue)変更動作中プロセス終了や不正な文書確認の後も、不確かな配信の申し立てを保持し、二重アップロードを防止#773
プロセスの終了後や文書確認が不正だった後も、不確かな配信の申し立てを保持するようにしました。受理を確定できない場合は、自動で二度目のアップロードを行いません。
#773 (GitHub の issue)変更動作中保存済みの証跡からレポートプレビューを測定し、レンダリングサイズやソースのダイジェストなどを表示#772
保存済みの証跡をもとにレポートプレビューを測定します。レンダリングサイズ、ソースのダイジェスト、母集団の件数、カバレッジ、プロファイルを扱い、送信前にレンダラーの欠落や大きすぎる入力を報告します。また、徹底モードのウィザードのJS予算を、共有キューの契約に合わせました。
#772 (GitHub の issue)変更動作中キューや所有権のクラッシュをまたいで、ボット実行の識別情報を保持し、重複を排除#771
確認済みのボット実行の識別情報を、キューや所有権のクラッシュをまたいで正確に保持するようにしました。信頼できる更新の重複を排除し、ステータス、キャンセル、回復、配信を、起動したアクターとチャット単位で分離します。同じ内容の意図的な再実行は、それぞれ別のジョブとして扱われます。
#771 (GitHub の issue)修正動作中サービス再起動後に、最後に確認されたアクターとチャットのジョブを復元#771
サービスの再起動後、最後に確認されたアクターとチャットのジョブを復元するようにしました。キャンセルと、再確認された再実行の動作は維持します。未確認の下書きは再開しません。
#771 (GitHub の issue)追加動作中自己ホスト、法務、調達のレビュー向けに、ソフトウェアレビュー用の証跡パックを追加(#761)#761
自己ホスト、法務、調達のレビューに向けたソフトウェアレビュー用の証跡パックを追加しました(#761)。
#761 (GitHub の issue)scripts/generate_review_pack.pyが、バージョン管理された依存関係とライセンスの一覧を生成し、検証します。一覧はインストールグループごとに1つのプロファイルで、解決済みのバージョンと、生成環境から測定したライセンスの出典を含みます。マーカーで除外された要件、仕様を満たさない要件、未インストールの要件は、削除せず記録します。また、ビルドされた配布物をタグとリリースのソースに紐づけるリリース単位の来歴文書と、これら全体を対象とするSHA256SUMS.txtを生成します。タグがpyproject.tomlと食い違う場合、生成は拒否されます。検証では、フォーマットと記録されたハッシュを再確認し、各配布物を展開し直して、埋め込まれたビルドマニフェスト、ファイル名が示す名前とバージョン、そして配布物自身の*.dist-info/METADATAまたはPKG-INFOのNameとVersionのフィールドを、記録を信用せずpyproject.tomlと照合して再検証します。SEOHEAD_REVIEW_CANARY_*の番兵スキャンで、パックのファイルと診断情報に仕込まれた認証情報やクライアントの目印が含まれないことを確認します。CIでは毎回、使い捨てのタグを使ってパックを再生成・検証します。リリースのワークフローは、実際のv*リリースに対してパックを検証し、添付します。追加動作中
docs/SOFTWARE_REVIEW.mdを追加。外向きエンドポイントとデータフローのマップ#761
#761 (GitHub の issue)docs/SOFTWARE_REVIEW.mdを追加しました。各機能がどこへ接続し、何を送信し、その呼び出しが任意かどうかを示す、外向きエンドポイントとデータフローのマップです。ローカルとリモートの境界、認証情報と成果物の保存先、テレメトリの状態、セキュリティ報告と保守の状況、リリース変更のレビュー方法を含みます。インストールとデプロイの運用手順書には、重複させずにリンクしています(#783、#787)。追加動作中完全なローカルBIパッケージ向けに、オフラインのGoogleスプレッドシート容量とチェックサムの事前確認を追加#760
完全なローカルBIパッケージのために、オフラインのGoogleスプレッドシート用の容量とチェックサムの事前確認を追加しました。Googleへのリクエストやスプレッドシートへの書き込みは一切行いません。
#760 (GitHub の issue)追加動作中明示的に許可リスト化されたGoogleスプレッドシートの置換転送を追加しました。データセットごとのワークシート対応付け、有界なステージングと読み戻し、既存のワークシートIDを維持す#760
る値のみの一括公開を行います。
#760 (GitHub の issue)変更動作中リモートでのステージ作成前にGoogleスプレッドシートのステージングをチェックポイント#760
リモートでステージを作成する前に、Googleスプレッドシートのステージングをチェックポイントするようにしました。開始の応答が失われた場合は、決定的なステージシートIDで照合してから再試行します。
#760 (GitHub の issue)変更動作中型付きの値を保持し、重複したワークシートの対象とデータセットのずれを拒否#760
型付きの数値と真偽値を保持し、疎なGoogleの読み戻しに対応しました。重複するワークシートの対象と、データセット契約のずれは拒否します。回復処理は設定された正確な対象に紐づけ、クォータ超過後も再開可能なステージングを残します。アトミックな置換の前に対象グリッドの拡張量を見積もり、中断された実行では未確認の行数を報告します。
#760 (GitHub の issue)変更動作中書き込み前にグループの付随ファイルを検証し、選択された所見と一緒に保持#760
宛先への書き込みの前に、ソースに紐づいた完全なグループの付随ファイルを検証し、選択された所見と一緒に保持するようにしました。宛先とワークブックの受領記録では、ローカルのみのメンバーシップ参照を明示します。付随ファイルがアップロードされたとは主張しません。
#760 (GitHub の issue)変更動作中大きな
scan-exportのXLSXレコードを、決定的な番号付きワークシートに分割#759Excelのシートごとの行数上限で失敗する代わりに、大きな
#759 (GitHub の issue)scan-exportのXLSXレコード群を、決定的な番号付きワークシートに分割するようにしました。行数の保存を確認するPartitionsシートも含みます。変更動作中
report-buildの所見とページのワークシートを、Excelの行数上限で分割#759Excelの行数上限に合わせて
#759 (GitHub の issue)report-buildの所見とページのワークシートを分割し、正確なレコード範囲、母集団、選択、カバレッジの参照を含む、ハッシュ付きの.xlsx.index.jsonを出力するようにしました。書き込みが失敗した場合は、前回のレポートを保持します。中断時には、ストリーミング用の一時ファイルを掃除します。変更動作中XLSXで32,767文字を超えるセルを、切り詰められる前に拒否#759
ライブラリによる切り詰めが起きる前に、32,767文字を超えるXLSXのセルを拒否するようにしました。Summaryのメタデータは数式インジェクションから保護します。また、不完全なエクスポートが成功を名乗らないよう、不正な保持済み監査行も拒否します。完全なCSV/JSONと、上限付きのPDF概要ポリシーは引き続き利用できます。
#759 (GitHub の issue)追加動作中有界な選択BI CSVの配信を追加(ソース、選択、除外の行数を正確に計上)#759
有界な選択BI CSVの配信を追加しました。ソース、選択、除外の各行数を正確に計上し、保持済みのソースカバレッジ、ストリーミングによるハッシュ、XLSXのCSVからワークシートへの範囲インデックスを備えます。Excelのセルが上限を超える場合は、切り詰める前に失敗させます。中断された出力は完了とはマークしません。
#759 (GitHub の issue)変更動作中所見のBIエクスポートと並べて、完全で不変のチェックカバレッジ行を保持するようにしました。スキップされたチェックの理由も含みます。また、保持済みのクロールのスコープ区間に基づいて、#759
所見を正確に選択できるようにしました。
#759 (GitHub の issue)追加動作中保存済みのネイティブスキャンとレガシーの実行成果物向けに、オフラインのクロール診断を追加#758
保存済みのネイティブスキャンとレガシーの実行成果物に対して、オフラインのクロール診断を追加しました。有界な判断の証跡、実用的な説明、読み取り専用のCLI/MCPアクセスを備えます。秘匿化されたエクスポートは、別のオプトイン式のコマンドとツールとして提供します。
#758 (GitHub の issue)追加動作中定義済みフィルターと有界なページネーションを備えた、バージョン管理された所見ビューを追加#757
定義済みのフィルター、重大度を考慮したソート、列の射影、有界なページネーションを備えた、バージョン管理されたプロジェクトの所見ビューを追加しました。降順では重大な所見が先頭に来て、昇順では通知から重大まで並びます。CLI、MCP、レポート、今後のターミナルでのナビゲーションは、同じ読み取り専用のビューを再利用できます。ソースの証跡、スコアリング、タスク、カバレッジは変更しません。
#757 (GitHub の issue)追加動作中既定で無効のローカル監視計画を追加#756
既定で無効のローカル監視の計画を追加しました。増分と全件更新それぞれの明示的な予算、重複実行の拒否、回復の申し立て、不変の観測由来、部分結果の保持、重複排除されたアラートと回復通知に対応します。この監視機能は、タイマーもクロールも配信チャネルも起動しません。
#756 (GitHub の issue)追加動作中保持済みの完全な監視通知向けに、明示的に注入されるサービス配信アダプターを追加#756
保持済みの完全な監視通知を配信するための、明示的に注入されるサービス配信アダプターを追加しました。認可されたプロジェクト単位の宛先と、耐久性のある受領記録ストアが必要です。デフォルトでは、トランスポート、アカウント、タイマー、宛先のいずれも有効になりません。
#756 (GitHub の issue)変更動作中監視の申し立て、カバレッジ、配信を再起動に強くする#756
保持された監視の申し立て、カバレッジ、キャッシュの来歴、派生した回復証跡、任意のサービス配信を、再起動に強くしました。
#756 (GitHub の issue)追加動作中リース期限付きの単発監視コレクターを追加#756
リース期限付きの明示的な単発監視コレクターを追加しました。キャッシュを考慮して証跡を保持し、配信の受領記録はローカルのみに残します。
#756 (GitHub の issue)追加動作中
verify-fixes/seo_verify_fixesを追加:保存済みの検出結果やURL一覧から、対象URLだけを再チェック…#755
#755 (GitHub の issue)verify-fixes/seo_verify_fixesを追加しました。保存済みの検出結果ID、検証ビュー、または明示的なURL一覧から、対象URLだけを上限付きで再チェックします。記録済みのクロールポリシーを再利用し、既存の成果物を上書きしない別の検証成果物と、要点を絞ったレポートを出力します。結果は「解決済み」「継続」「変化」「検証不可」に区別されます。既存のafter監査は、固有のスキャンUUIDと記録済みの後続の観測時刻がある場合に限り、ネットワークアクセスなしで検証できます。未計測のデータやサイト全体の証拠が、「修正済み」と表示されることはありません。変更動作中ネイティブURLクロールで、発見したルートを最終ファイル名の拡張子で絞り込めるように…#749
ネイティブURLクロールでは、リクエストの前に最終ファイル名の拡張子で発見したルートを絞り込めます。また、実際のレスポンスの
#749 (GitHub の issue)Content-Typeで、解析や本文の保持の前に絞り込むこともできます。両方の段階で判断内容を記録し、リンク、ステータス、ヘッダー、リダイレクトの証拠は保持します。絞り込まれたHTMLのメタデータは、未計測であることを明示したままです。スクリプトとスタイルシートのリソースは、独立した選択ルールとバイト予算を維持します。変更動作中HTML本文が取得できない場合、本文由来の検出結果に明示的なスキップ範囲を残すように…#749
HTML本文が取得できない場合でも、本文由来の検出結果には、明示的な「スキップ」のカバレッジを残すようになりました。パーサーの既定値を「問題なし」とも「確認済みの欠落」とも扱いません。
#749 (GitHub の issue)追加動作中検出結果に対する分析後のURLパターン除外を、監査可能な形で追加#748
抑制された検出結果は、一致したルールと理由とともに、audit JSONとreport-buildのエクスポートに残ります。有効な検出結果の合計、スコア、タスクリストは、設定されたポリシーを反映します。ネイティブのスキャン成果物には、オフラインで再分析できるようポリシーを保存します。ルール数とフィールド長には上限があります。
#748 (GitHub の issue)追加動作中
scan-export(seo_scan_export)を追加:読み取り専用でオフラインのスキャンデータ出力…#747読み取り専用でオフラインのスキャンデータ出力
#747 (GitHub の issue)scan-export(seo_scan_export)を追加しました。バージョン付きの契約scan_export.v1に基づき、検証済みのscan.v1SQLite成果物、またはSF Analyzerのaudit.jsonを読み込みます。出力形式は、CSV(レコード種別ごとに1ファイル+マニフェスト)、XLSX(書き込み専用のブック)、ストリーミング対応のJSONエンベロープ、または文書化されたXML文書です。各出力には、由来情報、書き出した行数、実行統計、そして明示的なカバレッジが含まれます。カバレッジには、どのチェックが実行され、スキップされ、無効化され、または集計対象外になったかが含まれ、フィールドの選択では取り除けません。--recordsと--fieldsによって、ページ、リンク、検出結果のレコードを検証付きで絞り込めます。不明なレコード種別やフィールド名は、出力ファイルを作成する前に拒否されます。値が存在しない場合は、ゼロに置き換えず明示的に残します(JSONはnull、XMLはstate="absent"、CSV/XLSXは\N)。XML出力は生成されたシリアライズで、UTF-8のエスケープを正しく行います。呼び出し元が与えたXML、DTD、スタイルシート、エンティティを解析することはありません。CSV/XLSXは既存の数式インジェクション対策を維持します。XLSXはExcelの行・列・セルテキストの上限を超えた場合、切り詰めずに拒否します。シリアライズに失敗した場合は、もっともらしい不完全な成果物を残しません。変更動作中
crawl-siteに、記録された外部リンク先をオプトインで上限付きチェックする機能を追加しました。discovery.external.crawl#746は、内部クロールのキューが閉じた後に独立したフェーズとして実行されます。各リンク先(重複を除いたもの)は一度だけ取得し、それぞれ独自の
#746 (GitHub の issue)external_checks.max_targets/max_hosts/max_requests/max_depth/max_redirectsの予算に従います。ホストをまたぐ再帰的な探索は行いません。結果(取得済み、失敗、ブロック、理由となったルールを付けたスキップ)は、実行ディレクトリのexternal_checks.jsonlに追記されます。結果には元ページの由来情報が残り、再開をまたいでも保持されます。使い切った予算は、再開時に開き直されません。カバレッジはdiscovery.external_checksに、内部クロールの完全性とは別に報告されます。discovery.external.storeが必要で、ネイティブSQLiteルート(--scan-out)では、そのコレクターにフェーズが実装されるまで名指しで拒否されます。追加動作中ネイティブクロールに、明示的で検証済みのHTTPフォワードプロキシ方針を追加#745
ネイティブクロールで、ページ、サイトマップ、リソース、固定構成のブラウザのリクエストすべてに、明示的で検証済みのHTTPフォワードプロキシ方針を適用できるようになりました。経路の由来情報は、機密部分をマスキングして記録します。
#745 (GitHub の issue)変更動作中ネイティブクローラーのレンダリングで、ブラウザを設定から選べるように…#744
ネイティブクローラーのレンダリング工程で、ブラウザをChromiumに固定せず、設定から選べるようになりました。
#744 (GitHub の issue)rendering.browser.engineで、chromium(既定のまま)、firefox、webkitを選択できます。いずれも同じ保護されたPlaywrightの経路を使います。未知のエンジン名は、起動時ではなく設定の検証時に失敗します。指定したエンジンのバイナリがインストールされていない場合は、黙ってChromiumにフォールバックせず、修正方法(playwright install <engine>)を示した依存関係エラーを報告します。Firefoxの公式な制限もそのまま守られています。Firefoxではrendering.browser.mobile_emulation(is_mobileは非対応)を拒否します。一方、独立したrendering.browser.touch_emulation(has_touch)は、引き続きコンテキストに渡されます。プローブと完全なレンダリングは同じ有効設定を共有するため、パターンがレンダリングへエスカレーションされる際に、その証拠を生成したものと異なるブラウザで判定されることはありません。変更動作中
rendering.browser.viewport_widthとrendering.browser.viewport_height#744で任意のビューポートサイズを指定可能に…
#744 (GitHub の issue)rendering.browser.viewport_widthとrendering.browser.viewport_heightで、既存のdesktop/mobileプリセットに加えて、任意のビューポートサイズを指定できます。プロファイルの決定は従来どおり、既存のプリセットが担います。幅と高さはペアで指定する必要があり、1〜16384pxに制限されます。カスタムのペアはプリセットの寸法だけを置き換えます。モバイルやタッチのエミュレーションを意味するものではありません。それらは運用者が明示するフラグのままです。変更動作中
rendering.browser.page_concurrencyで、エスカレーション中の同時ブラウザ取得数を制限…#744
#744 (GitHub の issue)rendering.browser.page_concurrencyで、エスカレーション中に同時に進行するブラウザ取得数を制限できるようになりました。この設定は、HTTPクロールの礼儀(負荷の抑制)を管理するspeed.concurrencyとは独立しています。既定値の1は従来どおりの逐次動作で、プールは一切作成しません。1より大きい値では、プローブとレンダリングが上限付きのワーカープールで実行されます。判定、コミット、SQLiteへの書き込みはすべてオーケストレーターのスレッドで、投入順に行われます。レンダリングの期限、URL予算、サンプリングと全件のポリシーは並行実行でも維持されます。停止したバッチは、開始済みのページの処理を終えるまで待機し、新しいページはスケジュールしません。中断または失敗したワーカーが、呼び出し後にスレッド、ページ、コンテキスト、ブラウザを残すことはありません。変更動作中選択したエンジン、実際に報告されたバージョン、有効なビューポート、同時実行数をマニフェストに記録…#744
選択されたエンジン、実際に報告されたバージョン、有効なビューポート、設定されたページの同時実行数を、クロールのマニフェストとフィンガープリント、そしてレンダリングされた各ドキュメントのレンダラーの由来情報に記録します。失敗した試行も含みます。失敗した試行では、要求された内容を記録し、成功したレンダリングを捏造しません。両方のエスカレーション経路が設定を尊重します。ディレクトリクロールとネイティブSQLiteスキャンです。
#744 (GitHub の issue)rendering.rendered_links.crawlが有効な場合、レンダリング後のリンク候補も、既存の重複排除付きの受け入れ処理を経てフロンティアに入ります。追加動作中設定したページネーションとフィルターURLパターンのcanonical方針チェックを、SF exportとネイティブクロール監査に追加…#727
SF exportとネイティブクロールの監査パイプラインに、設定されたページネーションとフィルターURLパターンのcanonical方針をチェックする機能を、オプトインで追加しました。ページネーションのルールは、自身、先頭ページ、ランディングページを対象に指定できます。フィルターのルールは、自身またはランディングページを指定できます。ポリシーが未設定の場合や、対象がクロールの証拠に含まれない場合は、未計測のままです。リンク先のステータスコードのチェックは、別の項目として保たれます。
#727 (GitHub の issue)追加動作中GSC検索パフォーマンスのアーカイブを、共有のローカル履歴SQLiteに再開可能な形で追加#718
共有のローカル・プロバイダー履歴SQLiteストアに、再開可能なGSC Search Analyticsアーカイブを追加しました。
#718 (GitHub の issue)gsc-archiveとseo_gsc_archiveで一貫して利用できます。オフラインのステータス確認、明示的な準備、上限付きの収集、検証済みのスナップショットは、すべて同じコアを共有します。変更動作中プロバイダーとエンジンの由来情報、NULL可の指標を保持し、未カバー範囲だけをキューに…#718
プロバイダーとエンジンの由来情報、およびNULL可の指標を保持し、未カバーの可用性範囲だけをキューに入れます。クォータ待ちの時間と、上限付きの一時的な再試行も保存します。
#718 (GitHub の issue)追加動作中GA4、Metrika、GSCのウェブのクエリ/ページ、Yandex Webmasterの日次データを1つのローカルSQLite履歴に…#716
GA4、Metrika、GSCのウェブのクエリ/ページ、Yandex Webmasterの日次データを、バージョン管理された1つのローカルSQLite履歴に保存します。日単位の置き換えはアトミックに行われます。カバレッジは、要求済み、空、部分的、失敗、遅延のいずれかとして明示されます。
#716 (GitHub の issue)追加動作中共有CLIとローカルMCPで、決定的で上限付きの同期、オフラインのステータス、JSON/CSVエクスポートを提供…#716
共有CLIとローカルMCPを通じて、決定的で上限付きの同期、オフラインのステータス確認、JSON/CSVのエクスポートを提供します。指標の加法性と、保守的に扱うタイムゾーンのメタデータも含みます。認証情報やプロバイダーのデータは、リポジトリには保存しません。
#716 (GitHub の issue)変更動作中SF Mode A:インストール済みCLIの要求エクスポート機能を検証し、完全な新しいエクスポートセットを必須に…#715
SF Mode Aは、インストール済みCLIの要求されたエクスポート機能を検証するようになり、分析の前に完全で新しいエクスポートセットを必須とします。フルプロファイルの由来情報には、検証済みのエクスポートマニフェストとクロール速度の読み戻し結果が記録されます。明示的なレート制限は、ベースの設定が欠落しているか無効な場合、クロールの前に失敗します。
#715 (GitHub の issue)変更動作中
metrika-report(seo_metrika_report)とMetrikaClient.report():Reporting#714APIの拒否応答を月単位のスライスで再試行…
#714 (GitHub の issue)metrika-report(seo_metrika_report)とMetrikaClient.report()では、Reporting APIの「Query is too complicated」という拒否応答を、5〜15秒のバックオフを挟んで暦月単位のスライスで再試行するようになりました。それでも拒否されるスライスは、accuracy=0.1のサンプリングで再送します。互いに重ならない期間をまたいで加算できることが証明できる指標(ym:s:visits、ym:s:pageviews)だけを統合します。ユニークユーザー数、割合、平均、または検証できない指標を含むクエリは、誤った合計値を返す代わりに、最初のスライスのリクエストの前に拒否します。スライスは取得しながら統合され、ダウンロードも制限する1つのグローバルな行数上限の下に置かれます。上限に達すると、残りのパーティションは一切リクエストせず、その日付範囲をsplit.unfetchedに記載します。途中で止まったスライスは、自身の範囲をpartialとともにそこに記載します。未照会の期間があるために期間全体のtotal_rows/totalsを確定できない場合は、不明のままとします。返される窓は部分的(partial)と記されます。統合された回答には、呼び出し元のsort(ディメンションと指標、またはAPIの既定値である最初の指標の降順)を再適用し、offset/limitの窓は統合後のグローバルな結果セットから取ります。サンプリングのフィールドは、APIが実際に報告した値(sampled、最悪のsample_share)を反映します。報告しないスライスがある場合、期間全体の値は不明のままです。CLI/MCPの回答ではnullとなり、捏造したfalseにはなりません。contains_sensitive_dataはスライス全体の論理和です。min/maxは統合後の行から再計算します。欠落している、または不正な指標のセルと合計は、ゼロとして扱わず、本文をincompleteとマークします。splitブロックには、要求された期間と解決された期間、使用したタイムゾーン、スライスごとのaccuracy、試行回数、破棄された行、サンプリングのメタデータが残ります。失敗したパーティションは、完了した範囲と、使い切ったaccuracyを名指しします。相対日付(today、NdaysAgo)は、リクエストのtimezone、またはカウンターのゾーン(time_zone_name、なければ分単位のオフセット)で解決されます。ホストの日付では解決しません。日付に変換できない期間(monthのような略記など)も、エラーを再送出する前に、再試行とサンプリングを行います。明示的なaccuracyは、文書化されたすべての形式で尊重されます(low/medium/high/full、または"1"のような数値の割合)。最後の手段のサンプルより高い値は、accuracy=0.1のフォールバックに置き換えられます。一方、呼び出し元がすでに低く設定している場合(lowやそれ以下の割合)は、より高い値にサンプリングし直すことなく、その設定を維持します。範囲全体の拒否された呼び出しを含め、試行したすべてのリクエストは支出ジャーナル(spend journal)に記録されます。変更動作中Yandex Webmaster:
indexing操作が、実在するv4エンドポイントを読むように…#713Yandex Webmaster:
#713 (GitHub の issue)indexing操作は、存在しない/search-urlsの代わりに、実在するv4エンドポイント/indexing/samplesを読むようになりました。新しいbroken_links_samplesは/links/internal/broken/samplesを読みます。ページングは、各エンドポイントに文書化されたページサイズの上限(クエリは500件、サンプル一覧は100件)を守るようになりました。以前のように、どこでもlimit=500を送ることはありません(#713)。変更動作中Yandex Webmasterのページング収集で、各ページの
countとリストの形状を検証…#713Yandex Webmasterのページング収集は、各ページで文書化された
#713 (GitHub の issue)countとリストの形状を検証するようになりました。返された行数を下回るcountも含みます。各ページは残りの行数の上限分だけを要求するため、max_rowsによる打ち切りが、誤ってcompleteと判定されることはありません。単一の非ページングのページは、上限付きのスライスとしてreturned/truncatedを公開します。未読の行が残る場合は必ずpartialと報告します。不正なページは失敗させ、空の完全な結果を装うことはしません(#713)。変更動作中Render-checkが、プラットフォームの信頼に加えて明示的に選んだCAを使い、POSTを再送…#709
Render-checkは、プラットフォームの信頼に加えて明示的に選択したCAを使用し、固定されたPOSTのサブリクエストを再送します。また、証明書の検証の失敗を、トランスポートの詳細を含めずに報告します。
#709 (GitHub の issue)変更動作中固定プロキシ経由のTLS検証失敗を認識し、明示的なフィクスチャCAの信頼を検証…#709
固定プロキシのトランスポートにおけるTLS検証の失敗を認識するようになりました。また、自前で用意した合成のCONNECTインターセプターを通して、明示的なフィクスチャCAの信頼、POSTの再送、レスポンスの上限、プライベートターゲットの拒否を検証します。プラットフォームの信頼設定は変更しません。
#709 (GitHub の issue)
2026年10月3日
5 追加8 変更1 修正追加動作中
crawl-importを追加:明示的にマッピングしたサードパーティ製クロールCSVを取り込み…#819明示的にマッピングしたサードパーティ製のクロールCSVバンドル向けに
#819 (GitHub の issue)crawl-importを追加しました。取り込み元の由来情報、フィールドごとのカバレッジ、重複した観測、利用できないデータをthird_party_crawl.v1に保持します。結果はネイティブスキャンやSF監査として扱いません。追加動作中リモートのPlaywrightブラウザ経路を、明示的なエンドポイントとバージョン確認付きでオプトイン可能に#808
明示的なエンドポイントとバージョン確認、安全な失敗状態を備えた、オプトインのリモートPlaywrightブラウザ経路を追加しました。ローカル起動へのフォールバックはありません。ローカルでのレンダリングの既定動作は維持されます。
#808 (GitHub の issue)追加動作中観測済みの最短経路と逆方向の被リンクを、Pythonで読み取り専用に検索可能に#805
保持されたスキャンのリンクを対象に、上限付きで決定的、かつ読み取り専用の観測済み最短経路と、逆方向の被リンク(reverse-inlink)検索をPythonのクエリとして追加しました。各ホップにはスキャンレコードの識別子を付け、部分的なグラフのカバレッジを明示します。
#805 (GitHub の issue)変更動作中プロバイダーワークフローのルーティング回帰テストを、修正されたArsenkin Wordstatの頻度リクエスト仕様に合わせる#779
プロバイダーワークフローのルーティング回帰テストを、修正されたArsenkin Wordstatの頻度リクエスト仕様(contract)に合わせました(#720、#779)。
#779 (GitHub の issue)追加動作中
docs/PROVIDERS.mdを追加:プロバイダー機能と専門ワークフローの生成マトリクス…#779プロバイダーの機能と専門ワークフローを示す、生成済みのマトリクス
#779 (GitHub の issue)docs/PROVIDERS.mdを追加しました(#779、エピック #753)。ライブのプロバイダーレジストリと、seohead/core/provider_matrix.pyにある厳選したワークフローのカタログから、scripts/generate_provider_matrix.pyで生成します。ワークフローごとに、提供コマンド、認証、コストとクォータ、プライバシー区分、制限事項、そしてprovider-joinによるCSVのフォールバックを記録します。ステータスは、対応、部分対応、非対応、未検証を区別します。ライブで検証済みと表示されるプロバイダーはありません。明示的に非対応の作業は名前で列挙します。すべてのサービスを対応していると主張せず、段階的な最初のリリースを選んでいます。コミット済みのドキュメントとレジストリの差異は、tests/test_docs_drift.pyとtests/test_provider_matrix.pyで検出されます。修正動作中
keywords-exact/seo_keywords_exactを修正:一度も結果を返せなかった問題…#720
#720 (GitHub の issue)keywords-exact/seo_keywords_exactを修正しました。このツールは一度も結果を返せませんでした。タスクが存在しないArsenkinツールkeywords_frequency向けに作られていたため、すべての呼び出しが404 WRONG_TOOLで応答していました。完全一致の!Wは、今後type=1を指定したwordstatツールに送られ、フレーズの配列はqueriesの下に、地域は単一要素のリストとして渡されます。変更動作中
!Wではoveralセレクターを指定:Arsenkinのwsの値は別々の演算子…#720
#720 (GitHub の issue)!Wのリクエストにはoveralセレクターを指定します。Arsenkinのwsの値は、それぞれ別の演算子です。baseは広い一致(WS)、quotedはフレーズ一致(「WS」)、overalは!Wが求める完全な語形(!WS)、exactは語順を厳密にした形([!WS])です。変更動作中送信前にプロバイダーが拒否する記号を除去:
/を含むフレーズ1つでバッチ全体が失敗していた問題…#720送信前に、プロバイダーが拒否する記号を取り除くようになりました。
#720 (GitHub の issue)/や引用符を含むフレーズが1つあるだけで、バッチ全体が422 JSON_VALIDATION_ERRORで拒否されていました。書き換えたフレーズはcleanedで返されるため、呼び出し元は、どのフレーズが別の形で計測されたかを確認できます。変更動作中
frequenciesを{phrase: {"base": N, "overal": N}}形式で、生のプロバイダーのペイロードと並べて返す…#720
#720 (GitHub の issue)frequenciesを{phrase: {"base": N, "overal": N}}の形式で、生のプロバイダーのペイロードと並べて返します。結果が別の地域のみを示すフレーズは、その地域の数値を借用せず、除外してwarningsに記載します。追加動作中Topvisorへの読み取り専用アクセスを、共有CLIとMCPハンドラーで上限付きに追加#719
共有CLIとMCPハンドラーを通じて、Topvisorへの読み取り専用アクセスを上限付きで追加しました。認証情報は中央管理のファイルで扱い、ページングは明示的に行います。有料チェックの操作はありません。
#719 (GitHub の issue)変更動作中
sources-doctorのレガシーなsources.gscブロックをprovider_status.gscと揃える…#717
#717 (GitHub の issue)sources-doctorのレガシーなsources.gscブロックを、provider_status.gscに揃えました。readyと新しいcomponentsフィールドは、ベアラーファイルだけでなく、同じ認証コンポーネント(OAuthベアラー、永続的な付与、またはサービスアカウント)から算出されるようになりました。そのため、設定済みのサービスアカウントが「GSCは設定されていません」と誤表示されることはありません。サービスアカウントのコンポーネントは、JSONドキュメント自体を検証するようになりました(プライベートな通常ファイル、サイズ上限、service_account型、正確なGoogleのトークンURI、必須フィールド)。両方のdoctorブロックは、安全なservice_account_statusの列挙値を報告します(missing、unsafe_file、too_large、unreadable、malformed_json、unsupported_shape、configured_unverifiedのいずれか)。これにより、内容を露出させることなく、サイズ超過、読み取り不可、不正なファイルを、設定済みだが未検証のものと区別できます。変更動作中
crawl-siteのスキャン成果物に、受理済みのフロンティア行がすべて終端状態に達したらfinished_atとfinishedを記録…#712
#712 (GitHub の issue)crawl-siteのスキャン成果物は、受理したすべてのフロンティア行が終端状態に達した時点で、finished_atとfinishedのライフサイクルを記録するようになりました。保持された証拠が部分的な実行も含みます。crawl_partialは省略された観測をすでに明示しているため、キューが空になっても、scan-status、scan-list、履歴では中断されたキャプチャとして読まれなくなりました(#712)。明示的に停止した実行(受理作業の前に中止された、キャンセルされた、またはエラーサーキットによって停止された)は、キューが空になった後も、interruptedと記録された理由を保持します。resume_or_finalizeを経由する場合も同様です。そのため、停止の経路が誤った完了時刻を受け取ることはありません。変更動作中
duplicate-check --scanとboilerplate-report --scanで、保持されたコーパスを通常サイズのサイトでもストリーミング処理…#710
#710 (GitHub の issue)duplicate-check --scanとboilerplate-report --scanは、通常サイズのサイトでも落ちることなく、保持されたコーパスをストリーミング処理するようになりました。スキャンの「開く・検証する」段階の期限はアーティファクトのサイズに応じて割り当てられ、各ドキュメントの読み込みにはそれぞれ独自の期限があります。そのため、1.5千ページのコーパスがinterruptedで終わることはありません。コーパスの入力バイト予算は、生のHTMLサイズではなく、アナライザーが実際に保持するものを計測します。重複チェックでは抽出されたMarkdown、ボイラープレートでは1ページごとのダイジェストです。コーパスの上限に達した場合は、部分的なカバレッジとして報告し、準備済みと対象の正確な件数、および読み取りを止めた上限を示します(#710)。変更動作中Metrikaの
report()とby_time()は、offset < 1をValueErrorでローカルに拒否…#707Metrikaの
#707 (GitHub の issue)report()とby_time()は、offset < 1をReporting APIに転送する代わりに、ローカルでValueErrorにより拒否するようになりました。Reporting APIはoffset=0にHTTP 400で応答していました。新しいオフラインのテストで、metrika-report、seo_metrika_report、provider-collectのaggregate_reportにわたる1始まりの仕様を固定しました。また、ページングの停止条件(total_rows、ROW_CAP)が、既定以外のoffsetより前にスキップされた行も数えることを検証します(#707)。
2026年10月2日
1 追加2 変更変更動作中macOSの
metrika-traffic-pdf:PDF書き出し後もChromeが起動したままになる問題を修正#731macOSでの
#731 (GitHub の issue)metrika-traffic-pdfを修正しました。以前は、ChromeがPDFを書き出した後も起動したままでした。現在はブラウザの起動を待たずに開始し、PDFの検証が済んだ後に停止します。変更動作中Yandex Webmaster:
user_idをトークンから解決し、読み取り専用の操作を追加…#713Yandex Webmaster:
#713 (GitHub の issue)user_idはトークンから解決されるようになりました。新しい読み取り専用の操作として、summary、diagnostics、sqi_history、search_history、query_history、in_search_history、events_history、indexing_history、important_urls、broken_links_history、external_links_historyを追加しました。日付と指標にはparamsを指定できます。クエリ一覧とクロールサンプル一覧のページングにも対応しました(#713)。追加動作中新しい技術スキル
traffic-report:Metrika、Webmaster、Search Consoleから、クライアント向けの月次・年次レポートを作成…新しい技術スキル
traffic-reportを追加しました。Metrika、Webmaster、Search Consoleから、クライアント向けの月次または年次レポートを作成します。コンバージョンを訪問数として計上すること、目標値の妥当性チェック、商品、購入者像、スライドの作成ルールを扱います。
2026年10月1日
1 追加1 変更追加動作中
metrika-traffic-pdf(seo_metrika_traffic_pdf)を追加:A4横向きの静的なトラフィックレポート…#731
#731 (GitHub の issue)metrika-traffic-pdf(seo_metrika_traffic_pdf)を追加しました。Yandex Metrikaのデータから、アナリティクスのダッシュボードのレイアウトに沿った、静的なA4横向きのトラフィックレポートを作成します。収集とレンダリングは別の工程です。収集では、Reporting API(無料・読み取り専用のリクエスト約40件)から、1つのseohead.metrika-traffic/1ドキュメントを作成します。内容は、KPIカード9枚(ユーザー数、訪問数、PV、訪問あたりのページ数、1日あたりの訪問数、直帰率、平均訪問時間、2〜3回訪問したユーザーの割合、新規ユーザーの割合)、日別の推移、3・6・12か月の期間とその直前の期間との比較、検索エンジン、都市、国、デバイス、年齢、性別、上位のランディングページと検索フレーズ、そして全流入チャネルです。各カードには、同じ長さの直前期間との比較と、1年前の同じ日付との比較が付きます。レンダリングでは、そのドキュメントを、インラインSVGのグラフを含む自己完結型のHTMLに変換し、ローカルにインストールされたChrome、Edge、Chromiumを使ってPDFに出力します(SEOHEAD_CHROMEで探索を上書きできます)。ブランディング(名称、色、フォントスタック、ロゴのテキスト)と、英語またはロシア語のラベルは入力として指定します。Search Consoleのクエリ行は、任意のページとして追加できます。帰属(アトリビューション)の既定値は、最後の有意なソースです(ym:s:lastSignTrafficSource、およびそのエンジンとフレーズのディメンション)。これはMetrikaの画面が報告する値と同じです。ラストクリックのディメンションは数パーセント異なり、明示的なattribution=last_clickを指定したときにのみ使われます。APIは行を1から数えるため、すべてのリクエストにoffset=1を指定します。欠損データは見える形で残します。各ブロックには、理由付きのok、unavailable、skippedのいずれかを付与します。比較対象のない変化量はゼロではなくnullとします。ブラウザが見つからない場合はHTMLを残し、PDFは「スキップ」と報告します。out_dirの既存ファイルは、overwrite=trueの場合にのみ置き換えます。変更動作中Metrikaのレポートは
offset=1から開始:Reporting APIが1始まりのため…#707Metrikaのレポートは
#707 (GitHub の issue)offset=1から始まります。Reporting APIは1始まりで、offset=0で送られたリクエストには、すべてHTTP 400で応答していました(#707、#728、#729)。
2026年9月26日
1 追加追加動作中H1〜H6のレベル飛びに対する
HEADING_SKIPの証拠を、ネイティブクロールに追加…#725ネイティブクロールに、対象となる本文領域内のH1〜H6のレベル飛びを示す
#725 (GitHub の issue)HEADING_SKIPの証拠を追加しました。ヘッダー、フッター、ナビゲーション、サイドバー、明示的に非表示になっている見出し、閉じたダイアログの見出しは除外します。そのため、テンプレートのUIによって誤った階層の検出結果が生じることはありません。Screaming Frogのエクスポートのみの実行では、このチェックは利用不可として報告されます。
2026年9月23日
1 変更変更動作中Windowsで非公開のシークレットファイルを受け入れ、ブラウザの同意スクリプトを追加#708
Windowsには POSIX のパーミッションビットが存在しないため、非公開のシークレットファイルを受け入れるようになりました。また、読み取り専用のSearch Console付与を保存するブラウザの同意スクリプトを追加しました。
#708 (GitHub の issue)
2026年9月13日
2 追加3 変更2 修正追加動作中Windowsでネイティブ SQLiteの書き込み、履歴、再試行、スナップショット、再分析、プロジェクト公開に対応…#705
Windowsで、ネイティブSQLiteの書き込み、履歴、再試行、スナップショット、再分析、プロジェクトの公開に対応しました。OSのバイト範囲ロックと、移植可能な空き容量チェックを使います。POSIXのディレクトリのフラッシュは従来どおり行います。Windowsでもファイルのフラッシュとアトミックな公開は利用できますが、POSIXのディレクトリfsyncによる保証はありません。移植可能なワークフローは、WindowsのCIと、分離されたLinux実行環境で検証しています。
#705 (GitHub の issue)修正動作中新しいHTMLParserのスクリプトオプションがない古いPythonでも、生テキストHTMLのスキャンが動くように#705
新しいHTMLParserのscriptingオプションがないPythonでも、生テキストHTMLのスキャンが動作するよう維持しました。Windows版のPython 3.12ディストリビューションも含みます。
#705 (GitHub の issue)修正動作中Google構造化データとGooglebotのガイダンスを修正し、出典を明記(FAQ/HowToを含む)#704
Googleの構造化データとGooglebotのガイダンスを修正し、出典を明記しました。FAQ/HowToの利用可否と、構造化データのポリシーがもたらす影響を含みます。
#704 (GitHub の issue)変更動作中サイトのルートから
robots.txt経由でサイトマップを検出し、/sitemap.xmlにフォールバック…#703サイトのルートから
#703 (GitHub の issue)robots.txt経由でサイトマップを検出し、見つからない場合は/sitemap.xmlにフォールバックします。すべてのサイトマップの展開が失敗した場合は、ok: falseと報告します。変更動作中サーバーが設定した匿名Cookieの後でも、ネイティブクロールを再開できるようにしました。新しいセッションは記録しますが、Cookieの値は保持しません。認証情報付きのクロールと、#702
永続プロファイルを使うクロールは、引き続き再開できません。
#702 (GitHub の issue)変更動作中保存済みスキャンのパスは
--scan、インラインJSONは--inputに統一しました。旧来のスキャンパス指定の--inputと#701
#701 (GitHub の issue)--json-inputは、1リリースの間、警告付きで引き続き動作します。追加動作中上限付きの匿名の no-store 証拠の保持に、既定でオフの明示的な確認を追加#700
上限付きの匿名
#700 (GitHub の issue)Cache-Control: no-storeの証拠を保持するための、明示的な確認(既定ではオフ)を追加しました。認証情報付きの本文は、引き続き除外します。
2026年9月9日
10 追加9 変更2 修正追加動作中保存済みのスタック情報を使ったプロジェクト優先度のプレビューと、バージョン管理された方針の適用を追加…#694
保存済みのスタック情報を使い、オフラインでのプロジェクト優先度のプレビューと、バージョン管理された方針の明示的な適用を追加しました。運用者が行った選択は保持され、方針の履歴はアトミックに保存されます。人が読むレポートでは、対応する優先度の説明も表示されます。
#694 (GitHub の issue)修正動作中実行時チェックを変えずに、JavaScriptレンダリング、canonical、URLの衛生、
notranslateのガイダンスを修正#692実行時のチェックや重大度を変更せずに、JavaScriptレンダリング、canonical、URLの衛生(URL-hygiene)、
#692 (GitHub の issue)notranslateに関するガイダンスを修正しました。追加動作中ソースから導出されたカタログを同梱した、ポータブルなプロジェクトのチェックリスト機能を追加#686
ポータブルなプロジェクトのチェックリスト機能を追加しました。ソースから導出されたカタログを同梱し、再利用可能なカスタムテンプレート、定義と証拠の履歴、楽観的な並行書き込み、手動および成果物のレビューを扱えます。保留(pending)、陳腐化(stale)、ブロック(blocked)の各ビューはオフラインで表示でき、CLI、MCP、およびプロジェクトに紐づいた人向けレポートで共有されます。
#686 (GitHub の issue)追加動作中フロンティアとコミット済みHTTP結果のネイティブスキャン・ステータス要約(読み取り専用)を追加#685
フロンティアの母集団とコミット済みのHTTP結果について、読み取り専用のネイティブスキャン・ステータス要約を追加しました。
#685 (GitHub の issue)追加動作中明示的な保留状態のチェックリストと準備状態を備えた、ポータブルなローカルのプロジェクトワークスペースを追加#678
ポータブルなローカルのプロジェクトワークスペースを追加しました。チェックリストの保留状態と準備の状態を明示的に持ちます。
#678 (GitHub の issue)追加動作中Google Search Centralのガイダンスレビューをリポジトリに記録:読了した175件のガイド…#677
Google Search Centralのガイダンスのレビューを、リポジトリに記録しました。読了した175件のガイド、そのラベル、除外、スナップショットの日付、そしてレビューによって行った3件の修正を含みます。
#677 (GitHub の issue)変更動作中URLモードの
crawl-siteは、既定で衝突しないネイティブSQLiteスキャンを書き出す…#676URLモードの
#676 (GitHub の issue)crawl-siteは、既定で呼び出し元のscans/ディレクトリに、衝突しないネイティブSQLiteスキャンを書き出すようになりました。--out-dirは、明示的な従来のディレクトリ指定として残ります。リスト入力と、キャッシュのlive/replay設定は、収集モードを黙って変えるのではなく、そのルートを明示します。変更動作中配布用のクリーンビルドで、ソースのチェックアウトがない場合も検証済みの生成元情報を埋め込む#675
配布用のクリーンビルドは、ソースのチェックアウトがない場合でも、ネイティブSQLiteスキャンの検証済みの生成元の由来情報を埋め込むようになりました。
#675 (GitHub の issue)変更動作中同梱の監査スキル:301のシグナル損失・302の評価消失に関する根拠のない断定を修正#671
同梱の監査スキルにあった、根拠のない「固定の301によるシグナル損失」と「302による評価の完全な欠落」という断定を、恒久・一時の意図とcanonicalターゲットのガイダンスに置き換えました。出典としてGoogle Search Centralを示しています。一時的なリダイレクトは、一時的な変更に対しては引き続き有効です。ステータスコードだけでは、検索順位の低下は測定できません。
#671 (GitHub の issue)変更動作中
render-check --viewport mobileでスマートフォンの診断用識別情報を固定#670
#670 (GitHub の issue)render-check --viewport mobileは、生のリクエストとブラウザーからのリクエストの両方で、安定したスマートフォン用の診断用識別情報を使うようになりました。明示的な--user-agentはCLIとMCPで指定できます。完了または一部完了した比較のすべてに、実際に使われた識別情報とビューポートのサイズが記録されます。追加動作中重複・定型文のコーパス分析用に読み取り専用の
--scan入力を追加#669重複コンテンツと定型文のコーパス分析のために、読み取り専用の
#669 (GitHub の issue)--scan入力を追加しました。保持された本文のカバレッジと出所情報も扱います。追加動作中コマンド入力カタログを生成し、保存方式の決定を文書化#668
生成されるコマンド入力カタログを追加し、スキャン、HTTPキャッシュ、実行ジャーナルの保存先に関する決定を文書化しました。
#668 (GitHub の issue)変更動作中クライアント向けレポートで読み手向けの検出結果名を使用#660
クライアント向けのMarkdown、CSV、XLSX、DOCX、タスクレポートは、レジストリの識別子や収集機能の名前ではなく、読み手向けの検出結果名と保存済みの再現証拠を使うようになりました。証拠が十分でない過去の記録には、その制限を明記しています。JSON形式の監査成果物は変更していません。
#660 (GitHub の issue)追加動作中
project-factsを追加し、プロジェクトのスタック情報を記録#648
#648 (GitHub の issue)project-factsを追加しました。プロジェクト作成後にスタック情報を記録でき、必要に応じて明示的に指定した1回のtech-detect実行(robots.txtを順守)から取得できます。オペレーターが入力した判断は検出された根拠より優先されます。検出できなかった場合や結果が曖昧な場合は、項目を記録せず理由を残します。- 変更動作中READMEの冒頭をプロジェクトコントローラーの説明に変更し、Screaming Frogは同等性の基準ではなく、照合用の2回目の確認として位置づけました。#648 (GitHub の issue)
追加動作中
examples/project-skeletonを結果のない状態で同梱し、project…#648
#648 (GitHub の issue)examples/project-skeletonを、初期化済みで結果のないチェックリスト付きで同梱しました。これにより、そのファイルに対するproject statusはnot_initializedではなくカバレッジの件数を返します。また、そのファイルは稼働中のカタログと照合して検査します。追加動作中プロジェクト準備・証拠・保存済みコーパスの契約を追加#354
プロジェクトの準備、プロバイダー由来の証拠、保存済みコーパス、上限付きの抽出、スキャン証拠、ワークフローとカタログの契約を追加しました。保持される証拠と進捗の境界は明示しています。
#354 (GitHub の issue)変更動作中MCPプロファイルと進捗ラッパーには、MCP SDK 1.29以降が必要#354
MCPプロファイルと、メタデータを保持する進捗ラッパーには、オプションのMCP SDK 1.29以降が必要になりました。
#354 (GitHub の issue)変更動作中READMEを作業の流れに沿って簡潔化
READMEを「タスク、コマンド、成果物」の流れに沿って簡潔にまとめ直し、古い埋め込み画像と宣伝用のカウンターを削除しました。ライブのインターフェースに関する生成済みリファレンスへのリンクは残しています。
変更動作中入力から結果までの実践的な手順をREADMEに追加
入力から結果までの実践的なワークフローをREADMEに追加しました。CLIとMCPの実際の呼び出しに合わせ、保存済みコーパスとブラウザー・プロバイダーの境界も正確に記載しています。
2026年9月8日
8 変更2 修正変更動作中SQLite成果物のドキュメントを実装に合わせて修正#666
SQLite成果物のドキュメントを、出荷済みのネイティブ本文、履歴、オフライン再分析の仕様と一致させました(#666)。後期ページのフィールド表はインポーターのマッピングと照合できるようにしています。古いJSONLの観測値はSQLのNULLのまま残り、作られた「問題なし」の値になることはありません。
#666 (GitHub の issue)変更動作中ネイティブ監査で、未収集の項目を「スキップ」と表示#659
ネイティブ監査で、メタキーワード、2つ目のcanonical、HTTPバージョン、amphtmlのチェックは、元になるフィールドが収集されていない場合にスキップとして表示されるようになりました。
#659 (GitHub の issue)修正動作中レンダリングでサイトのCookieを認証情報扱いせず、DOMの破棄を明示 (#656)#656
JavaScriptレンダリングの工程で、サイトが設定したCookieを運用者の認証情報として読み取らないようにしました。また、実行でレンダリング済みDOMを破棄した場合は、そのことを明示します(#656)。ブラウザーは、サイト自身の
#656 (GitHub の issue)Set-Cookieで受け取ったものを、後続のリクエストでそのまま送り返します。そのため、ページがセッションCookieを設定した後で、同一オリジンのサブリソース(スクリプト、スタイルシート、画像など、ウェブでごく普通の形)を1つ要求すると、レンダラーのリクエストフックが通信上のCookie:を読み取り、http.credential_headers = []の実行であっても、そのページのシリアライズ済みDOMをomitted/credentialedとして保存していました。レンダリングごとにブラウザーのコンテキストが新しく作られるため、損失はページ単位で、累積はしません。Cookieを設定したページは、それぞれ自分のDOMを失い、実行結果は完全な場合と同じようにページ、リンク、エスカレーションの件数を報告していました。レンダリング済みドキュメントのcredentials_usedは、実行に設定された内容だけから決まるようになりました。つまりhttp.credential_headersか永続的なブラウザープロファイルです。これはcrawl/sqlite_render.py::_policy_factsがすでに導出してレンダラーに渡している値です。レンダラーは認証情報を持たない独自のネットワーククライアントを作るため、通信から追加される情報はありませんでした。設定された認証情報があるクロールでは、従来どおりそれらのDOMはcredentialedとして省かれ、Cookieの値が保存されることもありません。変更動作中
partialフラグでは分からないレンダリング件数を明示#656
#656 (GitHub の issue)crawl-siteの結果のrendered_bodiesに、保持されたレンダリング済みDOMの件数と、保持されなかったものごとの理由が含まれるようになりました。CLIも完了行の横にその内訳を表示します。以前は、欠けたDOMが1件でも全件でも、同じく「partial」とだけ示す機能フラグに任せていました。何も破棄されなかった実行では、追加の表示はありません。件数はスキャン成果物から読み戻されるため、完了後のスキャンでも同じ内容を確認できます。変更動作中ネイティブクロールで
og:urlを収集し、未設定と誤報告しない (#654)#654
#654 (GitHub の issue)rules.check_ogは、値が偽と読める場合にページのmissing_tagsへog:urlを含めますが、ネイティブの処理経路ではそのタグを一度も読んでいませんでした。PageRecordにog_urlがなく、scan_v1.sqlにog_url列がなく、crawl/evidence.pyが作るInternal:AllのプロジェクションにもOG:URLがありませんでした。この列はScreaming Frog側にだけ存在し、normalizeは常にOG:URLを解決していたため、エクスポートではサイトの実際の値が見え、同じサイトのネイティブクロールでは欠陥と報告されていました。測定していない項目が、マークアップの内容に関係なく、すべてのネイティブクロールの全ページで測定済みとして扱われていたことになります。このタグは他の3項目と同じ場所で読むようになりました(パーサーはすでにog:urlとして返していました)。値は NULL 許容のpages.og_urlに保存し、後から追加された他の列と同様に、収集前に書かれたレコードと、タグを宣言していないページを区別できるようにしています。OG:URLとしても投影されます。これは、#646で読み取り側を修正した経路の、収集側の対応です。tests/test_open_graph_seam.pyには、Open Graphはあるがog:titleがないページを持つ3つ目のフィクスチャサイトを追加しました。検出結果が実際に発火し、その一覧を検証できるようにするためです。1つのページはog:urlを宣言しているので未設定として挙がってはならず、もう1つは宣言していないので必ず挙がらなければなりません。最も重要なテストでは、この2ページをクロールから1回、同じ2ページを表すInternal:Allエクスポートから1回、計2回監査し、同じ判定を求めます。#646と#654は、どちらも2つの経路が食い違っていて、それをまたぐテストがなかったことが原因でした。修正動作中サイトのCookieを認証情報扱いせず、ボディ破棄を明示 (#647)#647
クロールは1つのHTTPクライアントを共有し、そのクライアントはCookieジャーを保持しています。どこかのレスポンスで
#647 (GitHub の issue)Set-Cookieが返されると、それ以降のリクエストはすべてCookie:付きで送られ、コーパス書き込み側はそれを認証付きの取得として分類していました。http.credential_headers = []かつcredentials_acknowledged = falseの公開サイトでは、40,920ページ中33,001件のボディが破棄されていましたが、実行結果はページとリンクを完全な場合と同じように報告していました。そのクロールで保存済みHTMLから計算される値(ニアデュプリケート検出、DOMの深さとノード数、定型文の割合、本文内の見出し構造、オフライン再分析など)は、7,903ページ分しか対象にしていないのに、同じレポート内のページ単位の割合はすべて40,920ページ分を対象にしていました。2つの母集団が1つのものとして提示されていた状態です。リクエストが認証付きとみなされるのは、その実行で該当ホストに認証ヘッダーを送るよう設定されている場合だけです。これは、クローラーが組み立てるリクエストに機密ヘッダーが届く唯一の経路であり、http.headersは設定の検証で拒否されます。設定された認証情報があるクロールでは、従来どおりcredentialedとしてボディが省かれ、変更はありません。変更動作中
partialフラグでは分からない件数を明示#647
#647 (GitHub の issue)crawl-siteの結果のhtml_bodiesに、取得したHTMLページのボディのうち保持された件数と、保持されなかったものごとの理由が含まれるようになりました。CLIも完了行の横に表示します。以前は「partial」という1つのフラグに任せていたため、欠けたボディが1件でも5分の4でも同じ表示になっていました。何も破棄されなかった実行では、追加の表示はありません。また、マスキングされたリクエストとレスポンスのヘッダー一覧には、マスキングで除去されたヘッダーの名前がx-seohead-redacted-headersの下に残るようになりました。値は残りません。ボディの扱いが異なる2つのレスポンスが、以前は同一のヘッダー一覧を記録していたため、成果物を読む運用者はボディが欠けた理由を判断できませんでした。変更動作中変更履歴を
CHANGELOG.mdから変更ごとのファイルへ移行(#638)#638変更履歴のエントリーを
#638 (GitHub の issue)CHANGELOG.mdから、変更ごとに1ファイルずつchangelog.d/の下へ移しました。これにより、プルリクエストが、それより前に取り込まれた他のすべてのプルリクエストと衝突することはなくなります(#638)。以前は、どのブランチも## Unreleasedの先頭にエントリーを追加していたため、その1行がファイルの競合箇所になっていました。2セッションで8件のプルリクエストにまたがり9回の手作業の解決が必要になり、そのたびに再プッシュと新たなCI実行が発生しました。解決方法はいつも「自分のブロックを残し、その後に相手のブロック」でした。答えが毎回同じ衝突は情報を持たず、別のことを考えている最中に段落を落とす機会になるだけです。issueが提案していた.gitattributesの修正(CHANGELOG.md merge=union)は、事前に測定して却下しました。union マージは行単位で統合するため、両方のエントリーに同じ行が含まれると(エントリー内の空行だけでも十分です)、1つだけ残して成功と報告し、もう一方のエントリーの行を、競合もなく、誰にも確認を促さずに削除してしまいます。明確に異なる行だけを使った最初のテストは、きれいにマージされ、この問題を隠していました。大きな衝突を静かなデータ損失に置き換えるのは、衝突そのものより明らかに悪いため、採用したのは構造的な修正の方です。変更動作中断片ファイルは
changelog.d/638.mdのように issue 番号で命名#638断片ファイルは、それが閉じる issue にちなんで命名されます(例:
#638 (GitHub の issue)changelog.d/638.md)。この名前は構造上、ブランチごとに一意になります。1つのプルリクエストで2つの issue を閉じる場合は、issue ごとに2つの断片を書きます。何も閉じない変更はno-issue-<slug>.mdと書きます。断片には、変更履歴にそのまま入る形のエントリーを書きます。つまり、継続行を伴う1つ以上のトップレベルの箇条書きです。フロントマターもラッパーもありません。このファイルが持つ複数段落の長い文章のエントリーも、1行に整形されることなく、バイト単位で保たれます。python scripts/build_changelog.pyがリリース時に、それらを## Unreleasedに統合します。順序はファイルシステムが返す順番ではなく、issue 番号です。--pruneを付けると、統合済みの断片を削除します。組み立て処理は、2つのマーカーコメントの間の領域全体を置き換えます(挿入はしません)。そのため、断片を間で削除したかどうかにかかわらず、2回実行すると同じファイルになります。CHANGELOG.mdはプルリクエストごとには再生成しません。これは意図的な判断です。それを常に同期させるゲートを置くと、両方のブランチが同じファイルに戻り、この仕組みで解消した衝突が再び生じるためです。変更動作中
CHANGELOG.mdを読むドキュメントのゲートを変更断片に対応#638
#638 (GitHub の issue)CHANGELOG.mdを読んでいたドキュメントのゲートは、リスクでした。何も検査しなくなったゲートは、衝突よりも悪いからです。2か所を見つけ、どちらも断片を対象にするよう修正しました。tests/test_docs_drift.pyはCHANGELOG.mdをPUBLIC_MARKDOWNに含めていたため、英語のみのゲート、「存在するコマンドだけを参照する」ゲート、件数の古さを検出するゲートは、今ではchangelog.d/*.mdも読みます。2つの件数ドリフトのゲートは、変更履歴を飛ばすのと同じ理由で断片も飛ばします。エントリーは、書かれた時点で正しかったことを記録するものだからです。tests/test_doc_counts.pyは、ライブの件数スキャンから変更履歴を意図的に除外しており、そのファイル一覧はchangelog.d/に届きません。同じ理由で、答えは同じです。tests/test_doc_commands.py、tests/test_docs_commands_execute.py、tests/test_examples_gate.pyは変更履歴をまったく読みません。新しいtests/test_changelog_fragments.pyが、これらの判断をそれぞれ固定します。さらに、断片の命名、決定的な順序、冪等な組み立てを検査します。また、同時に進む2つのブランチがそれぞれ断片を追加した場合に、衝突なくマージされることも確かめます。
それ以前(日付の記録なし)
23 追加30 変更17 修正修正動作中値のない
Set-Cookieヘッダーでも指紋判定を継続(#651)name=valueの組がまったくないヘッダー(emall.byが正しい形のCookie 2つと一緒に送るSet-Cookie: Secure; HttpOnly)は、Cookieジャーの中でCookie(name='Secure', value=None)になり、httpx.Cookies.__getitem__はそれに対してKeyErrorを送出します。そのため、マッピング自身のイテレーターが返した名前についてdict(resp.cookies)が失敗していました。正常に取得できたページでも、tech-detectは標準出力にJSONを出さず、error: 'Secure'だけを表示して終了コード1で終わり、MCPのseo_tech_detectはKeyErrorを呼び出し元へ送出し、site-auditは技術に関するセクションが丸ごと欠けた状態で静かに完了していました。現在のdetect_techは、代わりにCookieジャーを走査します。値のない名前は削除せず、空の値で保持します。複数の指紋(BITRIX_SM_GUEST_ID、craft_session、wfvt_)はCookie名だけで照合するため、削除するとその手がかりが失われるからです。ただし、通常のCookieに黙って正規化されることはありません。名前はmalformed_cookiesに報告され、検出結果でも名指しされるため、サイトが壊れた形で送ったヘッダーは、サイトについての事実として残ります。正しい形のCookieだけを返すレスポンスは影響を受けず、空の一覧を報告します。変更動作中
render-checkが圧縮されたサイトを「壊れている」と誤判定しないように(#650)固定されたレンダリング用のルートは、httpxのデコードされていないストリームからオリジンを読み、そのバイト列を、オリジンの
content-encodingと一緒にPlaywrightへ渡していました。route.fulfillは、受け取った本文にコンテンツコーディングを適用しません。そのためChromiumはgzipをtext/htmlとして解析し、圧縮されたストリームからDOMを組み立てていました。タイトルもh1もcanonicalもリンクもなく、レンダリング後のサイズは転送サイズと同じになります。HTMLを圧縮しているサイト(ほぼすべて)はok: false, reason: incomplete_renderで返され、メッセージはレンダリングに問題があるとして--wait domcontentloadedや、より長い--timeoutを勧めていました。実際にはレンダリングは完全に終わっていたのに、です。seohead.techは、生データ121,793バイトに対して22,435バイトと報告していました。修正後は、実際のタイトルと31件のリンクを含む123,048バイトとして報告されます。ルートは、デコード済みの実体を読むようになりました。転送する内容からはcontent-encodingを削除しています(content-lengthはホップバイホップとして既に削除されていたため、Playwrightは実際に受け取った本文の長さを示します)。また、オリジンに対しては、このクライアントがデコードできるコーディングだけを要求します。Chromium自身のbrやzstdの案内はそのまま転送しません。それでもデコードされないまま届いたコーディングは、リクエストを中断し、その名前を示します。そのまま通すと、同じバグを無言で再現してしまうからです。バイト上限は、レンダラーが見るデコード後のバイト数で数えるようになりました。以前は、圧縮された状態で上限を通過してしまう圧縮爆弾がありました。変更動作中OGをパーサーが実際に書くキーで読み取るように修正(#646)
parse_htmlは、各タグを完全なプロパティ名で保存します({"og:title": ...}。そのdocstringにもそう書かれています)。一方crawl/collect.pyは、同じdictに対して"title"、"description"、"image"を求めていました。dict.getは毎回Noneを返すため、これまでに実行されたすべてのネイティブクロールの全ページで、og_title、og_description、og_imageは空でした。この問題が見つかった実行では、Open Graphを公開しているサイトなのに、40,920ページ中0ページがいずれかを持っていました。これはリポジトリの中心的なルールの逆です。測定していないフィールドが、測定済みとして読まれていたのです。さらに、この誤りは後段にも伝わっていました。crawl/evidence.pyがそれらの列をInternal:AllフレームのOG:Title、OG:Description、OG:Imageに投影するため、ネイティブクロールでのチェックは空を見て、同じサイトのScreaming Frogエクスポートでは実際の値を見ていました。check_ogの誠実性に関する契約は、この損傷を示すのではなく隠していました。どこにもOG列が入っていなければスキップするため、Open Graphのあるサイトとないサイトが同じ結果で監査されていたのです。パーサーは変更していません。変わったのは読み取り側だけです。新しいtests/test_open_graph_seam.pyは、ループバック上の2つのフィクスチャサイトをクロールし、値をパーサーからpages.jsonl、スキャン成果物のpagesテーブル、そしてOG:*フレームの列まで追跡します。また、Open Graphのない3つ目のサイトもクロールし、「存在しないから空」と「読まれていないから空」を区別します。同じファイルでパーサーのキーの形も固定しています。失敗の原因は、2つの正しいモジュールがキー名について食い違っていたことで、両方をまたぐテストがなかったことでした。変更動作中内部リンクの健全性を評価し、検査項目を157から161へ(#634)
「このサイトは内部リンクが適切か、どこが不適切か」という問いに答えるため、検査項目を157から161に増やし、
internal-linkingスキルを追加しました(#634)。部品はすでにありました。linksテーブルには、すべてのエッジの位置、アンカー、nofollowフラグがあり、ORPHAN_PAGE、INLINK_BOILERPLATE_ONLY、LOW_LINK_SCOREもありました。しかし、それらをグラフについての答えにまとめるものがありませんでした。その結果、40,920ページの監査では、数時間にわたって誤った見出しが出ていました。サイトマップの66%が内部リンクから到達不能と報告されていたのです。この数字は、サイトマップのURL数からクロールのURL数を引いて算出されていました。つまり測っているのは「クローラーがそこに到達しなかった」ことです。成果物が持つ5,252,235本のエッジを、トップページから辿ると、到達可能率は91.9%でした。本当の欠陥は深さでした。23,742ページ(サイト全体の58%)がトップページから10クリックを超えて離れており、最も深いものは3,005クリックでした。アーカイブが木構造ではなく「次の投稿」リンクの連結リストになっていたためです。監査が最初に示す見出しは、今ではクリック深度です。summary.internal_linkingにはヒストグラム、最大値、到達可能/不能の内訳、ページ位置別の内部エッジ、そして別のエッジと重複しているエッジの数が入ります。audit.mdはそれをヘルスサマリーの横に表示します。辿りの起点は、クロールが実際に始まったURLです。pages.crawl_depthを起点にすることは決してありません。その列が記録するのは、クローラーがたまたまそのURLに到達した場所であり、サイトマップから始まったクロールではサイトの大部分に0が記録されます。そこから始めた辿りは、別の場所を記述してしまうからです。開始URLが記録されておらず、深さ0を主張するページが複数ある場合、測定は実行を拒否し、その理由を示します。変更動作中4つのチェックがこれらの数値を読む
DEEP_CLICK_DEPTHは、インデックス対象のページで、開始URLからの最短経路がthresholds.click_depth_max(既定値は10。どの検出結果も使った数値を名指しします)を超えると発火します。DUPLICATE_INTERNAL_LINKは、同じ遷移先とアンカーを複数回書いているページで発火します。上記のサイトでは、1,134,307本のエッジのうち509,744本(44.9%)が重複していました。それらは、1つのマストヘッドが2回出力され、2つ目がJavaScriptで削除されていたものでした。手書きのスクリプトがないと見つからなかったテンプレートの欠陥です。LINK_INSIDE_HEADINGとIMAGE_LINK_WITHOUT_TEXTには、リンクのページ内の領域では持てないもの、つまりアンカー自身の祖先の要素の連鎖と中身が必要です。そこで、ネイティブクロールは見出しの概要と並べて、上限付きの小さなページ単位のlink_placement_jsonを記録するようになりました。Screaming Frogのエクスポートでは、両方のチェックは何もないところで問題なしと判定するのではなく、名前を挙げてスキップします。変更動作中分析器全体で守る誠実性のルール
位置が記録されていないエッジは
unclassifiedとして数え、決してcontentに含めません。link_position.classifyは既定でオフになっており、その状態ではすべてのエッジがそうなります。その状態の実行は、サイトのリンクがすべて本文だという意味ではなく、「誰も見ていない」と読まなければなりません。分布にない位置は「この位置にエッジは分類されなかった」と報告し、サイトに欠けている領域とは報告しません。ルールは順番に試されるため、<header>内のメニューは、まずnavに一致します。部分的なクロールでは、クリック深度の判定は発火したかどうかにかかわらず取り下げます。取得されなかった未処理のURLに、より短い経路が含まれている可能性があるからです。また、チェックが黙って何も見つけなかった場合、それは「すべてのページが基準の範囲内にある」と読まれてしまうからです。修正動作中評価されていない条件付きチェックを「問題なし」と報告しない(#635)
H2_MISSINGは、構成でrequirements.require_h2が設定されている場合にだけ発火し、既定値は false です。そのため通常の実行では、その分岐に到達しません。しかし、その痕跡は残っていませんでした。カバレッジはそれを「無言のチェック」に数えていました。これは「すべてのページを走査して何も見つからなかった」ことを意味するバケットです。そのため、誰も実行していないチェックに、サイトが合格したと読者に伝わっていました。この問題を見つけた監査では、サイトのページの61%にH2がまったくなく、そのうち5,066ページは800語を超えていました。つまり、このチェックは数千回発火していたはずです。現在は、名前を挙げてスキップと宣言し、無効にしている設定名を理由に示します。そのため答えは、沈黙ではなく「評価されていない。評価するにはこう設定する」になります。require_canonicalも同じ形で、同じ扱いを受けます。既定値は true なので、まだ誤った読み取りは出していませんでしたが、今後始まることはありません。修正動作中「Audit Tasks — None」と見出しに出る問題を修正(#640)
実行にプロジェクトが記録されていない監査で、タスクリストの見出しが「Audit Tasks — None」となる問題を修正しました(#640)。
render_tasks_mdは見出しをsrc.get("project", "site")で作っていました。しかし"project"は、バックログのsourceブロックに常に存在するキーです。ビルド時にrun.get("project")から設定されるため、プロジェクトのない実行では、キーがない状態にならず、値としてNoneが保存されます。dict.getの既定値は、キーが存在しない場合にだけ働き、Noneを保持しているキーには働きません。ネイティブクロールも再分析もprojectを設定しないため、どちらから作られたバックログも、見出しに文字どおり「None」が入っていました。現在はorで代替値に切り替えます。これは保存されたNoneも捕まえ、さらにサイトのstart_urlやsourceを参照してから諦めます。seohead.reports.facts.crawl_domainは、runブロックからサイト名を解決する際にすでにこの順序を使っていました。それを今回、再発明せずエクスポートして再利用しています。これにより、プロジェクトのない監査から作られたバックログは、「site」という単語ではなく実際のサイト名を示します。seohead.reports._normalize_sf_auditにも、reports/__init__.pyの1行隣に同じ潜在的な形がありました(run.get("project") or "")。保存されたNoneに対しては既に防御されていましたが、代替値が空のドメインで、実行が知っているURLを使っていなかったため、そこから作られる docx/md の「SEO Audit: 」の見出しも同じ状況で空になっていました。現在は、空のままにせず、同じcrawl_domainの解決を経由して代替します。変更動作中見出しを順序と位置で評価し、検査項目を155から157へ(#632)
見出しの概要を、順序の列として、またページの地図として読むようにし、検査項目を155から157に増やしました(#632)。既存の8つの見出しチェックは、見出しを集合として判定します。そのため「1つのH1と4つのH2がある」とは言えても、それ以上のことは言えません。たとえば、DOMの順序が
H2, H2, ..., H1, H2のページは、そのすべてを満たしてしまいます。H2がすべてマストヘッドのメニュー項目であるページも同様でした。実サイトでは、記事テンプレートが自分のH1より前に18個の見出しを持っており、見出しについては問題なしと報告されていました。欠けていたのはルールではなく、証拠でした。pagesにはh1、h1_2、h2が保存されていましたが、それは順序も位置もない3つの文字列にすぎません。ネイティブクロールは現在、h1-h6の見出し全体をDOMの順序で記録します。各見出しはレベル、テキスト、ページ内の領域を持ち、新しいnull許容のheading_outline_json列に入ります。HEADING_BEFORE_H1とHEADING_IN_PAGE_CHROMEはこれを読みます。領域には、リンクの分類がすでに使っている区分(nav、header、sidebar、footer、content、other)をそのまま使うため、「ヘッダーにある」は、見出しについても、リンクについてすでに持っている意味と同じになります。どの位置ルールにも一致しなかった見出しは、ドキュメントが<main>、[role=main]、<article>、または設定されたセレクターで本文を指定している場合にだけ、コンテンツ領域と照合します。本文のルートが<body>全体にフォールバックする場合、見出しを「content」と呼ぶことは「ページのどこかにある」以上の意味を持たないため、その領域は未測定として記録し、ページは理由付きで実行のスキップ済みチェックに名前を挙げます。問題なしとして通すことも、欠陥として挙げることもしません。順序には領域が不要なので、HEADING_BEFORE_H1はそれらのページについても答えます。Screaming Frogのエクスポートには見出しの概要がまったく含まれないため、両方のチェックはそこでは名前を挙げてスキップします。修正動作中後続の監査が失敗しても、完了した収集結果を保持(#627)
稼働中のサイトのネイティブクロールは、20分かけて600ページを
--scan-outの成果物に収集しました。その後、error: 'rel_next_2'と表示されて終わりました。KeyErrorのstr()は、キーそのものだけを返すからです。フェーズも、トレースバックも、収集したすべてのページが完全な状態で、ファイル内で再分析可能なまま残っていることを示すものもありませんでした。収集は監査が始まる前に行を確定させて閉じます。そのため、その時点より後に発生した例外は、クロールではなくアナライザーの問題です。現在は、そこで予期しない例外が発生すると、フェーズ名を付けて報告し、例外の型とメッセージを含め、保持された成果物と、それを再分析するコマンドを示します。監査が大きすぎた場合の経路が既にやっていたのと同じです。実行は、例外で終了するのではなく、audit_available: falseとその理由を報告します。crawl-siteはそれに対して終了コード2で終わります。log-scanの矛盾も同じ第3の答えを使っています。0だと「監査は実行され、この結果が出た」と読まれ、1だと「コマンドが何も出力しなかった」と読まれてしまいますが、証拠が残ったクロールに対しては、どちらも正しくないからです。KeyError自体は再現しませんでした。同じコマンドを同じサイトで現在のmainに対して実行すると完了したためです。したがってこの変更が変えるのは、監査が失敗したときに何が起きるかであり、その失敗を引き起こしたものではありません。修正動作中再オープン時の固定30秒の検査上限で、完了したクロールの監査を失わないように(#631)
再オープン時に、固定の30秒の検査上限によって、完了したクロールの監査が失われないように修正しました(#631)。
NativeScan.open()は、inspect()を通してネイティブスキャンのヘッダーを読みます。その処理は、データベース全体に対してPRAGMA quick_checkとPRAGMA foreign_key_checkも実行します。これは本物の安全性の検査ですが、そのコストは成果物の大きさに比例するのに対し、上限は固定でした。3.5時間かかった40,920ページのクロールは、収集すべきものをすべて収集して完了しましたが、結果として監査は一切出力されませんでした。生成された1GBの成果物を再オープンするには、30秒に固定された上限に対して約48秒の検証が必要だったからです。さらに悪いことに、この失敗は上限が原因だとは推測できない表示でした。期限切れの中断は、SQLiteから素のsqlite3.OperationalError("interrupted")として届き、それがそのままcannot inspect native scan: interruptedに包まれていたため、本当に壊れたファイルとの区別がつきませんでした。両方を修正しました。既定の上限は、成果物のサイズから導かれるようになりました。小さなファイルには30秒の下限を設け、そこに、測定された検証速度(約22MB/秒)を大きく下回る、バイト単位の余裕を加えます。これは性能目標ではなく、ハングした読み取りに対する上限だからです。呼び出し側が明示的に指定したtimeout_secondsは、引き続きそれを上書きします。また、期限切れの中断は、上限、経過時間、成果物のサイズを名指しするScanErrorを送出するようになりました。そのため運用者は、大きくて遅いファイルと壊れたファイルを区別でき、「interrupted」を自分の操作ミスと誤解することがなくなります。追加動作中
crawl-site --resume <scan.sqlite>を追加(#619)NativeScan.resume_snapshot()、resume_stateテーブル、それを埋める書き込み処理は、スキャン成果物を設計した時点から存在していました。crawl_to_scanも既存のファイルの続きから処理できました。ただし、元の有効な設定をバイト単位で完全に再現する呼び出し側に限られており、それを使えるインターフェースはありませんでした。中断された成果物を--scan-outに指定し、どれか1つでもフラグを変えると、設定の不一致として拒否されていました。そのため実際には、中断されたクロール(他人のサイトで34,635ページ中6,516ページ)は、ゼロからやり直すしかありませんでした。--resumeは、成果物のパスだけを受け取ります。開始URLと完全な有効設定はファイルから読み戻されます。保存されたフロンティアが、その設定に基づいて作られているからです。それ以外のクロールの形を決めるフラグを一緒に渡すと、適用せずに拒否します。別のビルドで作られたスキャン、別の開始URLで記録されたスキャン、すでに完了したスキャン、再分析から派生したスキャン、または編集した形でしか保存できない認証ヘッダーを使ってクロールされたスキャンは、リクエストを1つも送る前に、ファイルだけを根拠に名前を挙げて拒否されます。crawl-siteは、終了時に標準エラーへ1行を出すようになりました。クロールが完了したか途中で止まったか、その理由、そして続行する方法を示します。ただし、URL数や時間の予算に達した後は例外です。再開もそれを読み戻すため、再開のための指定を通せません。その場合は、無操作の提案をせずに、その旨を示します。run.crawl_resumedは、永続的な記録として残ります。オフラインのフィクスチャサイトを再開したクロールは、両方のプロセスをまたいで各URLを正確に1回だけ取得し、その1点を除くすべてのフィールドで、中断されなかったクロールと同じ監査を生成します。修正動作中
render-checkで未レンダリングのページを問題なしと判定せず、失敗時にも生HTMLの証拠を保持(#642)render-checkが未レンダリングのページを「問題なし」と判定しないように、また、失敗したレンダリングで生のHTMLの証拠を捨てないように修正しました(#642)。これは#623のガードの2つの帰結で、どちらもrender.pyにあります。1つ目。読み込みのマイルストーンでタイムアウトしたレンダリングは、domcontentloadedの時点でDOMを読むようにフォールバックします。それ自体は妥当です。しかし、その時点までにどのスクリプトも実行されていなければ、レンダリング済みDOMは生のHTMLと同一になり、比較器は何も見つけず、実行はok: True、js_dependent: Falseと、「生のHTMLとレンダリング済みDOMは実質的に同等で、JavaScriptのレンダリングはSEOで見えるコンテンツを決めていない」という1件の検出結果を報告していました。その検出結果は注意レベルに分類されていましたが、対象のページは誰もレンダリングしていないページです。wait_reachedは真実を記録していましたが、サイト監査は検出結果のテキストしかレポートに載せないため、その真実は届きませんでした。より前のマイルストーンにフォールバックした実行は、今では検出結果一覧そのものにそれを示し、問題なしの判定を保留し、Falseの代わりにjs_dependent: Noneを報告します。これは「この実行はわからない」という意味です。この挙動は、明示的に要求されたnetworkidleの下だけでなく、既定の--wait loadの下でも起きていました。2つ目。ガードは、空シェルの分岐に到達する前に、単一の「比較は利用できない」という文を返していました。さらにrender_checkの早期リターンは、empty_shellキーを丸ごと省いていました。そのため、detect_empty_shell()が生のサーバー応答から読み取り、ブラウザーをまったく必要としない、空のシングルページアプリケーションのマウントポイントは、失敗したレンダリングと一緒に捨てられていました。SPAのシェルこそ、レンダリングがタイムアウトするページそのものなので、検出結果は最も重要な場面で失われていたことになります。生HTMLの側から導かれた検出結果は、未完了のレンダリングを生き延びるようになりました。抑制されるのは、レンダリング済みの側から導かれた検出結果だけです。クロールでは、判定に至らなかったレンダリングのプローブは、その理由とともにpatterns_unprobedに入ります(#626の経路)。以前のように、「測定され、レンダリングが不要と判明したパターン」として数えられることはなくなりました。変更動作中読み取れないrobots.txtは、内部エラーではなくサイトの事実として報告(#629)
EMPTY_ROBOTS(_fetch_robotsが、robots.txtを読めなかったすべての経路で返す代替値)は、パーサーがグループとサイトマップを扱うようになる前の、解析済みrobotsの形のままでした。成功経路はparse_robotsの形を返し、それがスキャン成果物のrobots_summaryコンテキストが受け付ける唯一の形です。そのため--scan-outモードでは、robots.txtに到達できない、429や5xxが返る、ホストの外へリダイレクトされる、ループする、ホップ上限を超える、text/plain以外の本文が返るといった場合に、クロールがnative parsed robots summary is invalidで中止されていました。robots.txtが単に404を返す場合も同じでした。これはエラーではなく、RFC 9309の「制限なし」のケースであり、7つのケースの中で最も一般的なものです。文書化された2つの結果は、どちらもその1行の背後で失われていました。robots.txtがない場合は、制限なしでクロールされるようになりました。利用できない場合は、6つの失敗の仕方のどれかを示す注記とともに実行が止まります。レガシーのディレクトリモードのクロールは、古いキーを誰も読まないため、この問題に気づいていませんでした。見つかったのは、未知のユーザーエージェントに対してrobots.txtが302で、Cookie同期用のエンドポイントへリダイレクトするサイトでした。修正動作中
escalate()が、失敗したレンダリングのプローブを「レンダリング不要」と数えないように(#626)escalate()が、失敗したレンダリングのプローブを「このパターンはレンダリングを必要としない」と数えてしまう問題を修正しました(#626)。このメソッドは、テンプレートのパターンごとに1つのURLをサンプリングし、そのパターンがJavaScriptでレンダリングされた、より完全な取得を必要とするかを判断します。しかし、あるパターンのすべてのサンプルがプローブ自体に失敗した場合(ブラウザーの起動失敗、タイムアウト、未完了のレンダリングなど、実際のクロールでよくある失敗)、for/elseはそれでもそのパターンを「プローブ済み」として記録していました。その結果、そのパターンはエスカレーションもされず、実行が評価できなかったパターンの一覧にも載りませんでした。これは、欠けている証拠や測定されていない証拠を決して問題なしとして読んではならない、というこのプロジェクトの中心的なルールに反します。何も分からなかったパターンが静的なものとして黙ってクロールされ、本当に測定されてレンダリングが不要と判明したパターンと同じように報告されていたのです。EscalationResultは、そうしたパターンをpatterns_unprobedに報告するようになりました。そこには、期限で打ち切られたパターンもすでに追跡されています。また、プローブ自身の失敗理由を新しいpatterns_unprobed_reasonsに記録するため、レポートは「このパターンは評価されていない」と言え、評価されたかのような示唆をしなくなりました。少なくとも1回プローブに成功したパターンは影響を受けません。これが変えるのは、あるパターンのすべてのプローブがok: Falseを返した場合だけです。修正動作中
render-checkが未完了のレンダリングをサイトの欠陥として報告しないように(#623)レンダリングが完了しなかった場合、レンダリング済みのスナップショットは、タイトルも
h1もcanonicalもリンクもなく、生のレスポンスのバイト数の5分の1しかありませんでした。比較器はその空っぽさをサイトについての証拠として読み、レンダリングが一度も読んでいないタイトルについて「JavaScriptの後にタイトルが変わる」と、一度も見ていないcanonicalについて「canonicalはJavaScriptで挿入される」と出力していました。ある実サイトの監査では、そうした自信満々の誤った検出結果が4件続きました。どれも、存在しないJavaScriptのバグを開発者に探させる種類のものでした。現在、この組み合わせは比較の前に判定されます。生のレスポンスにランドマークがあり、レンダリング済みのドキュメントにそれらが1つもなく、サイズもごく小さい場合、チェックはok: falseとreason: "incomplete_render"を返します。理由には両方のバイト数が含まれ、確認用に両方のスナップショットが付きます。検出結果は出さず、js_dependent: nullが返され、falseにはなりません。実行がそれを知らないからです。site-auditは、これをsummary.tools_failedに記録します。未測定のチェックが置かれるべき場所だからです。検出は意図的に狭くしています。ランドマークが1つでも残っている場合や、レンダリング済みのドキュメントが生のレスポンスの半分以上のサイズがある場合は、以前と同じように比較されます。両側にタイトルもリンクもないページは、未測定ではなく、測定した上で単に空だと扱われます。スクリプトが本当に書き換えるタイトルは、引き続き検出結果を出します。待機戦略も、よくある原因に対応します。ロングポーリングの分析、チャット、広告のスクリプトのせいでネットワークがアイドルにならないサイトは、--wait networkidleの下でチェック全体がタイムアウトしていました。今では、2回目のナビゲーションをせずに、domcontentloadedの時点のDOMを読むようフォールバックします。wait_reachedは、スナップショットが実際にどのマイルストーンから得られたかを記録し、遅延スクリプトのための短い安定待ちも入ります。DOMContentLoaded がまったく発火しなかったページは、未完了ではなく、レンダリングの失敗のままです。変更動作中
crawl-siteにリアルタイムの進捗行を追加(#619、進捗の部分)ネイティブクロールは、有効なリクエスト速度を表示した後、完了するまで何も表示しませんでした。34,000ページのサイトでは、まだ動いているかどうかを知る唯一の方法は、
ls -laでスキャンファイルが大きくなるのを眺めることでした。進捗行は、TTYでは同じ場所を書き換えて更新されます。取得済みのページ数、これまでに判明しているURL数、その集合に対する割合、直近の時間窓における現在のリクエスト速度、経過時間、そして--scan-outで書き込み中の場合はスキャン成果物のサイズを表示します。意図的にしないのは、わからない総数を示唆することです。クローラーは自分の作業量を発見していくため、分母はfetched + queuedをURL予算で上限をかけたものになり、totalではなくknownとラベルを付けます。また、一度だけ表示されるヘッダー行で、フロンティアがまだ増えていること、そして割合は終了時刻の見積もりではないことを示します。測定できない速度はrate n/aと表示し、0.0 req/sとは決して表示しません。両方の数値は、クロール自身の構造から得ます。SQLiteスキャンの場合は、収集ループが従っているのと同じresume_snapshotのクエリから得ます。そのため画面に表示されるものは、その時点で成果物が保持している内容と一致し、ずれる可能性のある別の集計にはなりません。TTYでない場合(パイプ、ログファイル、CI)には、キャリッジリターンによる再描画ではなく、30秒ごとに平文の行を出します。新しい-q/--quietは、進捗行と起動時の速度行の両方を抑制しますが、標準出力のJSON結果には一切手を加えません。変更動作中#385で残った3つのページネーションの項目を完了し、検査項目を152から155に
#385で残された3つのページネーションの項目を完了し、検査項目を152から155に増やしました。
PAGINATION_MULTIPLEとPAGINATION_URL_NOT_IN_ANCHORは、2つの異なる後続ページを宣言しているページ、または宣言されたURLが同じページ上のアンカーにもなっていないページを報告します。後続ページは、URLの正規化後に比較します。アンカー側の判定が使うのと同じ同一性で比較するため、2つのプラグインからの/blog/page/2と/blog/page/2/は、曖昧なシリーズではなく、綴りだけが異なる1つの後続ページとして扱われます。PAGINATION_URL_NOT_IN_ANCHORにはページのリンクの全体の一覧が必要で、そのためにAll Inlinksのエクスポートを読みます。PAGINATION_MULTIPLEはそれを必要とせず、より軽量なInternal:Allのrel="next" 2/rel="prev" 2の出現列を先に読みます。これはCANONICAL_MULTIPLEがCanonical Link Element 2から答えているのと同じ仕組みです。All Inlinks は、Internal:Allにそれらの列がない状態で書かれたプロファイルのための予備にすぎません。PAGINATION_SEQUENCE_ERRORは、ページ番号の並びが、そのシリーズでは続いているはずの箇所での途切れを報告します。issueに書かれた注意事項のとおりです。シリーズは1以外の番号から始まることがあり、等差(ストライド)は途切れではありません。URLにページ番号が書かれていないシリーズは、作られていない番号付けに照らして判定するのではなく、評価しなかったものとして宣言します。判定されなかったシリーズはすべて、実行のスキップ済みチェックに名前を挙げられ、そのシリーズにあてはまる理由が示されます。等差、循環、列が連続するには短すぎるシリーズ、読めないページ番号は、4つの異なる内容です。そのうち3つは、すべてのURLで番号が明示されているシリーズを記述します。数はシリーズごとであり、実行ごとではありません。そのため、ごく一般的なWordPressの形(1ページ目は番号なしの/blog/、以降は/blog/page/N/)が、同じクロール内の別の判定可能なシリーズの陰に隠れて消えることはありません。追加動作中
test_check_producer_gate.pyの隙間を埋める判定ゲートを追加(#98)判定結果のカバレッジゲートを追加しました(#98)。
test_check_producer_gate.pyは、すべてのチェックIDが登録され、すべてのcheck_*関数がディスパッチされていることを証明していました。しかし、チェックの結論が実際に欠陥を持つマークアップに対して真と証明されたかどうか、また欠陥のないマークアップで沈黙するかどうかは、何も述べていませんでした。まさにこの隙間があったために、#94、#95、#96 はすべての既存テストを通過しながら、実サイトでは誤発火していました。test_check_verdict_coverage.pyはtests/を構造的に(固定の呼び出し箇所のリストではなく、AST で)走査し、チェックごとに両方の側を検査します。両側のテストか、理由を明記した名前付きの除外がないまま新たに登録されたチェックは、ビルドを失敗させます。レジストリにある152のチェックのうち、88はすでに両側の証明がありました。新しいtest_check_verdict_gaps.pyは、走査で見つかった、安価にテストできる隙間をさらに22件埋めます(タイトルと説明の長さと重複、H1の重複、H2の有無、URLの衛生、ディレクティブとマークアップのチェック、レスポンスコード、そして2つのネイティブのフィルターエクスポートのチェック)。残りの64件は、隠すのではなく名前を挙げてゲートのKNOWN_UNCOVEREDの一覧に記録しています。カバレッジが増えるにつれて、この一覧を縮めてください。このゲートが存在した後に追加されたチェックを、この一覧が取り込むことは決して許してはなりません。修正動作中空の
User-agent値で既定ポリシーが無効になるrobots.txtのグループ選択の欠陥を修正空の
User-agent値によってサイトの既定ポリシーが無効になっていた、robots.txtのグループ選択の欠陥を修正しました(#566)。User-agent:だけの行や、インラインコメントがボット名を飲み込んだ行(User-agent: # old bot rule)は、空のトークンに解析されていました。_rules_forは、そのトークンを他のリテラル名と同じように扱っていました。空の長さの接頭辞はすべてのエージェントに一致するため、全部に一致し、さらに「名指しされた」一致として数えられていたため、ファイルが言及していないすべてのクローラーについて、実在するUser-agent: *のグループより優先されていました。そのため、実質的なルールがUser-agent: * / Disallow: /だけのrobots.txtは、完全にクロール可能と読まれていました。これはAIボットのアクセスレポートでも、同じis_allowedを呼ぶライブのクローラー自身の取得制御でも起きていました。空のトークンは今では飛ばされるため、そのようなグループは誰も名指ししないことになり、ワイルドカードのグループが適用されます。最も具体的な名指しのグループが引き続き優先され、誰も名指ししないrobots.txtは、引き続きすべて許可を意味します。修正動作中監査が裏付けられない結果を出す、エクスポート選択と実行検証の欠陥4件を修正(#209、#210、#215、#216)
監査が裏付けられない結果を提示してしまう、エクスポートの選択と実行検証の欠陥を4件修正しました(#209、#210、#215、#216)。
internal_allの照合は、ファイル名のトークンinternalだけを必須としていたため、部分的なタイプ別のInternalタブ(例:internal_html.csv。HTML以外の行がすべて欠けている)が、マスターのエクスポートが欠けているという警告もなく、必須のInternal:Allマスターを満たしていました。照合は今ではallも必須とします。discover_exportsは、ある論理キーに2つのファイルが一致した場合(例:internal_all.csvとinternal-all.csvが両方あり、行が異なる)、ソートされたファイル名の順で最初の候補を選び、もう一方を黙って捨てていました。実行のメタデータには、選択が行われたことを示す記録もありませんでした。今では、すべての候補を名指しして例外を送出します。run_sfは、作成時刻に関係なく--out配下で最も新しいタイムスタンプ付きのサブフォルダーを選んでいました。そのため、何も書かずに終了コード0で終わった再実行(Screaming Frogが終了コードとして報告しない起動失敗)が、以前の実行のエクスポートを新しいものとして返す可能性がありました。今ではプロセスの開始前に取ったスナップショットと比較し、新しいものが現れなければ大きく失敗します。build_commandは、指定されたプロファイルファイルが既に存在する場合にだけ--auth-configを追加していました。そのため、パスのタイプミスや削除されたパスでは、認証なしのクロールが黙って始まっていました。これは任意のseospiderconfigの既定値には適切ですが、呼び出し側が明示的に要求したプロファイルには不適切です。今では、明示的に指定されたsf_cli.auth_configが存在しない場合、Screaming Frogが起動する前に例外を送出します。修正動作中
seohead/checks/parser.pyの本文抽出の欠陥を2件修正(#138、#140)本文抽出の欠陥を2件修正しました(#138、#140)。
collapse_whitespaceは、BeautifulSoupのlxmlパーサーが、tag.get_text()やtag.get(attr)の値に対して、このヘルパーに渡す前にすでに一度行うデコードの上から、HTMLの実体参照をもう一度デコードしていました。通常のマークアップでは黙って何もしない処理ですが、CMSやインポートの仕組みが既に実体参照を二重にエスケープしていたページ(現実にもよくある状態)では、目に見えて壊れた実体参照の並びを、きれいな文章に変えていました。さらに、報告される長さは、ブラウザーのタブや検索結果のスニペットが実際に表示する長さより短くなり、長さに基づくタイトルと説明文のチェックを両方向に誤って反転させていました。このヘルパーは、もうまったくデコードしません。また、リンクとURLソースの抽出は、無条件にドキュメント全体を走査していました。そのため、不活性な<template>の中にしか存在しない<a>/<img>が、実在するページ上のリンクとして報告され、spider.pyによって実際に取得されていました。HTML仕様上、それはレンダリングされたドキュメントの一部ではなく、スクリプトが複製しない限りブラウザーやクローラーが要求することもありません。これは#4で<base href>について塞いだのと同じ、幻のURLの失敗です。両方の抽出処理は、今では<template>の子孫を飛ばします。<noscript>は、テキスト抽出の場合とは異なり、意図的にそこでは到達可能なままにしています。これはJavaScriptを無効にしたクライアント(および検索エンジンの非レンダリングのクロール)が実際に読み込む、仕様で定義された本物のフォールバックのマークアップであり、除外すると、監査人から実際に取得可能なURLを隠してしまうからです。また、語数の数え方も、<svg>や<math>の子孫のテキストを本文として数えなくなりました。アイコンのスプライトのアクセシビリティ用の<title>、グリフの<text>、MathMLの表記は本文ではないからです。20個のアイコンがあるヘッダーは、実際の内容に対して、ページの報告される語数を2倍にしかねませんでした。その除外リストは、今ではcontent_area.TEXT_EXCLUDED_TAGSという1か所にまとめられ、両方のテキスト抽出処理が共有します。以前は2つのコピーがあり、すでに食い違っていました。修正動作中リンクの
relトークンとtarget属性を保持(解決前の生のhrefを含む)リンクの
relトークンの全体、target属性、解決前の生のhrefを保持し、<form>要素(method、action、パスワードフィールドの有無)を抽出するようにしました(#125)。カタログ化された6件の問題は、これら3つの情報が破棄されることに依存していました。安全でないクロスオリジンのリンク(target="_blank"でrel="noopener"/"noreferrer"がないもの)、プロトコル相対のリンク(解決前の//host/path)、localhostへの外部リンク、1つのページが追跡されるリンクとnofollowの内部リンクの両方を受け取る状態、安全でないフォームのaction、そして平文HTTPのページで提供されるパスワードフォームです。6件はすべて、今ではレジストリのUNSAFE_CROSS_ORIGIN_LINK、PROTOCOL_RELATIVE_LINK、OUTLINK_TO_LOCALHOST、FOLLOW_AND_NOFOLLOW_INLINKS、FORM_URL_INSECURE、FORM_ON_HTTP_URLになっています。フォーム、localhost、nofollowの混在のチェックは、どのクロールも既に記録しているフィールドだけを必要とするため、この4件は無条件に実行されます。クロスオリジンとプロトコル相対の組はlink_attributes.captureを必要とし、これは既定でオフです。エッジごとの追加データは、合成の3,387ページ、ページあたり150リンクのクロールで約+50%を測定したためです。エッジあたり約+95バイト、合計約+46MiBで、そのほとんどはraw_href単独によるものです。レジストリは121から127のチェックに増えました。修正動作中
report-buildが SF Analyzerの監査結果を検出0件のレポートとして黙って出力する問題を修正SF Analyzerの
audit.jsonに対して、report-buildが検出結果0件のレポートを黙って出力する問題を修正しました(#151)。文書化された手順、つまりsf run --tasksの出力をreport-build --format docx/xlsx/csv/mdにパイプする方法は、findingsとフラットなページのキーを読んでいました。しかし、SFのスキーマはそれらを使いません(検出結果はissuesの下にあり、ページの事実はpages[].metricsの下にあります)。その不一致により、実際に重大な問題が見つかった監査に対して、確信に満ちた0/0/0/0の要約が出力され、検出結果のセクションはまったくありませんでした。build_reportは今では、ネイティブのseohead.site-audit/1の形と、SF Analyzerの形の両方を認識します。後者は、描画の前に、人間向けの4つのライターがすでに理解している平らな契約へ正規化されます。--format jsonは変更していません。それは元のドキュメントを既に正しく中継しており、データが一度も欠けていなかったことを示しています。どちらの契約にも一致しないドキュメントは、空の成果物として描画されるのではなく、ok: Falseとスキーマの不一致を名指しして拒否されます。また、この検証に見えて実際には常に何もしなかったif ... : passという死んだ条件分岐は削除しました。tests/test_docs_commands_execute.pyは今では、終了コードだけでなく、文書化された手順が描画した要約をaudit.json自身の合計と照合して検証します。変更動作中
seohead/data_sources/の課金に関わる安全性の穴を2件塞ぐ(#157、#159)geo_guardは、助言的なcountryの文字列だけを確認していました。そのため、呼び出し側がcountryを埋めずに数値の地域ターゲットを渡すと、search_volume、keyword_ideas、keyword_difficulty、serpは、location_code=2643(ロシア)または2112(ベラルーシ)であっても、DataForSEOのライブのエンドポイントに届いていました。ガードは今では、実際に課金の基準となるlocation_codeを先に確認します。もう1件は、課金対象の呼び出し中に発生したネットワーク層の例外(URLError、TimeoutError、SSLError)です。以前は、同じペイロードを冪等性キーなしで再試行し、最終的にレスポンスを返した試行だけを記録していました。DataForSEOのpost、Arsenkinの/set、Yandex Cloudのwordstat.topRequests、wordstat.dynamics、web.searchAsyncは、いずれもこのエンドポイントに冪等性の仕組みを提供していません。そのため、失われたレスポンスは今では再試行されず、その試行は支出の台帳に記録され(費用は不明で、attempt_failed: network_errorと印が付きます)、呼び出しは二重課金のリスクを冒すのではなく、そのまま失敗します。冪等な読み取り(Arsenkinの/check、/get、Yandex Cloudの操作のポーリング)は影響を受けず、引き続き再試行されます。yandex_cloud.WebSearch.search_batchは、失われた送信をバッチ全体の中止ではなく、その1つのクエリに限定します。metrika.pyも同じ方法でネットワークエラーを再試行しますが、課金対象の金銭は発生しないため、変更していません。Logs APIのエクスポートの作成も、クォータの理由で同じ扱いにすべきかどうかは、後続の作業として記録しています。変更動作中
http_client()のDNSリバインディングの穴を塞ぐ(#142):pinned_target()による修正http_client()のDNSリバインディングの穴を塞ぎました(#142)。#14で説明されたTOCTOUの時間差を修正したpinned_target()が保護していたのは、collect.pyのリストモードの取得だけでした。spider.pyのcrawl-siteエンジンを含むほかの14の呼び出し箇所では、httpxがソケットを開くためにDNSを2回目に独立して解決していました。そのため、悪意のあるリゾルバーが、ガード自身の検査とは異なる答えを2回目の検索で返せば、ガードの判定に関係なく169.254.169.254や RFC 1918 のアドレスに届いてしまいます。http_client()は今では、すべてのクライアントを、自分で解決したアドレスに接続を固定するトランスポート上に構築します。これは最初のリクエストと、すべてのリダイレクトの各ホップで行われます。ホスト名はHostヘッダーとTLSのSNIにだけ残します。そのため修正は、すべての呼び出し側が覚えておかなければならない規律ではなく、構造として組み込まれています。SEOHEAD_ALLOW_PRIVATE_NETWORKSとSEOHEAD_ALLOW_PRIVATE_HOSTSは変更していません。修正動作中ハンドラー自身が報告した失敗に対するCLI/MCPの終了コードの契約を修正し、SOURCE_FLAGSを完成
ハンドラー自身が報告した失敗に対する CLI/MCP の終了コードの契約を修正し、
SOURCE_FLAGSを完成させました(#155、#156)。{"ok": false, ...}を返すハンドラーは、取得、解析、プロバイダーの失敗を、例外を送出せずに報告する、ツール層で文書化された方法です。以前はCLIでそのJSONを表示して終了コード0で終わり、MCPでは通常の(isErrorではない)結果を返していたため、$?で制御するパイプラインや、isErrorだけを確認するクライアントはそれを検出できませんでした。cli.pyは今では、そのケースに対して終了コード1で終わります。自己矛盾した実行に対するlog-scan独自の終了コード2は、別の文書化されたシグナルとして残ります(docs/USAGE.mdを参照)。mcp_server.pyは、共有の_checked()ラッパーからToolErrorを送出するため、クライアントはisErrorを確認できます。両方とも単一のhandlers.handler_failed()を呼び出すため、何を失敗とみなすかについて2つのインターフェースがずれることはありません。もう1件あります。SOURCE_FLAGSには、--phrase、--keywords、--query/--queries、--seed、--counter、--before/--afterが追加されました。これらはそれぞれ、--urlと同じようにコマンドの入力全体を特定するものですが、欠けていたため、いずれかに対する行単位のループは最初の行しか黙って処理していませんでした。このセットは今では、各フラグが宣言される時点で_source_flag()によって作られ、別々に手で列挙することはないため、再び食い違うことはありません。変更動作中
docs/scenarios/を10本の連鎖から56本へ拡充し、読者の問いごとに整理docs/scenarios/を10本の連鎖から56本へ拡充し、読者が持ち込む問いごとにまとめました(#120)。どのシナリオを置くかは好みではなく、カバレッジのマップによって決めています。各シナリオは、解決するカタログ化された問題を宣言します。tests/test_scenario_coverage.pyは、このツールキットが見つけると主張するすべての問題が少なくとも1つのシナリオに現れること、マップに載っていない問題を名指しするシナリオがないこと、そして、どのシナリオも自分の限界を省略していないことを検証します。見つけられる143件の問題はすべてカバーされています。CIでは、すべてのファイルのすべてのコマンドが、今でもフィクスチャのサイトに対して実行されます。テストスイートは2,008件を実行し、そのうちドキュメントのコマンドのゲートが、今では最大の単一グループです。変更動作中サイトマッププロトコル自体の上限を検査(#124):
SITEMAP_TOO_MANY_URLSなどサイトマッププロトコル自体の上限を検査するようにしました(#124)。1ファイルに5万件を超えるエントリーがある場合は
SITEMAP_TOO_MANY_URLS、無圧縮で50MBを超える場合はSITEMAP_TOO_LARGE、複数のサイトマップで宣言されているURLはSITEMAP_URL_DUPLICATEDとし、どちらのドキュメントも名指しします。いずれかの上限を超えるファイルは、単に大きいのではなく無効とみなされます。検索エンジンはその一部だけを読み、残りを、サイト所有者には見えない形で破棄することがあるためです。しきい値は設定ではなくプロトコルから取ります。両方のパーサーは、今ではドキュメントごとのバイトサイズと宣言された件数を記録し、検出結果はインデックスではなく子のサイトマップを名指しします。レジストリは118から121のチェックに増えました。追加動作中
docs/GUIDELINE.mdを追加。最初に読む文書(#121)docs/GUIDELINE.mdを追加しました。最初に読むべき文書です(#121)。内容は、これが何か、何でないか、初回の実行を最初から最後まで、クロール速度の選び方と、エラーが自分のサイトのものかどうかの見分け方、誤解せずにaudit.jsonを読む方法、設定ファイルが何を変え、何にコストだけをかけるか、誰もが最初にやる6つの間違い、ツールが誤っていたときの対処、そしてツールがまったく答えられないことです。READMEからは、リファレンスより前に最初にリンクされます。追加動作中
docs/COVERAGE_SF_ISSUES.mdを追加(seohead/sf/core/sf_issue_map.pyから生成)docs/COVERAGE_SF_ISSUES.mdを追加しました。これはseohead/sf/core/sf_issue_map.pyから生成されます。分野で公開されているカタログにある320件の問題のすべてに、ちょうど1つのステータスが付きます。名指しされたチェックで発見済み、名指しされたコマンドで発見済み、一部のみ発見(欠けている部分を明記)、名指しされたギャップ、または理由を付けた判断のいずれかです(#119)。対象範囲内の212件のうち、126件が現在発見済み、17件が一部発見済みです。41件はギャップで、28件は意図的に作っていないものを必要とします。アクセシビリティ(92件)とAMP(16件)は、単一の判断として見送っています。判断を検証できるように、その全件の一覧を示しています。テストは、参照されているすべてのチェックIDとコマンドが今も存在することを検証するため、名前の変更はドキュメントではなくビルドを壊します。docs/CHECKLIST_AUDIT.mdを置き換えます。後者はカタログを手元に置かずに書かれていました。変更動作中サイトマップのシーダーは、正規化された形ではなく、公開されたアドレスを要求
サイトマップのシーダーは、正規化された形ではなく、サイトマップが公開したアドレスを要求するようになりました(#115)。
sitemap.crawl()は正規化されたlocだけを返していました。そのため、/a/を宣言したサイトマップは/aの取得を引き起こしていました。多くのCMSでは、これはクローラーが作り出した301であり、それをサイトについての事実として報告していました。スラッシュのない形がまったくルーティングされていない場所では、404になりました。今では各エントリーは、公開されたとおりのlocを、それを比較対象にするコンシューマー向けのloc_normalizedとともに保持します。このため、以前のサイトマップを起点としたクロールのリダイレクト統計は、疑わしいものとして扱われます。変更動作中オペレーター用スキルをコントローラーのディレクトリに再構成(#111)
オペレーター用のスキルを再構成しました。
.claude/skills/は今では2つの層を持ちます。1つは21のメソッドのスキルで、それぞれが1つのことをうまくこなします。もう1つはcontrol/で、まだ誰も見ていないサイトに対してどれを実行するかを決めます。コントローラーは内容を繰り返すのではなく振り分けを行い、読み込み可能な5つのサブスキル(スコープ設定、速度と負荷、監査結果の読み方、検証、成果物)と、3ファイルのリファレンスのアーカイブ(実サイトで見つかった欠陥と、それを見抜いた手がかり、各チェックが記述する母集団、ツールキットがまったく答えられないこと)を持ちます。英語のみのゲートとドキュメントのコマンドのゲートは、今ではSKILL.mdだけでなく、スキルのディレクトリの下にあるすべてのMarkdownファイルを対象にします。追加動作中
tests/chains/を追加: 連鎖を実際に壊す形で組んだフィクスチャのサイトtests/chains/を追加しました。連鎖を実際に壊す形を組み合わせたフィクスチャのサイトです。1つのURLの2つのスラッシュ形、有効なUTF-8ではない本文、windows-1251のページ、<main>の外にあるマストヘッド、ホスト外のリンク、robots.txtで禁止されたパスを含みます。これをループバック上でクロールし、どれか1つのモジュールではなく実行全体についての17件のアサーションを置いています(#112)。4つの性質を検証します。保存則(数値が伝わる途中で意味を変えない)、母集団(検出結果は、それが記述する集合の要素についてのものである)、決定性(2つのクロール、2つの並行度、1つの答え)、表現(ページが自分の測定方法を示す)です。母集団の規則はlogscan自身のものです。そのため、スキャナーが名指しできる矛盾は、そのまま連鎖テストがアサートするものになります。変更動作中
reconcile_sitemapは、各URLを正規化後ではなく書かれたとおりに報告比較は依然として正規化されたキーで行われますが、正規化された形で名指しされた検出結果は、クロールのどこにも現れないURLを名指ししていました。これは読み手には対処のしようがなく、異常検出のスキャナーには、取得されなかったページについての検出結果と区別がつきませんでした。
追加動作中
docs/scenarios/を追加: 10本のエンドツーエンドの連鎖docs/scenarios/を追加しました。10本のエンドツーエンドの連鎖があり、それぞれに実際のコマンドを順番どおりに示し、出力される成果物、かかるコスト、その連鎖では答えられないことを記載しています(#110)。ほかのドキュメントはツールキットが何を持っているかを列挙していますが、これは何をするかを説明します。READMEのツール一覧の上からリンクされているため、リポジトリを評価するエージェントは、目録より先に連鎖を見つけます。表示されているコマンドはすべて、tests/test_docs_commands_execute.pyによってフィクスチャのサイトに対して実行されます。このテストの抽出器と英語のみ・件数のゲートは、今ではdocs/の先頭だけでなく、すべての階層を走査します。追加動作中
log-scan(CLI)とseo_log_scan(MCP)を追加: 完了した実行の成果物を読み、両立しない主張を報告log-scan(CLI)とseo_log_scan(MCP)を追加しました。完了した実行自身の成果物を読み、同時には全部が真ではありえない主張を報告します(#109)。ルールは8つで、それぞれ、テストスイート全体をすり抜けて出荷された欠陥から書かれています。ディスク上のファイルと食い違う記録済みのサイズ、100%を超えるテキスト比率、ページの数を超えて発火するチェック、実行が一度も取得しなかったURLについての検出結果、同じ実行で2xxを返したURLをリダイレクトと呼んでいるcanonical、自分の行と食い違う要約、0バイトのページで数えられた語数、そして一部だけがどちらの方法かを示すページの二通りの測定です。各異常は、両方の値と、それぞれがどこから読まれたかを名指しします。CLIは、実行が自己矛盾しているときに終了コード2で終わるため、パイプラインは数値を公開せずに止まります。変更動作中ワーカー間のペーシングのテストは、もはや壁時計を測らない(#107)
_DispatchGateは、time.monotonic()を直接読む代わりに、クロールに注入されたクロックを読むようになりました。そのためテストは、何かがスリープしたときだけ進む仮想クロックで駆動します。ディスパッチの時刻はクローラー自身の計算であり、アサーションは正確になります。以前の形は、実際に経過した間隔を0.024秒の下限と比較しており、マシンが混んでいるときには、コードが変わっていなくても失敗していました。変更動作中接続されていない設定の監査の後半を完了(#91)
http.headersは、認証ヘッダーと並んで、すべてのリクエストにマージされるようになりました。speed.adaptiveは、スロットルの遅延と並行数の調整を制御します(タイムアウトとサーバーエラーのカウンターは動き続けます。打ち切りはバックオフとは別の仕組みだからです)。discovery.hyperlinks.store/.crawl、discovery.external.store、discovery.redirects.crawlは、クロールが何を記録し、何を追跡するかを決めるようになりました。discovery.canonicals.*、discovery.external.crawl、discovery.redirects.storeは、接続するのではなく削除しました。これらは、スパイダーが持たない機能(canonicalの追跡、ホストをまたぐクロール)を名指ししていたり、抑えることができない状態を述べていたりしたためです。--config-helpと実行マニフェストに現れながら何も変えない設定は、設定がないよりも悪いと判断しました。カバレッジのカナリアの除外セットは、今では空です。DEFAULTSのすべてのパスが、観測可能な結果を変えており、テストによって名指しされています。変更動作中設定がないときは、ドキュメント自身の意味構造からコンテンツ領域を検出するようになりました(#96)。検出の順序は
main、[role="main"]、articleで、どれに一致したかは
auto_main/auto_role_main/auto_articleとして記録します。従来の既定値は、navとfooterタグを除いたbody全体でした。実際のWordPress記事では、433語のうち126語(29%)がテンプレートの語で、スキップリンクもそこに含まれていました。この水増しにより、テンプレートのすべてのページでTHIN_CONTENTとLOW_TEXT_RATIOが同じ方向にずれていました。フォールバック経路では、DEFAULT_EXCLUDE_TAGSにheaderとasideをnavとfooterに加えています。セレクターを設定した場合は従来どおりそれが優先されます。また、セレクターが何にも一致しなかった場合は、別の領域を黙って自動検出するのではなく、fallback_default_bodyに戻ります。変更動作中
URL_NOT_IN_SITEMAPは、ページ同士を比較するようになりました(#94)。これまでは、サイトマップのURLを、クロールのリンクグラフ上のすべての移動先と照合していました。そのため、124ページの実サイトで392件が検出されていました。内訳は、ギャラリーが直接リンクしている画像ファイル362件、ホスト外リンク5件、クロールが一度も取得していないURL 30件です。これでレポートの74%を占め、実際の問題が埋もれていました。現在は、サイトマップが宣言すべきページだけを比較対象にしています。対象は、取得済みで、2xxを返し、HTMLで、同一ホストかつインデックス可能なページです。
reconcile_sitemapは、この母集団を別の引数comparableとして受け取ります。これにより、SITEMAP_ORPHANは引き続きすべてのリンク先に対して到達性を確認しますが、存在しない孤立ページを作ることはありません。対象外になったURLは捨てずに、linked_not_comparableの下に返します。修正動作中末尾スラッシュの有無で両方のURLを返すサイトで、canonicalのチェックを修正しました(#95)。
norm_urlは意図的に末尾のスラッシュを無視します。そのため、スラッシュなしで書かれたcanonicalは、スラッシュ付きのページと一致します。ところが、正規化したインデックスはキーごとに1ページしか保持していませんでした。一般的なWordPressサイトのクロールでは、/x(301)と/x/(200)の2つが存在することがあります。先に登録された方を読んでいたため、CANONICAL_TO_REDIRECTは、canonicalの先が200で応答している生きたページ78件を、リダイレクトとして誤って報告していました。現在、AuditContextは、キーごとのすべてのページをpages_by_normで公開します。page_by_normは2xxを返したバリアントを返します。CANONICAL_TO_REDIRECTとCANONICAL_NON_INDEXABLEは、どのバリアントも矛盾しない場合にだけ発火します。修正動作中
size_bytesを修正:デコード前に、回線上で届いたレスポンスボディのサイズを計測…size_bytesを修正しました。現在は、ボディをデコードする前に、回線上で届いたレスポンスボディのサイズを計測します(#99)。以前はデコード済みの文字列から計測していたため、UTF-8として有効でないバイトはすべてU+FFFDに変換され、3バイトに再エンコードされていました。実際のクロールで取得した739 KBのWebPは、1.27 MBと記録されていました。水増しの倍率はファイルごとに異なります。画像、PDF、フォント、そして旧来の文字コード(windows-1251)で配信されたHTMLは、すべて過大に計測されていました。その分母で計算したテキスト比率も同様に狂っていました。HTTPキャッシュは、回線上のサイズをエントリと一緒に保存するようになりました。そのため、再生されたページでも、ライブ取得時と同じ値が報告されます。スキーマはhttp_cache.v2に変わりました。v1のエントリは、サイズなしで再生されることはなく、一度だけ再取得されます。追加動作中
docs/TOOL_REFERENCE.mdを追加。MCPツール定義から自動生成…MCPツール定義(
seohead/mcp/tool_reference.py、scripts/generate_tool_reference.py)から生成されるdocs/TOOL_REFERENCE.mdを追加しました。すべてのseo_*/sf_*ツールについて、型と既定値付きの引数を記載しています。コスト(ネットワーク、書き込み、冪等性、課金)も載せています。これは各ツールのToolAnnotationsプロファイルから読み取ります。また、各ツールのdocstringにある動作と失敗時の注意も含みます。tests/test_docs_drift.pyは、ツール定義からずれた場合や、ツールが欠けている場合にビルドを失敗させます。追加動作中
tests/test_docs_commands_execute.pyを追加:ドキュメント内のseohead ...コマンドを抽出…tests/test_docs_commands_execute.pyを追加しました。README、docs、スキル、examplesに載っているすべてのseohead ...コマンドを抽出し(scripts/doc_commands.py)、オフラインで1件ずつ実行します。対象は、ループバック上のフィクスチャサイト(tests/doc_fixtures/)と、examples/の実体化したコピーです。終了コードが正常であることを確認します。実際のインフラを必要とするコマンドは実行せず、少なくとも本番の引数パーサーで構文を確認します。対象は、RDAP/DNS、ライセンス済みのSFバイナリ、有料プロバイダーの認証情報、そして終了しないmcpサーバーです。動かなくなった文書化済みのコマンドは、古いまま出荷されることなく、CIで失敗するようになりました。変更動作中技術系ワークフロースキル21件(
.claude/skills/*/SKILL.md)を共通の構成に整理…技術系ワークフロースキル21件(
.claude/skills/*/SKILL.md)を、共通の構成に書き直しました。構成は、Trigger(起動条件)、Anti-trigger(起動しない条件)、Preconditions(前提条件、チェックリスト)、既存のWorkflow、Decision points(判断ポイント)、Definition of done(完了条件、チェックリスト)、そしてCost(コスト)です。また、docs/SKILLS.md末尾の古いコマンドカバレッジの数を修正しました。正しい数は、すべてのスキルファイルを走査して再計算しており、新しいドリフトテストで検証しています。修正動作中実際のレジストリからいつの間にかずれていた、ツール数とテスト数を修正しました。対象は、
docs/USAGE.md、docs/COMPARISON.md、README.md、
docs/TESTING.mdにある古いCLIコマンド数、docs/TOOLS.mdにある古いMCPツール数、docs/README.mdにある古いツールリファレンス数、そしてオフラインのテスト数です。修正した値は、リグレッションテスト(test_stale_tool_counts_do_not_reappear)で固定しました。追加動作中ブラウザも外部APIも不要な静的Lighthouse監査を4件追加(#59)…
ブラウザも第三者APIも不要な静的Lighthouse監査を4件追加しました(#59)。対象は
MISSING_CHARSET、MISSING_DOCTYPE、VIEWPORT_MISSING、NO_COMPRESSIONの4件です。いずれも、クロールがすでに保持しているエビデンスから計算します。content_encoding、meta_charset、doctype、viewportは、正規化された列の語彙に加わりました。そのため、これらをカスタム抽出の列として持つSFエクスポートも、同じチェックに取り込まれます。チェック数は114件から118件に増えました。変更動作中検証済みで実行マニフェストに書かれるのに、どこからも読まれていなかったクローラー設定の残り10件を接続…
検証済みで実行マニフェストにも書き出されていたものの、
--config-helpで説明されるだけで、どこからも読まれていなかったクローラー設定の残り10件を接続しました(#63)。limits.max_response_bytes、speed.max_delay_seconds、robots.user_agent_token、speed.stop_after_consecutive_timeoutsは、以前はハードコードされていた動作を設定で制御できるようになりました。robots.unavailable_means_stopは、到達できないrobots.txtや5xxのrobots.txtでクロールを止めるか、制限なしとして扱うかを決めるようになりました。以前は、到達不能なrobots.txtはポリシーに関係なくクロールを止めず、5xxの場合は常に止めていました。現在は両者とも「利用不可」という同じケースとして扱われ、この設定で制御されます。limits.max_url_length、limits.max_query_variants_per_path、http.retry_on_timeout、discovery.follow_nofollowは、新たに実装された動作です。http.user_agentは、常にツール既定の値を送るのではなく、実際のリクエストに適用されるようになりました。エージェントがファイルシステムなしで設定項目を把握できるように、crawl-describe-settings(CLI)とseo_crawl_describe_settings(MCP)を追加しました(#23)。追加動作中カスタム検索(
tools/custom_search.py)とカスタム抽出を追加…取得済みのコーパスに対して、カスタム検索(
tools/custom_search.py)とカスタム抽出(tools/custom_extract.py)を追加しました。存在・不在のフィルターは、生のソース、可視テキスト、指定したCSS要素、XPathノードを対象にできます。抽出器はCSS、XPath、正規表現の3種類です。どちらも、静的なマークアップとレンダリング後のDOMのどちらに対して実行したかを報告します。不在は正直に数えます。取得に失敗したページは、不在としてカウントせず、分子と分母の両方から除外します。抽出は、(ドキュメント、抽出器)の組ごとに実時間の上限(POSIXではSIGALRM)の下で実行します。病的な式があっても中断されるのはそのドキュメントだけで、実行は最後まで完了します。追加動作中リンク位置の分類(
tools/link_position.py)を追加しました。リンクの祖先パスに対して順序付きのルールを当て、nav、header、sidebar、footer、contentのいずれかに分類します。「本文」の定義は新しく作らず、
content_area.pyの定義を再利用しています。crawl/spider.pyのリンク記録に組み込みましたが、link_position.classifyの背後に置き、既定ではオフです。リンクごとに位置を保持すると、大規模なクロールではメモリを消費するためです。crawl/linkgraph.pyのinlink_compositionがサイト全体で集計し、その結果を使って、定型部分(ボイラープレート)からだけリンクされているページに対する新しい監査項目INLINK_BOILERPLATE_ONLYを出します。チェック数は104件から105件に増えました。追加動作中クロールが完了して初めて答えが出せる、後段の計算を8件追加(issue #15)…
クロールが完了して初めて答えが出せる、クロール後の二次計算を8件追加しました(issue #15)。内訳は次のとおりです。
all_inlinksのエッジグラフから計算する内部リンクスコア(LOW_LINK_SCORE)。どのハイパーリンクも指していないcanonicalの先(UNLINKED_CANONICAL)。rel="next"のループと、リンクされていないシリーズの検出(PAGINATION_LOOP、UNLINKED_PAGINATION_SERIES)。hreflangの相互参照(HREFLANG_MISSING_RETURN_LINK)。被リンクの構成の集計(ONLY_NOFOLLOW_INLINKS、ONLY_NONINDEXABLE_SOURCE_INLINKS)。クロールの起点からの具体的な最短発見パス(DEEP_DISCOVERY_PATH)。自前で計算する混在コンテンツのフォールバック(INSECURE_SUBRESOURCE)。保存済みのページテキストからの類似重複のクラスタリング(NEAR_DUPLICATE/DUPLICATE_BY_HASH)です。このクラスタリングで、tools/duplicate.pyとtools/content_area.pyを初めて監査に組み込みました。ORPHAN_PAGE、SITEMAP_ORPHAN、そして新しい「リンクなし」系の2つのチェックは、クロールが部分的(partial)とマークされている場合は保留されます。その場合は検出結果ではなく、名前付きのスキップとして報告されます。切り詰められたクロールでは「ここにリンクはない」を証明できないためです。チェック数は104件から114件に増えました。変更動作中クロールのレジストリを外部のテクニカルSEOチェックリストと照合し、検証済みの小さな不足8件を補完…
外部のテクニカルSEOチェックリストに照らして、クロールのレジストリを監査しました。検証済みの小さな不足を8件埋めています。内訳は、hreflangのチェック5件(無効な言語・地域コード、自己参照の欠落、x-defaultの欠落、重複したエントリ、hreflangの向き先がcanonicalでないこと)、robotsディレクティブ2件(
notranslate、unavailable_after)、そしてフラグメントを含むcanonical URLです。チェック数は96件から104件に増えました。詳細はdocs/CHECKLIST_AUDIT.mdを参照してください。追加動作中
asset-weight-checkを追加:ページのCSS/JSを取得し、レンダリングを妨げるリソースを報告…asset-weight-checkを追加しました。ページがリンクしているCSSとJSを取得し、次の問題を報告します。レンダリングをブロックするリソース、サイズが大きすぎるファイル、重複したライブラリ(コードのハッシュで判定)、ミニファイされていないこと、font-displayの欠落、古いポリフィルに依存したJS、圧縮と長期キャッシュの欠落です。追加動作中
crawl-site --sitemap <url>(および--config内のsitemaps.auto_discover)を追加:サイトマップを起点にクロール…crawl-site --sitemap <url>(および--config内のsitemaps.auto_discover)を追加しました。サイトマップに宣言されたURLを内蔵のクローラーの起点にし、各URLからリンクをたどります。宣言された集合と観測された集合は照合され、その結果がaudit.jsonのsummary.sitemapに書き出されます。チェックIDは、Screaming Frogのパイプラインがすでに報告しているSITEMAP_ORPHAN/URL_NOT_IN_SITEMAPと同じものを使います。追加動作中
crawl-site --config-helpを追加(seohead/crawl/config.pyから生成)し、フラグを非表示に…crawl-site --config-helpを追加しました。ヘルプはseohead/crawl/config.pyから生成されます。--max-depthと--min-delayは--helpから隠しましたが、引き続き受け付けます。クローラー設定が増えるたびにフラグが増え続けるのを止めるためです。変更動作中技術のフィンガープリント判定を、取得ステップと純粋な
analyze_techステップに分割しました。名前だけでなく、アナリティクスとタグマネージャーのIDも取得するようになりました。また、URLテンプレートごとに有無を集計する
tag_coverageレポートを追加しました。このレポートには、各ページをどの方法で計測したかも記録されます。変更動作中完了したクロールのリダイレクト先に対する二次パスで、リダイレクトチェーンとループを解決…
完了したクロールが保持するリダイレクト先に対する二次パスとして、リダイレクトチェーンとループを解決するようになりました。そのため、
REDIRECT_CHAIN/REDIRECT_LOOPには、ネイティブのScreaming Frog「Redirect Chains」レポートが不要になりました。軽量プロファイルでのエクスポートでも、crawl-siteの実行でも、同じ検出結果が追加の手間なしで得られます。追加動作中設定可能なコンテンツ領域(
content_area.py)を追加:単語数を本文領域に限定…設定可能なコンテンツ領域(
content_area.py)を追加しました。単語数は本文領域だけで数えます。既定ではナビゲーションとフッターを除外します。リンクの発見には影響しません。適用された判定方式はページごとに報告されます。変更動作中
duplicate.pyで完全一致と類似重複を分離:完全一致は抽出テキストからハッシュ化…duplicate.pyで完全一致と類似重複を分けました。完全一致は、生のバイト列ではなく抽出済みのテキストからハッシュを計算します。完全一致したページは、類似重複のクラスタからは除外します。比較の既定の対象は、インデックス可能なページのみです。追加動作中ボイラープレートの一貫性レポート(
boilerplate_report.py)を追加しました。ページごとにヘッダー、ナビ、フッターをハッシュ化し、少数派のテンプレートグループにフラグを立てます。
追加動作中外部依存のないMarkdown抽出(
markdown_extract.py)を追加:コンテンツ領域のみ…外部依存のないMarkdown抽出(
markdown_extract.py)を追加しました。コンテンツ領域だけを対象にした変換と、文書全体の変換の2つがあります。変更動作中
markdown_extractとboilerplate_reportをCLIとMCPに接続しました。それぞれmarkdown-extract/seo_markdown_extract、
boilerplate-report/seo_boilerplate_reportとして公開されます(コアツールは45件から47件に増えました)。また、duplicate_checkがハンドラー層ですでに持っていたonly_indexableフラグを、これまで抜けていたseo_duplicate_checkのMCPシグネチャにも追加しました。citability-checkのURL経路も変更しました。以前はパーサーの文書全体のtextフィールドを使っていましたが、それは段落や見出しの区切りがまったくない1行にまとめられたテキストでした。現在はmarkdown_extractのコンテンツ領域のMarkdownを使います。これにより、課題で指摘されていたボイラープレートによる希釈が解消されます。あわせて、ライブURLのすべてで回答ブロックと構造品質のディメンションが黙ってゼロになっていた潜在的なバグも直しました。原因は、フラットなテキストを使っていたことでした。意図的に範囲を絞らなかった箇所が2つあります。1つ目は、パーサーのtextフィールドそのものです。page_facts.pyのスキーマ・エビデンス抽出(sameAsのSNSリンク、パンくず、価格・評価の正規表現)は、コンテンツ領域から除外されるヘッダーやフッターのウィジェットに正当に含まれる情報に依存しているため、これは引き続き文書全体を対象とします。2つ目は、sf/core/rules.pyにあるScreaming Frog駆動のTHIN_CONTENT/LOW_TEXT_RATIOチェックです。これらのword_countとtext_ratioはScreaming Frog自身のエクスポート列から来ており、ツールキットにはそれを範囲指定するための生HTMLがありません。範囲を絞るにはすべてのページを再取得する必要があり、SF監査経路の「リクエストゼロのオフラインコーパス」という設計を損なってしまいます。ツールキット自身のクローラー(crawl-site)は、単語数をparser.parse_htmlから直接読むため、コンテンツ領域の範囲指定を追加の作業なしで引き継いでいます。変更動作中命名規則を文書化(
docs/NAMING.md)し、モジュール名の衝突とテストファイル名を整理…命名規則を
docs/NAMING.mdに文書化しました。あわせて、見つかったモジュール名の衝突と、処理名をそのまま付けたテストファイルを解消しました。CLIコマンド、ハンドラー、MCPツールの名前は変更していません。- 追加動作中コミュニティ、引用、キー不要のエージェント向けオンボーディングファイルを追加しました。
- 追加動作中権限管理付きの
analytics-console-reviewワークフロースキルと、実用的なレシピ3件を追加しました。 - 変更動作中現行の
3.xセキュリティラインのサポートを文書化しました。 変更動作中TLS 1.2以降を必須にし、直接の証明書プローブを事前検証済みの公開アドレスに固定…
TLS 1.2以降を必須にし、直接行う証明書プローブは、事前に検証済みの公開アドレスに固定しました。
追加動作中
crawl-site用のHTTPレスポンスキャッシュを追加(seohead/crawl/cache.py、オプトイン…crawl-site用のHTTPレスポンスキャッシュを追加しました(seohead/crawl/cache.py)。有効にするにはcache.modeを設定します。既定値はoffなので、既定の設定では副作用は発生しません。キャッシュは実際のHTTPの鮮度の仕組みに従います。max-ageとExpires、ETagとLast-Modifiedによる再検証、Varyを考慮したバリアント、no-storeとno-cacheの遵守に対応しています。デバッグ用のreplayモードもあります。このモードはマニフェストに記録され、既定にはなりません。明示的な強制再取得にはinvalidateフラグを使います。取得したページはすべてcache_status(hit/revalidated/miss)を持ちます。実行結果にはcache_statsとcache_replayが付き、ハンドラーの出力とaudit.jsonのrunブロックの両方に含まれます。そのため、一部がキャッシュから作られたレポートにはその旨が明記されます。キャッシュヒットでは、リクエストは発生せず、スロットリングの待機や同時実行スロットも消費しません。待機はfetch_oneの内部で、実際にネットワークの往復が始まる直前にだけ行われます。追加動作中
seohead/core/runlog.pyにジャーナル主導の再利用を追加(SEOHEAD_REUSE_POLICY、ツールごとの…seohead/core/runlog.pyに、ジャーナルを基にした再利用を追加しました。SEOHEAD_REUSE_POLICYで、ツールごとの最大経過時間(秒)を指定します。既定値は空で、その場合は何も再利用されません。設定された期間内にある、新しく成功した過去の回答があれば、ツールを再実行せずにそれを返します。その際、結果と新しいジャーナルのエントリ(こちらも引き続き書き込まれます)の両方に、reused: trueとreused_from_tsを付けます。鮮度は常に、値が実際に取得された時点から測ります。再利用によって鮮度が延びることはありません。
3.0.0
最初の公開スナップショット2026年8月30日10 件 · 最初の公開スナップショット10 変更
2026年8月30日
10 変更- 変更動作中42の共通CLI/MCPツールを持つ、1つのPythonパッケージ。
- 変更動作中Screaming Frog向けのMCPツールを5件追加し、96チェックのクロール分析機能を搭載。
- 変更動作中ドメイン、CDN、技術、セキュリティ、ミラー、地域、ボット、被リンクの事前調査。
- 変更動作中Schema.orgの検証と、連携したグラフの生成。
- 変更動作中サイトマップに基づく範囲限定のサイト証跡と、XLSX・DOCX・CSV・Markdown・JSON形式のレポート。
- 変更動作中任意連携:Wordstat、Yandex SERP、Arsenkin、Metrika、DataForSEO。
- 変更動作中技術系ワークフロースキル21件と、同梱のSEOプレイブック7件。
- 変更動作中ローカルのstdio MCPとDockerに対応。GUI、ホスト型API、テレメトリーは含みません。
変更動作中再現可能な合成データによる図版を備えた、実証ベースの公開README…
実証に基づいた公開READMEです。再現可能な合成データで作った、監査・タスク・インターフェース・レポートの図版を掲載しています。
- 変更動作中履歴を含まない公開リリースの境界と、第三者コンポーネントの明示的な表記。
日付 = 変更が反映された日(changelog.d/ フラグメントのgit日付)。番号 = クローズするissue。タイトル = 最初の文、詳細はクリック。