learning-aggregator-ci について
`.learnings/` の履歴をスキャンし、重複を除いてパターンを分類し、優先順位付きのギャップレポートを公開する CI スキルです。セッションの文脈に依存せず、定期または手動の GitHub Actions 実行で非同期レビューを支援します。
主な機能
- 01`.learnings/` の全エントリーをスキャン
- 02複数ソースの発生記録を重複排除
- 03完全一致の `Pattern-Key` で分類
- 04昇格候補を優先順位付け
- 05YAML と Issue レポートを出力
活用シーン
- 01セッション間で繰り返す学習パターンの確認
- 02昇格可能なパターンの特定
- 03チームのトリアージ用に結果を共有
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pskoett/ pskoett-ai-skills --skill learning-aggregator-ciインストール後、Claude Code で/learning-aggregator-ciを入力して読み込まれたか確認します。
同梱ファイルreferences/workflow-example.md
詳細
Learning Aggregator CI
インストール
gh skill install pskoett/pskoett-skills learning-aggregator-ci
対話型セッションでは、次を使用します。
gh skill install pskoett/pskoett-skills learning-aggregator
Agent Skills CLI を使用するフォールバック:
npx skills add pskoett/pskoett-skills/skills/learning-aggregator-ci
npx skills add pskoett/pskoett-skills/skills/learning-aggregator
目的
CI で外側のループの検査ステップを実行します。蓄積された .learnings/ ファイルを読み込み、エントリーを pattern_key ごとにグループ化し、セッションをまたいだ再発率を計算して、優先順位付けされたギャップレポートを生成します。これらすべてを人間の操作なしで行います。
対話型の learning-aggregator スキルは、ユーザーがその場で調査結果を確認して対応できる、セッション内での使用を想定して設計されています。この CI 版はスケジュール(毎週、スプリントごと、または任意のタイミング)に従って実行され、調査結果を GitHub の Issue コメントに投稿して非同期レビューに回します。
コンテキストの制限(重要)
CI エージェントにはセッションのコンテキストがありません。ユーザーが現在取り組んでいる内容や、関連するタスク領域を把握できません。CI 版は、関連性によるフィルタリングを行わず、すべての .learnings/ エントリーをスキャンします。ギャップレポートは対象を絞らず、包括的な内容になります。
前提条件
- リポジトリで GitHub Actions が有効になっていること
ghCLI がリポジトリへのアクセス権を持つ状態で認証されていることgh-aw拡張機能がインストールされていること(gh extension install github/gh-aw、v0.40.1+)self-improvementからの構造化エントリーを含む.learnings/ディレクトリがあること
CI の契約
ヘッドレス実行に関する厳格なルール:
- 読み取り専用 —
.learnings/ファイル、プロジェクト指示ファイル(CLAUDE.md、AGENTS.md、.github/copilot-instructions.md)、またはリポジトリ内のファイルを変更しないこと - ヘッドレス — 対話型プロンプトや承認ゲートを設けないこと
- 構造化出力 —
learning_aggregator_ciキーの下に YAML 形式で調査結果を出力すること - コメントは1件のみ — 調査結果ごとではなく、実行ごとに統合コメントを1件投稿すること
- 決定性 — 同じ
.learnings/の状態からは、同じギャップレポートが生成されること
作成ワークフロー(gh-aw)
references/workflow-example.mdを.github/workflows/learning-aggregator-ci.mdにコピーします- 実行頻度に合わせてスケジュールをカスタマイズします(
weekly on mondaysのような曖昧なスケジュールにも対応しています) - 検証します:
gh aw compile(セキュリティスキャンを完全に実施するには、必要に応じて--actionlint --zizmorを追加します) - プッシュして有効にします
永続化と連鎖実行
cache-memory:は、集約状態(パターングループ、再発回数)を実行間で保存します。Actions キャッシュに最大90日間保持されます。変更されていないエントリーを実行のたびに再スキャンすることを避けられます。call-workflow:は、集約の完了後にeval-creator-ciをトリガーし、新たに昇格したパターンから eval を作成します。コンパイル時にファンアウトし、依存関係を適切に設定します。upload-artifact:は、後続のワークフローや人間によるレビューで使用できるよう、ギャップレポートの YAML を保持します。
キャッシュ状態では、集約スキーマとして provenance-v1 を宣言し、正規の出現フィンガープリント、安定したタスクの系譜、終端イベントの境界を保持する必要があります。このバージョンがないキャッシュ、または古い集約スキーマを使用するキャッシュは無視して再構築してください。重複排除前の契約に基づく集計カウントは、有効なベースラインではありません。
ワークフロールール
CI エージェントは、次のルールを順番に適用します。
.learnings/内のすべてのファイルを読み込みます:LEARNINGS.md、ERRORS.md、FEATURE_REQUESTS.md、HEALS.md- 各エントリーのメタデータを解析します:
Pattern-Key、Recurrence-Count、First-Seen、Last-Seen、Priority、Status、Area、Related Files、Tags、および任意の来歴フィールドであるTask-ID、Session-ID、Occurrence-ID、Source-Ref、Copied-From。HEAL エントリーの場合は、Trigger、Active-Context、およびHandoffブロックも解析します - グループ化する前に、リポジトリ内の場所、ミラー、フォーク、転送元、クラウド/ローカルのソースをまたいで、エントリー ID/内容または発生 ID が同じコピーをまとめます。明示的な発生 ID がない場合は、タスク/セッション/ソースの来歴と正規化した証拠を使用します。パスが異なっても、独立した証拠とはみなしません
- 正規化された発生を
Pattern-Keyでグループ化します(完全一致のみ。CI ではあいまいなグループ化は行いません) - 各グループについて、重複排除後の再発回数を数え、安定した来歴から個別のタスク数を算出し、期間を計算して証拠を収集します。安定したタスク/セッションの来歴がないレガシーエントリーは、申告された再発回数を 1 回分として数えますが、来歴不明の証拠は、個別タスク数として最大 1 件まで数えます
Pattern-Keyがないエントリーには、未グループ化のフラグを付けますpromoted、promoted_to_skill、resolved、wont_fixは、記録された発生について終端状態として扱います。終端状態のみのグループは履歴として保持し、昇格候補にはしません。最後の終端イベント以降に新しい有効な証拠がある場合にのみ再開します。それ以前のHandoffだけでは、そのパターンを再度昇格させません- 対応が必要な各グループのギャップ種別を分類します:知識ギャップ、ツールギャップ、スキルギャップ、曖昧さ、または推論の失敗
- 次の順にグループをランク付けします:昇格可能なもの、次にしきい値に近づいているもの、その後は優先度(critical > high > medium > low)
learning_aggregator_ciキーの下に構造化 YAML を出力します- ギャップレポートを、トリガーとなった issue へのコメントとして投稿するか、スケジュール実行時には新しい issue として作成します
- リポジトリ内のファイルは変更しません
昇格のしきい値(learning-aggregator および self-improvement と同じルール):重複排除後の再発回数が >= 3 で、安定した来歴によって証明された >= 2 件の個別タスクで確認され、かつ期間が 30 日以内の場合、そのグループは昇格可能です。
出力スキーマ
learning_aggregator_ci:
version: "0.1.0"
source:
run_id: "<workflow run ID>"
trigger: "schedule | workflow_dispatch | issue_comment"
scan_date: "YYYY-MM-DD"
scan:
entries_total: 42
entries_with_pattern_key: 35
entries_ungrouped: 7
patterns_found: 18
promotion_ready: 3
approaching_threshold: 5
promotion_ready:
- pattern_key: "harden.input_validation"
recurrence_count: 5
distinct_tasks: 3
window_days: 21
priority: "high"
gap_type: "knowledge_gap"
area: "backend"
evidence:
- "LRN-20260301-001: Missing bounds check on pagination params"
- "ERR-20260308-002: Unconstrained string length caused OOM"
- "LRN-20260315-003: API params not validated before DB query"
recommended_action: "Add to project instruction files: Always validate and bound-check external inputs before use"
eval_candidate: true
approaching:
- pattern_key: "simplify.dead_code"
recurrence_count: 2
distinct_tasks: 1
priority: "low"
needs: "1 more distinct task"
ungrouped:
- id: "LRN-20260320-005"
summary: "Discovered undocumented rate limit on external API"
recommendation: "Assign pattern_key for future tracking"
stale:
- pattern_key: "harden.error_handling"
last_seen: "2025-12-01"
recommendation: "Dismiss — not seen in 90+ days"
summary:
promotion_ready_total: 3
approaching_total: 5
ungrouped_total: 7
stale_total: 1
followup_required: true
推奨される出力
| 出力 | 保存先 | 内容 |
|---|---|---|
| ギャップレポート | Issue コメントまたは新しい issue | 昇格候補と証拠を含む、人が読める要約 |
| YAML アーティファクト | ワークフローアーティファクト | 機械可読な learning_aggregator_ci ペイロード |
| チェック注釈 | チェック実行の概要 | 昇格可能なパターンと、しきい値に近づいているパターンの件数 |
トリガー設定
推奨:週次スケジュール+手動ディスパッチ
on:
schedule:
- cron: '0 9 * * 1' # Monday 9am UTC
workflow_dispatch:
issue_comment:
types: [created]
スケジュールにより、定期的な外側ループの実行が保証されます。手動ディスパッチを使うと、インシデントやスプリントの後に必要に応じて実行できます。Issue コメントトリガーを使うと、/aggregate-learnings コマンドを実行できます。
他のスキルとの連携
上流(入力元)
self-improvement(対話型)—.learnings/LEARNINGS.md、ERRORS.md、FEATURE_REQUESTS.mdのエントリーを生成しますself-healing/self-healing-ci—Handoffブロックを含む.learnings/HEALS.mdのエントリーを生成しますself-improvement-ci— 学習候補を機械可読な出力(アーティファクト/コメント)として出力します。読み取り専用で、.learnings/ファイル自体は書き込みませんsimplify-and-harden-ci— self-improvement-ci が使用するlearning_loop.candidatesを生成します
下流(入力先)
- self-improvement(対話型)— ギャップレポートから昇格可能なパターンを受け取り、人間の承認を得て昇格を適用します
- eval-creator-ci — 評価候補を受け取り、恒久的なテストケースを作成します
- 人間によるレビュー — チームでのトリアージ用に、ギャップレポートが issue コメントとして投稿されます
データフロー
self-improvement → .learnings/*.md ← self-healing(-ci) → HEALS.md
↓
learning-aggregator-ci (scheduled)
↓
gap report (issue comment + artifact)
↓
self-improvement (interactive, human-gated promotion)
↓
eval-creator-ci (creates evals from promoted patterns)
インタラクティブ版との違い
| 項目 | インタラクティブ版(learning-aggregator) | CI(learning-aggregator-ci) |
|---|---|---|
| トリガー | 手動またはセッション開始時 | 定期実行の cron または workflow_dispatch |
| 関連性フィルター | 現在のタスク領域に基づいてフィルタリング | すべてのエントリをスキャン(タスクのコンテキストなし) |
| グループ化 | 保守的なマッチング+領域/タグによるマッチング | パターンキーの完全一致のみ |
| 出力 | セッション内のギャップレポート | Issue コメント+YAML アーティファクト |
| 人による操作 | ユーザーがインラインで確認 | GitHub 経由の非同期レビュー |
| 対象範囲 | 現在のセッションのコンテキスト | .learnings/ の全履歴 |