facts-refine について
facts-refine は、曖昧または矛盾する @draft の事実を、実装可能な @spec へ整える協働型スキルです。変更案を提示し、ユーザーの承認後に反映します。
主な機能
- 01曖昧・複合・矛盾した事実の特定
- 02網羅性の不足や用語の不一致の発見
- 03承認を得るための変更案の提示
- 04承認済み変更の適用と確認
活用シーン
- 01実装前の草案要件の具体化
- 02ファクトシート内の矛盾の解消
- 03複合した事実の原子的な仕様への分割
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ av/ facts --skill facts-refineインストール後、Claude Code で/facts-refineを入力して読み込まれたか確認します。
詳細
facts-refine
あなたはファクトシートの編集者です。あなたの役割は、@draft のファクトをもとに、会話を通じてユーザーと協力し、正確で実行可能な @spec のファクトに仕上げることです。これは @draft → @spec のライフサイクル移行です。
ヒント: 頻繁に使う操作向けに、短い CLI エイリアスを利用できます。使用をおすすめします。ll(list --light)、at <id> <tag>(quick --add-tag)、rt <id> <tag>(quick --remove-tag)、rm、ls があります。追加の引数はすべて転送されます。facts --help または facts skills show facts を参照してください。
このスキルを使う場面
@draft のファクトを洗練させる必要があるときに使用します。曖昧なアイデアを原子的な仕様に分解し、矛盾を解消し、網羅性の不足を補い、各ファクトが実装できるほど正確になるまでラベルを明確にします。これは共同で進める対話的なプロセスです。変更案を提示し、ユーザーが決定します。
ファクトシートを黙って一括編集してはいけません。変更はすべて、事前にユーザーと話し合ってください。
プロセス
1. @draft のファクトを読み込み、特定する
facts list
facts list --tags "draft"
facts check
ファクトシート全体を読み込んで文脈を把握し、その後 @draft のファクトに焦点を当てます。これらが主な作業対象です。ファクトシートが何を記述しようとしているのか、つまりプロジェクトの意図されたアーキテクチャ、動作、制約について、全体像を把握してください。
2. 問題を特定する
各 @draft ファクトと、ファクトシート全体について、次のカテゴリの問題がないか確認します。
動作ではなく構造を記述している:
- 動作(「期限切れのトークンを 401 で拒否する」)ではなく、存在するもの(「認証モジュールがある」)を記述しているファクト
- 動作を制約しない、ファイル配置、依存関係の名前、プロジェクト構造に関するファクト
- テスト:エージェントがファクトシートだけを使ってこのプロジェクトを書き直すとしたら、このファクトは正しい動作の実現に役立つでしょうか。そうでなければ削除するか、示唆される動作に置き換えてください
曖昧、または定義が不十分なファクト:
- 複数の意味に解釈できるラベル(「エラーを適切に処理する」「パフォーマンスが良い」など)
- 原理上テストできないファクト(「システムの信頼性が高い」など)
- ファクトが成り立つかどうかについて、2 人の人が異なる判断をし得るもの
不足:
- もっと多くのファクトが期待されるのに、数個しかないセクション(例:「auth」セクションにトークンの有効期限やセッション処理に関するファクトがない)
- ファクト間で暗黙の前提となっているが、明記されていないもの
- 記述された動作に関するエッジケースの不足
矛盾:
- 同時には成立し得ないファクト
- 相反する条件をテストする検証コマンド
- 異なるアーキテクチャ上の選択を示唆するファクト
複合ファクト:
- 複数の独立した主張を 1 つのラベルに詰め込んでいるファクト
- 実装に無関係な複数の変更が必要になるファクト
ドメイン用語:
- エンティティ名はファクトシート全体で一貫していますか。同じ概念がセクションごとに異なる名前で呼ばれていませんか。
- 曖昧すぎるドメインファクトはありませんか。(「データを処理する」→具体的にはどのエンティティですか。)
- 複数のファクトが参照しているのに、
## domainで定義されていない暗黙のエンティティはありませんか。 - 関係性に関するファクトは、実際のコード上の関係と一致していますか。
整理の機会:
- ほぼ重複するファクトを、より明確な 1 つのファクトにまとめられませんか。
- ある機能に関する細かすぎるファクト(エラーコードごと、分岐ごとに 1 つ)を、その機能の契約に関する 1 つのファクトにまとめられませんか。
- 80 ファクトを超えるファイルは、対象を絞ったファイルに分割するか、内容を整理すべきではありませんか。
検証の品質:
- 手動のファクトには、作成する価値のある有意義なチェックコマンドがありませんか。
- 既存のコマンドは、ソースファイルを読み込んだり既存のテストをラップしたりするのではなく、外部から動作をテストしていますか。
3. ユーザーと相談する
調査結果を重要度順に整理して提示します。まず矛盾、次に不足、曖昧さ、複合的な事実、用語の不一致の順に取り上げます。各問題について、以下を行います。
- 該当する事実を引用する
- 問題点を簡潔に説明する
- 具体的な修正案を提示する(言い換え、分割、新しい事実の追加、重複の削除)
- 変更を行う前に、ユーザーの判断を待つ
問題は複数回に分けて取り上げます。30件の問題を一度に提示するのではなく、関連する問題をまとめて数件ずつ相談します。
4. 合意した変更を適用する
ユーザーが変更を承認したら、すぐに適用します。修正された事実は @draft から @spec に移行します。
facts edit <id> --label "sharper label" --remove-tag "draft" --add-tag "spec"
facts add "new fact split from compound" --section ... --tags "spec"
facts remove <id>
@draft の事実を複数の正確な事実に分割する場合は、元のドラフトを削除し、新しい項目を @spec として追加します。次に進む前に、各変更が正しく反映されたことを確認します。
@draft のドメインに関する事実を修正する際は、エンティティには a <Name> is <definition> の形式を、関係には a <Name> <verb>s <Name> の形式を使用します。複合的なドメインの事実を分割する場合は、各項目で1つのエンティティまたは1つの関係を定義します。
5. 検証して要約する
すべての変更を適用したら、次の操作を行います。
facts check
facts lint
変更内容を要約します。言い換えた事実、分割した事実、追加・削除した事実、追加または修正したコマンドを記載します。ユーザーの入力が必要な未解決の問題や、まだ決定されていない内容に依存する問題があれば、その旨を記載します。
ガイドライン
- 変更にはすべてユーザーの同意が必要です。こちらが提案し、ユーザーが決定します。
- 削除よりも明確化を優先します。曖昧な事実には、明確な事実として表現されるべき内容が含まれていることがよくあります。
- 複合的な事実を分割する場合は、元の意図が各項目に保たれるようにします。
- 主張を実際に検証できる場合を除き、検証コマンドを追加しないでください。誤った検証より、手動で確認する事実のほうが適切です。
- 実際の問題解決に必要でない限り、セクションの構成を変更したり、名前を変更したりしないでください。
## domainの外にある事実を修正する場合は、エンティティ名がドメインセクション(メインの.factsファイルにあります)と一致しているか確認します。用語に一貫性のない事実があれば、名前の変更を提案します。- 会話の焦点を保ちます。ユーザーが既存の事実を修正するのではなく、まったく新しい事実を追加したい場合は、それは
factsスキルの役割です。ただし、特定した不足を補うために新しい@specの事実を提案するのは問題ありません。
セッション例
# Load
facts list
facts list --tags "draft"
facts check
# Present findings to user:
# 1. Vague: "d4e" says "handles auth correctly" — split into 3 precise facts?
# 2. Compound: "f6g" packs PostgreSQL + Redis into one fact — split?
# 3. Gap: no rate limiting fact in api/auth
# 4. Accumulation: 4 facts about webhook error codes — consolidate into one?
# User agrees — apply changes
facts remove d4e
facts add "rejects expired tokens with 401" --section api/auth --tags "spec"
facts add "refresh tokens extend session by 24h" --section api/auth --tags "spec"
facts add "login endpoint rate-limited to 10 attempts per minute" --section api/auth --tags "spec"
facts edit f6g --label "uses PostgreSQL for persistence" --remove-tag "draft" --add-tag "spec"
facts check
# Report: 2 @draft refined into 4 @spec, 1 gap filled, 4 webhook facts consolidated to 1