From daytrace
Claude / Codex 履歴から反復パターンや定着させたい作法を抽出し、 recurring workflow / repeated instruction を `CLAUDE.md` / `skill` / `hook` / `agent` のどれに適用すべきか評価して proposal を返す。
How this skill is triggered — by the user, by Claude, or both
Slash command
/daytrace:skill-minerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
AI 会話履歴を横断して、定着させたい作法を `extract / classify / evaluate / propose` するための skill。
references/b0-observation.mdreferences/carry-forward-state-machine.mdreferences/classification-prompt.mdreferences/classification.mdreferences/classify-target-selection.mdreferences/cli-usage.mdreferences/cross-repo-handoff.mdreferences/formatter-contract.mdreferences/proposal-json-contract.mdreferences/research-protocol.mdAI 会話履歴を横断して、定着させたい作法を extract / classify / evaluate / propose するための skill。
CLAUDE.md / skill / hook / agent の 4 分類で判定する提案(アクション候補) / 有望候補(もう少し観測が必要) / 観測ノート の main UX で返すやらないこと:
plugin 分類skill / hook / agent の即時生成daily-report / post-draft の処理aggregator は使わない。skill-miner 専用 CLI だけを使う。
スクリプトはこの SKILL.md と同じ plugin 内の scripts/ にある。
このディレクトリから ../.. を辿った先を ${CLAUDE_PLUGIN_ROOT} として扱う。
提案フェーズ:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_prepare.py --input-source auto --store-path ~/.daytrace/daytrace.sqlite3 --decision-log-path ~/.daytrace/skill-miner-decisions.jsonl
workspace 制限を外して広域観測する場合:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_prepare.py --input-source auto --store-path ~/.daytrace/daytrace.sqlite3 --decision-log-path ~/.daytrace/skill-miner-decisions.jsonl --all-sessions
補足:
--all-sessions は workspace 制限を外すだけで、7 日窓は維持する--input-source auto は store-backed observations を優先し、該当データが無い時だけ raw history へフォールバックする--reference-date YYYY-MM-DD(daily_report_projection の report_date と一致。06:00 境界は aggregate_core.resolve_date_filters と揃う)--store-path を付けると candidate を patterns として store へ更新し、旧 raw path との比較が必要な期間は --compare-legacy を併用できるworkspace モード(--all-sessions を付けない通常実行。--workspace 未指定時は cwd を使う)だけ、packet / candidate が少なすぎる場合に 30 日へ自動拡張する--all-sessions --days 3650 --dump-intents のように明示する追加調査の detail 再取得:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_detail.py --refs "<session_ref_1>" "<session_ref_2>"
追加調査後の結論判定:
SESSION_TMP="${SESSION_TMP:-$(mktemp -d "${TMPDIR:-/tmp}/daytrace-session-XXXXXX")}"
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_research_judge.py --candidate-file "$SESSION_TMP/prepare.json" --candidate-id "<candidate_id>" --detail-file "$SESSION_TMP/detail.json"
最終 proposal 組み立て(classification overlay がある場合は --classification-file を繰り返す):
SESSION_TMP="${SESSION_TMP:-$(mktemp -d "${TMPDIR:-/tmp}/daytrace-session-XXXXXX")}"
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_proposal.py \
--prepare-file "$SESSION_TMP/prepare.json" \
--judge-file "$SESSION_TMP/judge.json" \
--classification-file "$SESSION_TMP/classifications/c1.json" \
--decision-log-path ~/.daytrace/skill-miner-decisions.jsonl \
--skill-creator-handoff-dir ~/.daytrace/skill-creator-handoffs \
> "$SESSION_TMP/proposal.json"
ユーザー判断の writeback:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_decision.py --proposal-file "$SESSION_TMP/proposal.json" --candidate-index 1 --decision adopt --completion-state completed --output-file "$SESSION_TMP/user-decision.json"
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/skill_miner_proposal.py --prepare-file "$SESSION_TMP/prepare.json" --judge-file "$SESSION_TMP/judge.json" --decision-log-path ~/.daytrace/skill-miner-decisions.jsonl --skill-creator-handoff-dir ~/.daytrace/skill-creator-handoffs --user-decision-file "$SESSION_TMP/user-decision.json" > "$SESSION_TMP/proposal-final.json"
永続化 path の扱い:
skill_miner_prepare.py と skill_miner_proposal.py は同じ --decision-log-path を共有する/tmp/*.json ではなく、mktemp -d で作った session-specific temp dir に置くskill_miner_decision.py は proposal 選択結果を --user-decision-file 互換 JSON に正規化するskill_miner_proposal.py の skill handoff は --skill-creator-handoff-dir に保存されるskill_miner_prepare.py を 1 回だけ実行する7 日--all-sessions は workspace 制限を外すモードであり、無制限読み込みではないworkspace モード(--all-sessions なし)は 7 日で開始し、packet / candidate が少なすぎる時だけ 30 日へ自動拡張するworkspace モードにだけ持たせるcandidates と unclustered を ready / needs_research / rejected に分けるproposal_ready=true の候補だけを採用し、返却件数は prepare 側の top_n に従う(デフォルト 10)。0 件 でも正常系として扱うneeds_research 候補だけ、必要な場合に限って research_targets を使って 1 回だけ追加調査するskill_miner_research_judge.py の結論を proposal に反映し、提案(アクション候補) / 有望候補 / 観測ノート を返す提案(アクション候補) がある時だけ、次セッションでどれを apply するかを確認するisSidechain で logical session に分割するcandidates を返すsession_ref を発行するevidence_items[] を最大 3 件作る--dump-intents 指定時だけ intent_analysis を返すcandidates を 3 区分にトリアージするなぜこの候補か と なぜその分類か を説明するskill-applier skill に委ねるやってはいけないこと:
skill_miner_prepare.py の主な読みどころ:
config.days
7config.effective_days
30 になる場合があるconfig.all_sessions
true の時は workspace 制限だけを外すconfig.adaptive_window
--all-sessions なし)で 30 日へ拡張したか、その判定基準と初期件数config.adaptive_window.expanded
summary
candidates[].support
candidates[].confidence, proposal_ready, triage_status
candidates[].evidence_items
candidates[].research_targets
needs_research 候補で優先して detail を取る refcandidates[].research_brief
intent_analysis
--dump-intents 指定時だけ出る B0 観測用サマリevidence_items[] contract:
{
"session_ref": "codex:abc123:1710000000",
"timestamp": "2026-03-10T09:00:00+09:00",
"source": "codex-history",
"summary": "SKILL.md の構造確認を行い、提案理由を整理"
}
注意:
primary_intent は packet ごとの主目的を短く正規化した文字列packet_version=2) と required fields が揃った時だけ再利用されるuser_rule_hints は 1 回出現の user directive を clustering 用に保持し、user_repeated_rules は strict repeated evidence として別に残るtask_shape / artifact_hints / representative_snippets は cleaned user text を優先し、assistant text は user text が無い時だけ fallback で使うuser_rule_hints は directive-only で、用語説明や差分説明の mention は rule count に入れないsummary は primary_intent 優先、空なら snippet 由来proposal 側は evidence_items[] を使って表示し、raw history を再読込しない[WORKSPACE]、URL はドメインだけにマスクされる分類先は 4 つだけ使う。詳細な境界ケースは references/classification.md を参照する。
B0 観測の方法と優先順位ルールは references/b0-observation.md を参照する。
CLAUDE.md
skill
hook
agent
除外:
plugin
readyproposal_ready=trueconfidence が strong または mediumneeds_researchquality_flags に注意信号があるrejectedunclusteredconfidence=insufficientルール:
prepare 側の top_n に従う(デフォルト 10)0 件 でも失敗扱いにせず、理由と次回への示唆を返すneeds_research 候補は必要な場合だけ detail を取るskill_miner_proposal.py の stdout は machine-actionable な JSON object であり、markdown はその 1 フィールドに過ぎない。
下流の skill-applier や decision writeback はこの JSON を直接消費する。
主要フィールド:
| フィールド | 型 | 消費者 |
|---|---|---|
ready[] | candidate objects | skill-applier が適用アクションに使う |
ready[].skill_scaffold_context | object | skill scaffold draft の構造化入力 |
ready[].skill_creator_handoff | object | skill-creator への handoff(schema v2: cross_repo / target_workspace_hint / presentation_block 等。references/cross-repo-handoff.md) |
ready[].next_step_stub | object | hook/agent 設計案の構造化入力 |
markdown | string | ユーザー向け提案表示(人間可読ビュー) |
selection_prompt | string|null | 候補選択プロンプト(ready > 0 の時のみ) |
decision_log_stub[] | objects | decision writeback + carry-forward |
observation_contract | object | 観測条件メタデータ |
learning_feedback | object | 0 件時の成長シグナル |
summary | object | ready_count, needs_research_count, rejected_count, triaged_total |
persistence | object | decision_log / handoff の書き込み結果 |
フィールド定義の詳細は references/proposal-json-contract.md を参照する。
既定の markdown は 最終 suggested_kind・短い分類サマリ(LLM/guardrail 時)・根拠・次の一手を中心にし、classification_trace の段階展開は省略する。詳細は --markdown-classification-detail または ready[] の JSON を参照。
daytrace-session / docs/output-polish.md §6)統合セッションでは、チャットの第一画面を次の表形式にする(ready[] を 1 行ずつ埋める)。全文の markdown は output_dir の proposal.md に保存し、チャットには表+一行要約+パスを返す。保存時、親ディレクトリが無ければ作成する(daily-report と同様。Phase 1 の projection が output_dir をコード側で用意済みの場合も、Write 前に存在確認してよい)。
ready_current_repo[] / ready_other_repo[] / ready_uncertain[] がある場合は、現在のリポジトリ向け → 別リポジトリ向け / 要確認 の順で 2 段表示を優先する。
見出し文言は次で出し分ける:
ready_other_repo[] のみ: 別リポジトリ向けready_uncertain[] のみ: 要確認別リポジトリ向け / 要確認| # | 候補 | 種類 | 確度 | 効果 | アクション |
|---|------|------|------|------|-----------|
| 1 | {display_label} | CLAUDE.md / skill / hook / agent | {高い/中程度/まだ弱い 等} | {次回どう楽になるか一言} | {すぐ追加可 / skill-creator 等} |
workspace-local / global-personal)は docs/output-polish.md §9-4 の任意メタ。表に列として必須にしない。本文や注記で短く付けてもよい/skill-miner 単体実行時も、チャット切れ防止のため同じく proposal.md へ保存することを推奨確度 / 効果 / アクション 列は省略しない効果 欄は各候補に固有の改善内容を書く。「効率が上がる」「再利用できる」等の汎用文言を全候補に使い回さない。候補の evidence_items から読み取れる具体的な効果(例: 毎回の DayTrace 出力レビュー指示が不要になる)を 1 文で書くproposal.json の label フィールドは carry-forward の identity key として Python が生成する(変更しない)。
LLM は ready[] / needs_research[] の各候補を表示する直前に、表示専用の display_label を生成してから使う。
生成ルール:
label / representative_examples / task_shapes / artifact_hints / evidence_items[].summary を読むclassification refresh plan → 分類ロジック改善計画output-polish → 出力品質改善skill_miner_prepare.py → パターン抽出準備良い例:
週次振り返り評価プロンプト管理DayTrace 出力 UX レビュー新スレッド開始時の現在地整理skill-miner 変更サマリ確認避けるべき例(raw 発話断片のまま):
以下の出力結果をレビューしどのような改善を行ったら配布先のユーザーのUXが最大化するか提案してください ← ×OK!では一週間の振り返りのものが揃いました。あ、まだか ← ×display_label を使う箇所(表示のみ):
proposal.md の候補見出し(番号の直後)display_label を使わない箇所(identity):
proposal.json の label(Python が生成する identity key。LLM は変更しない)decision_key / content_key の材料(label を使用。display_label は無関係)proposal の冒頭には観測範囲を明示し、Python 生成の 候補内訳 1 行(適用 / 追加観測 / 観測ノート / 合計)の直後に 3 区分の本文が続く。
内部 triage key(ready / needs_research / rejected)はそのままで、ユーザー向け見出しだけを変更する。
チャットの「候補 ○ 件」や「○ 件中 △ 件を提案」は skill_miner_proposal.py の stdout(proposal.json)の summary.triaged_total と summary.ready_count を使う。prepare.json の summary.total_candidates だけを根拠にすると、分割・材料化・メタ欠落で 合計 0 と ready 7 のような不整合が起きうる。
compact 表は 1 表に押し込まず、必要なら次の 2 段構成にしてよい:
### 現在のリポジトリ向け### 別リポジトリ向け / 要確認skill 行の compact 表に 適用先 を足してよい(別リポジトリ / 現在のリポジトリ / 要確認)。詳細は proposal 本文の 適用先: と skill_creator_handoff.presentation_block(永続化後)。
intent_trace ルール:
intent_trace を直接展開しない(raw intent の羅列はノイズになるため)evidence_items[].summary で完結させるintent_trace は decision_log_stub にのみ含める(デバッグ・監査用詳細は Decision Log Contract を参照)intent_trace を根拠として内部メモやユーザー向け短文に引用してよい([DayTrace] は使わない)needs_research の research_brief.questions に intent 不一致を含めてよいorigin_hint, user_signal_strength, contamination_signals)は markdown に短い注記として出してよいorigin_hint="" は legacy packet 由来の「未観測」を意味し、単独では汚染疑いとして扱わないselection_prompt は chat / interactive step 用であり、artifact の proposal.md 本文末尾へ再掲しないconstraints / acceptance_criteria は artifact では raw prompt の長文をそのまま出さず、必要なら短い要約に圧縮する### 観測範囲
観測範囲: {workspace名} / 直近 {N}日間 / {使用した source リスト}
## 提案(アクション候補)
1. {display_label}(※ `label` から LLM が生成する表示名。8〜20 文字の再利用可能な作業名)
固定先: skill
確度: 中程度 — 複数セッションで出現、もう少し定着を見たい
根拠:
- 2026-03-08T10:00:00+09:00 claude-history: findings-first review を要求
- 2026-03-10T09:00:00+09:00 codex-history: 同系の review 指示を再確認
期待効果: 同種作業の再利用フローを安定化できる
→ この作法を固定すれば、毎回の指示が不要になります
## 有望候補(もう少し観測が必要)
1. 候補名
確度: まだ弱い — 出現回数が少なく、今後の観測次第
出現: 3回 / 2ソース
根拠:
- 2026-03-08T10:00:00+09:00 claude-history: 汎用 review 指示
現状: 巨大クラスタで意味の異なる作業が混ざる可能性がある
次のステップ: 1-2 週間の運用後に再観測で分割判断
## 観測ノート
1. 候補名または項目種別
理由: 1 回だけの出現で、繰り返しパターンとは判断できませんでした
ルール:
提案(アクション候補) / 有望候補 / 観測ノート を main UX にする提案(アクション候補) だけを重要度順に並べる有望候補 には 現状 と 次のステップ を書く観測ノート には 1 文で理由を書く提案(アクション候補) が 1 件以上ある時だけ、末尾に候補選択プロンプトを付けて次セッションの apply / draft 選択へ進める注記: を付け、内部運用疑い・assistant fallback 依存・summary fallback 依存を短く示してよいproposal_ready=true の候補が 0 件の場合も正常系として、以下を返す:
### 観測範囲
観測範囲: {workspace名} / 直近 {N}日間 / {source}
> 候補内訳: 適用 0 / 追加観測 {needs_research_count} / 観測ノート {rejected_count}(合計 {triaged_total})
## 提案(アクション候補)
今回は有力候補なし
検出候補数: {triaged_total}件中 0 件が提案条件を満たした
見送り理由の傾向: {主な理由(例: 観測窓が短い / oversized cluster / セッション数が少ない)}
候補が増える条件: {いつ再実行すると候補が出やすいか(例: 同じ workspace で 2-3 週間使い続けると反復パターンが明確化しやすい)}
decision_log_stub[] は proposal ごとに全候補分を出力し、次回判定への橋渡しに使う。
ユーザーが具体的な adopt / defer / reject を返した場合は、skill_miner_decision.py で --user-decision-file を作り、skill_miner_proposal.py を同じ --decision-log-path で再実行して persist する。
proposal.json は skill_miner_proposal.py の stdout を redirect して作る。candidate-index は 1-based(最初の候補は 1)。
{
"decision_key": "stable-match-key",
"content_key": "stable-content-key-without-kind",
"candidate_id": "id",
"label": "display name",
"recommended_action": "adopt | defer | reject",
"triage_status": "ready | needs_research | rejected",
"suggested_kind": "CLAUDE.md | skill | hook | agent",
"reason_codes": ["quality_flag_1", "..."],
"split_suggestions": ["split_axis_1"],
"intent_trace": ["intent_1", "intent_2"],
"user_decision": null,
"user_decision_timestamp": null,
"carry_forward": true,
"observation_count": 3,
"prior_observation_count": 0,
"observation_delta": 3
}
フィールド説明:
decision_key: 次回 prepare の readback に使うキー(suggested_kind を含む)。分類が変わると値も変わるcontent_key: 分類に依存しない候補本体のキー。decision_key が一致しないが同一候補のときの二次マッチに使う(詳細は references/carry-forward-state-machine.md)user_decision: セッション中にユーザーが adopt / defer / reject を選んだ場合のみ埋まる。Python 側は null で初期化するuser_decision_timestamp: user_decision 設定時の ISO8601。Python 側は null で初期化するcarry_forward: 次回 prepare で考慮すべきか。デフォルト trueintent_trace: 監査用。proposal markdown には展開しないdecision_log_stub は次回判定用の機械的な橋渡しに限定し、分類 override の長い説明は保持しない
分類 override の記録ルール:decision_log_stub ではなく、人間向けの候補説明または ### パターン提案 の一行要約に短く残す分類 override: heuristic=<from> → final=<to> / reason: <short reason>daytrace-session 配下では compact 表 + proposal.md を正とし、[DayTrace] プレフィックスは使わないskill-miner でも上記を推奨(長文のみチャットは切れやすい)
次回判定への反映ルール(詳細は references/carry-forward-state-machine.md を参照):user_decision="adopt" かつ CLAUDE.md → CLAUDE.md に追記済み。次回は ## DayTrace Suggested Rules と照合して重複 skipuser_decision="adopt" かつ skill/hook/agent → 生成成功(done)を確認できた場合のみ carry_forward=false で次回 suppress。成功未確認・中断時は defer 扱いで suppress しないuser_decision="defer" → 次回も候補化される。observation_count 増加で confidence が自然に上がる。observation_delta で変化量を追跡user_decision="reject" → 永続 reject しない。再浮上条件(evidence_changed / support_grew / time_elapsed)を満たした場合のみ再出現。いずれも未達なら suppressuser_decision=null → 未選択。carry_forward=true のまま次回に自然再出現するneeds_research 候補だけ追加調査してよい。
research_targets と research_brief を優先して使う観測ノート に落とす追加調査後:
promote_ready
提案(アクション候補) へ移すsplit_candidate
有望候補 に残し、必要なら分割軸を書くreject_candidate
観測ノート に移す候補選択後の適用アクション(CLAUDE.md apply / skill scaffold / hook・agent 設計案)は skill-applier skill が担う。
詳細は skills/skill-applier/SKILL.md を参照する。
LLM classification overlay は 全候補ではなく曖昧候補だけにかける。rejected は原則 overlay なし。明らかな hook・強い CLAUDE.md シグナルでヒューリスティックが閉じている候補は省略してよい。
references/classify-target-selection.mdskill_miner_proposal.py --classification-targets-only を使うと、prepare + judge をマージした後の classification_targets[] を JSON で取得できるclassification_trace を載せる場合は skill_miner_proposal.py --markdown-classification-detailready[] は常に classification_trace / classification_guardrail_signals を保持(内部 contract を壊さない)suggested_kind は Python 側の infer_suggested_kind() がヒューリスティックに事前付与する。
LLM は override できるが、明確な理由がない限り Python のデフォルトを尊重する。
生成経路(どちらでも可):
prepare.json を読み、references/classification-prompt.md の contract に従って候補ごとに overlay JSON を書き出すcandidate_id と抜粋を渡し、サブが 1 候補 1 ファイルの overlay を返す(contract は同一)いずれの経路でも、確定処理は script 側に集約する。skill_miner_proposal.py に --classification-file <json> を 候補ごとに繰り返し渡すと merge + guardrail で final kind になる。ファイルが無い・JSON 破損のファイルはスキップされ、当該候補は heuristic のみにフォールバックする。
判定ルール(優先順):
CLAUDE.md: artifact_hints に claude-md または rule_hints に CLAUDE.md 系ルール名 → CLAUDE.mdhook: 上位 task_shape が全て hook 向き(run_tests 等) → hookskill: 非汎用 task_shape が 1 つ以上 → skillagent: total_packets >= 4 かつ(agent 向き task_shape または rule_hints あり) → agentskillagent は Python 側がヒューリスティックに候補提示できるが、条件が厳しいため実際に付与されるケースは少ない。
LLM は suggested_kind_source="heuristic" の場合、evidence を確認して override してよい。
LLM が override する条件:
representative_examples を読み、明らかに別分類が適切な場合skill をデフォルトで返したが、内容がルール固定だけで手順がない場合(→ CLAUDE.md に override)skill をデフォルトで返したが、「どう振る舞うか」が主題で継続的役割が明白な場合(→ agent に override)agent を返したが、定型フローに落とせる場合(→ skill に override)suggested_kind_source=llm | guardrail_override と classification_trace に反映されるready[] の各候補に classification_guardrail_signals(宣言的比率・役割一貫性・従来 CLAUDE.md シグナル等)が付く。overlay の confidence は guardrail 分岐に使わず、観測・プロンプト改善用。境界と few-shot は references/classification.md / references/classification-prompt.md を参照contamination signal を見た時の追加ルール:
origin_hint="parent_ai" または contamination_signals に sidechain を含む候補は、原則 ready にしない。needs_research または rejected に落とし、内部オーケストレーション由来の可能性を明示するuser_signal_strength="low" かつ contamination_signals に assistant_fallback または summary_fallback を含む候補は、原則 ready にしないorigin_hint=""(legacy packet 由来の metadata 欠落)は単独では downgrade 根拠にしないevidence_items[] または detail で確認した短い理由が必須research_brief.questions に「実際の人間依頼か、assistant / internal scaffolding 優位か」を含めてよい注記: として見える化し、無言で CLAUDE.md や skill に昇格させないoversized_cluster / weak_semantic_cohesion / split_recommended / near_match_dense は research 段階の blocking signal とみなす。
これらが未解消のまま ready に入ることはない。
needs_research に強制promote_ready された candidate → 追加調査で blocking signal を解消済みとして 提案(アクション候補) へ昇格してよい追加調査で確認済み: ... を出し、何を解消して ready にしたかを残すcontamination guard:
low_user_signal / origin_uncertain / contaminated_candidate は internal-signal guard とみなし、未解消のまま ready に入れないprepare は 1 回だけ実行している7 日開始 + workspace-only adaptive 30 日 / --all-sessions に固定されているsuggested_kind が Python の infer_suggested_kind() で事前付与されているoversized_cluster が ready に流れていないlow_user_signal / origin_uncertain / contaminated_candidate が未解消のまま ready に流れていないevidence_items[] だけで表示できる0 件 を正常系として扱い、観測サマリと成長兆候を表示しているprepare の top_n と一致しているCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub matz-d/daytrace-plugin --plugin daytrace