Skip to content

クラスタ選定理由(onClusterReason)をtemplateKeyに統合する(page-cluster追加への申し送り) #234

Description

@YusukeHirao

背景

@d-zero/page-clusteronClusterReason が追加された(d-zero-dev/tools#927、現在レビュー待ち・CI green)。クラスタが確定するたびに1回、そのクラスタの選定理由を構造化データ(ClusterReason)として通知するコールバック。

type ClusterReason = {
  memberCount: number;
  blocking: { blockKey: string; reason: BlockingReason }[]; // css共有stylesheet集合 or URLパスプレフィックス
  structuralCoreTokens: string[]; // クラスタ内で共有されているDOM構造トークンの多数決コア
  landmarks: {
    [type in 'header'|'footer'|'nav'|'aside'|'form'|'search']?: {
      presenceRate: number;      // このクラスタの何割のページがこのlandmarkを持つか
      chromeRate: number;        // そのうち何割がサイト共通chromeと判定されたか
      shellTokens: string[];     // chrome判定の根拠トークン集合
      memberCountWithInstance: number;
    };
  };
  siblingClusterKeys: string[]; // 同一ブロッキンググループ内で分岐した兄弟クラスタのキー
};

同時に、includeLandmarkPositions オプション・PageClusterKeyResultPageLandmarkReport 型は削除された(本番未使用のため後方互換なし)。

即座に必要な対応: なし

nitpicker側のコードを全数確認した結果、includeLandmarkPositionsPageClusterKeyResultPageLandmarkReport への参照はゼロ件。classify-page-templates.tsresolvePageClusterKeys(factory, { onProgress }) のみを呼んでおり、削除されたAPIは使っていないため、型エラー・実行時エラーは発生しない

また @nitpicker/core/package.json の依存は "@d-zero/page-cluster": "0.3.1" と完全固定(range指定なし)で、.yarnrc.ymlnpmMinimalAgeGate: 7d もあるため、npm公開後もこちらで明示的にバージョンを上げるまで何も変わらない。

本来やりたいこと: templateKey に選定理由を紐付ける

現状 page_templates テーブル(packages/@nitpicker/crawler/src/archive/create-adjunct-tables.ts)は template_key(string)のみを保持し、理由に相当するデータは一切持たない。packages/@nitpicker/query/src/compute-css-intersection.ts の冒頭コメントは「page-clusterが内部で使っているCSS絞り込みロジック(頻出hrefの除去・first-partyフィルタ)が将来public API化されたら統合を検討する」と事前に予告している——onClusterReason はまさにこの予告に応えるものと言える。

統合する場合に触る箇所(現状把握のみ、設計は未着手):

  • DBスキーマ: create-adjunct-tables.tspage_templates(列追加 or 新規テーブル)
  • 書き込みAPI: replace-page-templates.ts(現状 Map<url, templateKey> のみ受け取る形)
  • 分類実行: classify-page-templates.ts:93-96resolvePageClusterKeys 呼び出しに onClusterReason を渡す)
  • クエリ集計層: list-page-template-clusters.ts / TemplateClusterSummary 型(compute-css-intersection.ts 等の自前簡易実装を ClusterReason.blocking/structuralCoreTokens で置き換えられる可能性)
  • APIレイヤー: register-template-clusters-route.tstemplate-clusters-cache.ts
  • フロントエンドUI: template-clusters-view.tsxclusterHeading())、use-template-clusters.tstranslations.ts

決定済みの設計判断(tools側の議論より)

  • 理由は構造化データのみ。人間可読な文言(「ヘッダーが共通です」等)は返さない — page-clusterは表示・言語非依存を維持する設計方針のため、文言組み立てはnitpicker側の責務
  • コールバックはクラスタ単位(ページ単位ではない)。ClusterReason はクラスタ数に比例したサイズなので、ページ数の上限を受けない(旧 includeLandmarkPositions が20,000ページ制限を持っていたのはページ単位設計が原因だった)
  • landmarkの位置情報そのものが必要な場合は、extractLandmarks(既存公開API)と新規公開された isChromeLandmarkInstancejaccardSimilarity@d-zero/page-cluster/is-chrome-landmark-instance@d-zero/page-cluster/jaccard-similarity)を呼び出し側が組み合わせる設計

参照

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions