task-observer について
task-observer は、スキルを使った実作業から改善案を記録・整理するスキルです。永続的な観察ログに問題点を残し、必要に応じてレビュー、作成、設定の手順を読み込みます。
主な機能
- 01実作業で見つけたスキル改善点の記録
- 02項目ごとの永続的な観察ログ
- 03セッション開始時の観察状況スキャン
- 04条件に応じた参照手順の読み込み
- 05定期レビューとスキル作成のガイド
活用シーン
- 01スキル利用中に気づいた問題の記録
- 02未対応の改善案をセッション間で追跡
- 03手順に沿ったスキルファイルのレビューと更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rebelytics/ one-skill-to-rule-them-all --skill task-observerインストール後、Claude Code で/task-observerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
CONTRIBUTING.md.gitattributesCODE_OF_CONDUCT.mdREADME.mdLICENSEUSER-GUIDE.mdSECURITY.mdSUPPORT.md.claude-plugin/plugin.jsonmarketplace.json.github/pull_request_template.md.github/ISSUE_TEMPLATE/report-a-failure.mdpropose-a-change.mdconfig.yml.github/workflows/release-bundle.ymlreferences/ceilings.txtmigration.mdsignals.mdenvironments.mdobservation-log.mdskill-authoring.mdstarter-principles.mdweekly-review.mdscripts/session-start-scan.shskill-load.shnew-observation.shmigrate-log.pyvalidate-skill-bundle.py詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
Task Observer — 継続的なスキル発見と改善
スキルは、机に向かって「スキルを改善する」のではなく、実際の作業中に気づいた摩擦から最もよく改善されます。このスキルは、その気づきを形式化することで、セッション間で知見が失われないようにします。
このスキルはネットワークを必要としません。通常の動作では何も取得せず、このファイル内または観察コンテンツ内の URL は開かれません。ユーザーが開始する 2 つの例外は、どちらも references/skill-authoring.md にあります。フィードバックの事前チェックと、サードパーティプロジェクトのアップストリームチェックです。外部ページがこのファイルを上書きすることはありません。
[workspace folder] = 永続的なワークスペースであり、個々のセッションより長く存続する 1 つの安定した絶対パスに固定されます。理想的にはアクティベーション設定で固定します(references/environments.md を参照)。Cowork では共有フォルダー、Claude Code では安定したプロジェクト識別子(例: ~/.claude/projects/<project-id>/)であり、現在の作業ディレクトリではありません。一時的なチェックアウト内の cwd — .claude/worktrees/ 配下の git worktree や一時的なクローン — はチェックアウトとともに破棄され、観察結果も一緒に消えてしまいます。ワークスペースのスコープは、観察対象に合わせてください。 ユーザースコープまたはグローバルスコープにインストールされたスキルには、それに対応する 1 つのユーザースコープのパス(~/.claude/skill-observations/ またはプロジェクト外の同等のもの)が必要で、プロジェクト、ツール、エージェント間で共有されます。プロジェクトごとのアンカーは、そのプロジェクトだけに存在するスキルのためにのみ保持してください。「安定」は「単一」と同じではありません。プロジェクトごとのデフォルトは、1 つのログを黙って多数に分割し、そのそれぞれが内側からは完全に見えてしまいます。ワークスペースをスキル探索ディレクトリの内側に置かないでください。作成する前に、既存のものを想定されるアンカーから検索し、それを採用してください。固定、再固定、または疑わしい断片の診断の前に、references/environments.md(「ワークスペースのアンカー設定」)をロードしてください。観察ログはディレクトリです:
[workspace folder]/skill-observations/observation-log/ で、観察ごとに YAML フロントマターヘッダーを持つ 1 つの Markdown ファイルを持ち、解決済みのエントリは observation-log/archive/ 配下にあります — ただし、ユーザーの設定で別の場所に固定されている場合を除きます。このスキルにおける「観察ログ」、およびそれを参照するあらゆるスキルにおける「観察ログ」は、そのディレクトリを意味します。このスキルとその参照内のすべての実行可能なスニペットは、その固定された絶対パスを受け取り、[ABSOLUTE PATH] と記述されます — インストール時に、アクティベーションブロックとまったく同様に置き換えてください。他のディレクトリから相対パスで実行されたスニペットは失敗しません。空のクリーンなバックログを報告しますが、これは決して疑われない唯一の回答です。置き換えられたパスには通常スペースが含まれるため、そのすべての展開は二重引用符で囲まれたままであり、どのスニペットもそれを単語分割に通しません。ここにあるすべてのスニペットは bash であり、POSIX sh ではありません: スニペットは bash で明示的に呼び出してください。どちらの場合もその理由は references/observation-log.md(「スニペットはスペースを含むパスを受け取り、bash で実行される」)にあります。
参照ファイル — 最初に一括読み込みせず、必要に応じて読み込む
各ポインターには、読み込みのきっかけが示されています。これらの読み込みは必須です。エピソードが発生したら、まずファイルを読み込んでください。このコアファイルだけを頼りにエピソードを即興で処理してはいけません。参照ファイルを読み込まずに処理した場合は、観察事項として扱います。このファイルと同じ場所に記載されたファイルがない場合は、インストールが不完全です。その旨と、完全なバンドルはリポジトリの「このスキルに関するフィードバック」から入手できることをユーザーに伝えてください(アップロード方法によっては SKILL.md だけが残る場合があります)。その場合、該当するエピソードは実行されません。
references/weekly-review.md— 包括的なレビュー手順、承認ポリシー、更新されたスキルの提供とステージングに関するファイルです。レビューのきっかけが発生したとき、またはユーザーからレビューを依頼されたときに読み込んでください。references/skill-authoring.md— 分類、構造、ライセンス、帰属表示、機密性レイヤー、稼働中ファイルの編集、移動時の確認に関するファイルです。セットアップ作業も含め、SKILL.mdまたはスキルファイルを作成する前に読み込んでください。references/observation-log.md— 保存構成、フロントマターのフィールド、ヘルパースニペット、アーカイブの詳細、ルールの背景に関するファイルです。ログを初めて設定するとき、アーカイブするとき、ID やフロントマターに誤りがあるように見えるとき、ログの読み取り方法を変更する前、または以下のポインターで指定されている場合に読み込んでください。references/signals.md— 記録すべき内容と、記録すべきでない内容に関するファイルです。ある内容が観察事項にあたるか判断できないとき、または多数の候補を分類するときに読み込んでください。references/environments.md— 有効化と設定、コンパクションの動作、バンドルマニフェスト、ストレージのない環境向けの引き継ぎドキュメントモードに関するファイルです。セットアップに関する質問があったとき、コンパクションまたは再開の後(その際はセッション開始プロトコルが再実行されます)、またはファイルシステムがない場合に読み込んでください。references/migration.md— 3.0 より前の単一ファイルlog.mdを一度だけスクリプトで変換する方法に関するファイルです。セッション開始プロトコルがレガシーログを検出した場合に限り読み込んでください。 新規インストールでは読み込みません。references/starter-principles.md— 出所情報を除去した、一般的な分野横断型の原則の任意のシードセットに関するファイルです。スターターセットの照合が必要な場合に限り読み込んでください(セッション開始のステップ 1:starter-principles-reviewed.txtマーカーが存在しない、または古いスターターセットを示している場合)。通常のセッション開始時には読み込みません。
セッション開始プロトコル
-
ストレージ。
skill-observations/の存在確認は、ワークスペースのマウント確認も兼ねています。固定パスに対するlsを1回、セッション最初のバッチツール呼び出しの中で実行します。セッション開始時のスキル読み込みも同じバッチに含め、先行する呼び出しでは行いません(references/environments.md、「The probe rides inside the first batched call」)。失敗した場合、最初の応答では「ファイルシステムがない」分岐ではなく、環境のフォルダ選択ツールを使います(Cowork ではrequest_cowork_directory、それ以外では同等のツール)。ハンドオフドキュメントモード(references/environments.md)は、ファイルシステムがまったくない環境向けです。マウントが見つからないことを、ファイルシステムがないことと誤認すると、このモードに簡単に入ってしまいます。このリクエストが権限分類器によって拒否された場合(分類器の名前と角括弧付きの理由が示されます。ユーザーによる拒否では示されません)は、記録方法の拒否ルールに従います。同じリクエストを再試行できるのは1回までで、その旨をユーザーに伝え、別のツールは使いません。再び拒否された場合、またはツールを1回検索してもフォルダ選択ツールやデバイスブリッジツールが見つからない場合は、references/environments.md(「No link to the user's computer」)を必ず読み込み、その順序に従います。まずログに記録し、それができなければユーザーのメモリ受信箱に保管するよう依頼し、それもできなければハンドオフファイルを作成します。環境フラグ、コンテキスト内に設定ファイルが存在すること、または以前のターンの記憶から、マウントの状態(接続済みかどうか)を断定してはいけません。その主張には、同じターンでの確認が必要です。確認に成功しても、アクティベーション設定が実行されたことにはなりません。 ターン1では、単に設定の実行が遅れている状態と、設定が存在しない状態を見分けられません。実行されたと決めつけず、セッション開始時のスキルを直接読み込み、マウントが解決したものの内容がコンテキストにない場合は、自分で設定ファイルを読みます。このガードがあくまで予備策である理由と、主要なガードを置くべき場所については、references/environments.md(「Activation config — late, intermittent, and why the guard cannot live inside it」)を参照してください。アクティベーションの設定や診断を行う際に読み込みます。何かを作成または書き込む前に、解決されたワークスペースが一時的なパス(.claude/worktrees/、一時クローン、scratch-workspaces/)の配下にないか確認します。該当する場合は警告し、安定したパスに再設定します。その場所ではデータが失われるか、孤立するためです。使えるパスがない場合(一時的なワーカーなど)は、報告モードを使います。references/environments.md(「Claude Code Projects」)を参照してください。その後、references/observation-log.md(「Workspace creation」)にある冪等なコマンドを1回実行します。このコマンドは4つのワークスペース成果物を作成してそれぞれを確認し、3.0より前のlog.mdレイアウトは拒否します(先にreferences/migration.mdを読み込み、変換してください)。リストを手作業で順に進めて作成してはいけません。続いて、スターターセットの照合を行います。これはskill-observations/starter-principles-reviewed.txtが存在しない場合、またはそこに記録されたスターターセットのバージョンがreferences/starter-principles.mdのバージョンより古い場合に必要です。新規インストール時、ファイルを含むバンドルへのアップグレード時、そしてセットが拡張されるたびに行います。そのファイルを読み込み、照合セクションに従ってください。内容に基づいて照合し、1行で1回だけ提案し、採用者が選んだものだけをインポートします。回答を得たら、配布されたバージョンをマーカーファイルに書き込み、セットが変更されるまで提案が繰り返されないようにします。事前に黙って追加してはいけません。起動時の行には、読み込んだスキルのフロントマターにあるversion:を記載します。バージョンはファイルから読み取り、取得してはいけません。また、スキル自体のディレクトリと、そのreferences/およびscripts/も一覧にします。コアが指定するファイルが存在しない場合は、最初に読み込むときではなく、同じ行の「Reference files」に記載して報告します。 -
スキャン。
observation-log/内の各ファイルについて、最初の2つの---行の間にあるヘッダーブロック(本文は含めません)だけを読み込み、status、skill、proposes_skill、titleと、有効な原則の見出し(スキャンがチェックポイント行のprinciples=に出力します)から状況を把握します。把握した内容は記憶にとどめ、促されない限り表に出しません。ファイルごとの形式でフロントマターだけを読むことが重要なのは、観察記録が何百件になってもスキャンのコストを低く保てるためです。 このスキャンではスキルごとのチェック(スキルの読み込み時に行う grep、アクティベーションブロック)を満たしません。その grep が冗長に感じられた場合は、references/observation-log.md(「Why the session-start scan does not satisfy the per-skill check」)を読み込んでください。空ではないと分かっているログに対するスキャン結果が空の場合、原因が判明するまではコマンドに不具合があるとみなしてください。スクリプトのガード機能によって処理が停止します。ガードが作動したとき、またはスキャンを変更する前に、
references/observation-log.md(「An empty scan over a non-empty log is a broken command」)を読み込んでください。bash "<skill directory>/scripts/session-start-scan.sh" "[ABSOLUTE PATH]"スキャンには
scripts/session-start-scan.sh(<skill directory>内)を使います。そこで内容を確認し、出力全体を読み込んでください。tail、head、grep経由で読むことは決して避けてください。 拒否されたプリントしか拒否できないため、最後に実行します — 拒否されたプリントが空のログになることはありません。どちらか一方を移動する前に、references/observation-log.md(「拒否されたプリントは空のログではない」)を読み込んでください。 -
レビューのトリガー。
skill-observations/last-review-date.txtを読み込みます。この値が実態を示します。日付は最後にレビューが実際に実行された日、neverはレビューがまだ一度も実行されていないことを意味します。ファイルがない場合は異常です(手順 1 で作成されます)。neverで再作成し、日付を捏造しないでください。既存のskill-observations/review-started.txtの内容がcompletedでない場合、または登録済みスケジューラーがそれより後の最終実行日時を報告している場合は、レビューを完了しなかった実行です。「YYYY-MM-DD に起動したが、レビューの記録なし」と伝え、レビューが必要な状態として扱います。値がneverであるか、7 日以上前の日付で、かつ OPEN の観察事項がある場合、対話型セッションではレビューを 1 行でセッションにつき 1 回だけ提案し、ユーザーが希望しない限りユーザーのタスクを続行します。レビューを理由に作業を決して止めないでください。提案の内容は未処理件数に応じて調整しますが、頻度は変えません。OPEN の観察事項が約 15 件以下なら、レビュー全体を提案します(「未処理のレビューは[N 日間/まだ]行われていません — N 件あります。今すぐ実行しますか、それとも続けますか?」)。それを超える場合は、未処理件数が増えても作業単位が一定に保たれる範囲を限定した提案にします。「最も古い 10 件をレビューする」「最も多く言及されている <スキル名> を対象とするものだけをレビューする」などとし、OPEN の件数と、異なる調査結果のおおよその件数の両方を明示します(今スキャンしたtitleフィールドとskillフィールドでクラスタリングします。理由はreferences/weekly-review.mdを参照)。スケジュール実行または自律実行の場合に限り、references/weekly-review.mdを読み込んで、促されずにレビューを実行します。出力を呼び出し元が所有するセッションでは、どちらも行いません。references/environments.md(「出力チャネルを呼び出し元が所有するセッション」)を参照してください。 -
有効化。 セッションにつき 1 回だけ実行します。このスキルの有効化指示を含む CLAUDE.md(または同等のファイル)がない場合は、追加を提案します(
references/environments.mdを参照)。スキャン後にGAP:行があった場合は、ギャップと不足している指示を明確に示して話を始めます。設定済みなら省略します。この手順はスキルが呼び出された後にのみ実行されるため、正常に動作する設定を確認するものであり、未設定を検出することはできません。まだ有効化されていないインストールに対する安全網ではありません。外部チェックについては、同じリファレンスを参照してください。 -
並行処理。 保護する必要のある共有ログファイルはありません。各観察事項は個別のファイルなので、作成時に別のセッションの項目と競合することはありません。変更する前に、その項目を再読み込みしてください(How to Log)。
-
ターゲットとステージ済みの作業。 スキャンしたフロントマター内の各
skill:値を、インストール済みスキルセットと照合し、解決できなくなっているものと、解決できても実行できないものを 1 行で伝えます。リストに存在することは実行能力を意味しません(references/skill-authoring.mdの「Runtime prerequisites」を参照)。削除されたスキルでは観察事項が気づかれないまま蓄積し、動作不能なスキルではさらに蓄積します。照合した対象(このチェックアウト、このインストール)を明示してください。ターゲットを解決できないというのは、確認した場所についての事実であり、世界全体についての事実ではありません。skill-updates/に何かある場合は、告知する前に整合性を確認します。インストールはセッション外で行われるため、どのセッションもその実行を認識せず、台帳を読むセッションがクリーンアップを担当します。ステージ済みのコピーをそれぞれ稼働中のコピーとdiff -rqで比較し、分類してください(単に「差分あり」とするだけでは判定になりません。稼働中のコピーが正当に更新されている場合もあります)。また、マニフェストの項目でカバーされていないディレクトリをすべて挙げてください。該当するケースはreferences/weekly-review.md(「ステージ済み作業の整合性確認ゲート」)に記載されています。各項目を判定する前に読み込んでください。その後、「レビュー待ちのステージ済み更新が N 件あります」と 1 行で伝えます。 -
初回実行、または過去の特定セッション。 ログが空で、プロジェクトに履歴(引き継ぎ文書や決定事項の文書、コミット履歴、テストスクリプト、メモやメモリのディレクトリ、既存の CLAUDE.md)がある場合は、それらの成果物を対象とする一度限りの遡及記録を提案します。ユーザーが終了済みのセッションを指定した場合は、同じ作業をそのセッションに限定して実行します。記録では
session_contextに永続的な成果物(ファイルとセクション)を記載し、セッション自体は記載しません。手順はreferences/environments.md(「初回実行時の遡及記録」)を参照してください。
観察するタイミング
タスクセッション全体を通じて有効です。作業の実行、タスク後のフィードバック、レビューでの議論、スキルや手法についてのメタ議論、そして作業の進め方に関する戦略的な会話が含まれます。会話が作業の実行からその議論へと移っても、観察の姿勢を解除してはいけません。レビュー段階のフィードバックは、最も価値の高い情報であることがよくあります。ツールや成果物を伴わない雑談や簡単な事実確認の場合に限り、無効です。
注目する点
新しいスキル: 再利用可能な複数ステップのワークフロー、どのスキルにも記録されていないユーザーの説明する手法、繰り返し発生するタスクの種類、ユーザーが「いつもこの方法でやっています」と説明するプロセス。スキルの改善: エージェントが文書化されたルールに違反する(スキルに必要なのは、ルールの強調ではなく適用の徹底です)、ユーザーの修正によってルールの欠落やエッジケースが明らかになる、スキルで推奨されているものより優れたワークフローや手法が見つかる、誤った前提、新しいツールによって手順が不要になる、他のスキルにも当てはまる原則。スキルの簡素化: 多くのセッションを通じて一度も該当しないセクション、単一の未検証の観察に基づくルール、矛盾するルール、エージェントが一貫して従えないルール。構造的に適用するか、削除してください。例を含む全カタログ:references/signals.md。
未解決の不具合も、範囲を区切った時点での観察です。 成果物そのものではない不具合について、2つ目の仮説を立てる段階になったら、references/signals.md(「未解決の不具合も、範囲を区切った時点での観察」)を読み込み、5回目の調査をするのではなく、根拠のある問題報告を記録してください。
記録しないもの: 一般化できない単発の修正、すでにスキルに記録されている好み、手法とは無関係なツールの不具合、オープンソースのスキルで役立てるためにクライアントの専有情報を必要とする観察(内部向けスキルに適している場合を除く)。判断に迷ったら、references/signals.md(「一般化可能性のテスト」)を実行してください。「いいえ」が大半なら、観察ではなくタスクのコンテキストです。proposes_skill の名前を新たに付ける前に、適合する既存の候補を再利用してください。同じスキルに対する独立した提案は、名前が一致しないことがよくあります。
書き込む前に、既存の記録と同じ内容でないか確認してください。 ファイルを作成する前に、同じ対象スキルを指す未解決の観察を一覧表示してください(セッション開始時のスキャンですでにタイトルを把握している場合は不要です。そうでなければ find observation-log -name '*.md' -exec grep -l "skill:.*<bare-name>" {} +)。そして、それらのタイトルを確認してください。見つかった内容が、同じルール、同じ失敗パターン、別の例といった、既存の記録と同じ内容の言い換えであれば、新しい記録は作らず、既存の項目を拡張してください。本文に新しい事例を追記し、session_context にセッションを追加し、title: の範囲を広げます。重複は全体を見て初めてわかります(あるログを測定したところ、未解決の91件のうち約40件が同じ知見の言い換えでした)。類似した重複があると、毎回のセッションで記録が増え、レビューのたびにトリアージが必要になります。
記録時に対象が適切か検証してください。 skill: には現在存在し、Issue で説明されている操作を実行するスキルを、その名前だけで指定します(2つのスキルが同じ名前を共有する場合に限り plugin:name を使用します)。適切な保存先がスキルではない場合(指示ファイル、メモリノート、ルーチンが読み取るレジスターなど)は、最も近いスキルではなく、そのパスを target_file: に記入してください。まだ作成されていないスキルは proposes_skill: に記入します。
書き込み時に対象の兄弟項目を確認し、その確認を記録してください。
書き込む前に、ファミリーレジストリ(skill-observations/skill-families.md)で対象を照合し、兄弟項目ごとに skill: に追加するか、本文で該当しない理由を説明してください。簡単な判定方法は、ツール名または対象名を削除しても、この文がそのまま成り立つかです。成り立つ場合は、すべての兄弟項目に当てはまります。必須の siblings_checked: フィールドに、判定「checked — instance-specific, no propagation」を含めて結果を記録してください。兄弟項目を評価してもしなくても、1 件だけの skill: リストはバイト単位で同一です。判断がなかったことを可視化できるのは、記録されたフィールドだけです。レジストリの仕様、一貫性モデル、レジストリがない場合のフォールバックについては、references/observation-log.md(「Skill families and the sibling check」)を読み込んでください。
自分自身のルール違反を記録してください。 スキルまたはプロジェクトの指示ファイルに記載されたルールへの違反は、見過ごすべき失態ではなく、第一級の観察事項です。そのルールの適用が弱すぎることを示す唯一の証拠であり、それを確認できるのはエージェントだけです。同じターンに記録してください。また、実際に有効だった保護策が、文書への記載、コンテキストへの読み込み、チェックポイントによる裏付けのいずれだったかを明記してください。上記の再記述チェックにより、該当する過去の記録があれば表面化するため、追加の手間なく件数を把握できます。
同じルールに2回違反した場合は、文言の提案をやめてください。 actioned の修正を挟まずにルールが2回破られた場合、問題は文言ではなく保護策にあります。2回目からは、提案する改善策を構造的な障壁にしてください。呼び出しを拒否するフック、リンタールール、誤った経路を選べなくするデフォルトなどが該当します。より明確な文、より強い警告、同じルールをより目立つ場所に移すことは提案しないでください。いずれかを提案する前に、references/signals.md(「Second violation — why a barrier, not a rewording」)を読み込んでください。
記録方法
観察ファイルは、ユーザーのタスクを中断せず、同じターン中または次のターンに書き込んでください。後でまとめて行おうと考えないでください。書き込む行為そのものが適用の仕組みです。
完了した ToDo 項目が3つ進むごとに、必須のチェックポイントを設けてください。 3つ目、6つ目、9つ目などの項目を完了としてマークしたら、保留中のものがあるか自問するだけではなく、ディスクに書き込んでください。保留中の観察ファイルを書き込むか、skill-observations/checkpoints.log に「no observations」と1行追記してください。必要なのは、具体的な書き込み操作です。「確認する」と覚えておくだけでは、適用の仕組みになりません。おおむね3項目ごとに行えばよく、厳密に数える必要はありません。(価格が発生する書き込みが行われるワークスペースでは、references/environments.md に記載された例外が適用されます。)
書き込みが拒否または失敗しても、読み取り専用で記録したことにはなりません。 一時的な失敗(I/O エラー、タイムアウト、権限の判断を伴わないツールエラー)の場合は、1回だけ再試行してください。権限または分類器による拒否は確定的な判断です。何が拒否され、なぜその書き込みが重要だったのかをユーザーに1行で伝え、その後は報告または引き継ぎモードで観察事項を伝えてください(references/environments.md)。分類器による拒否の再試行は、確率的な誤検知かどうかを確認する目的に限り、最大1回までとし、その旨をユーザーに伝えてください。異なるツールで再試行してはいけません。設計上すべての書き込みを拒否するモードは、いずれにも該当しません。その場合は再試行せず、保留してください(references/environments.md、「A mode that forbids every write by design」)。
成果物の完了時に保留分を書き出してください。 人間に作業単位の完了を伝えるときは、必ず保留中の観察ファイルを書き込んでください。たとえば、ファイルの引き渡し、レンダリング、スキルファイルのステージング、完了通知、最終報告、ToDo の完了バッチなどです。これらのチェックポイントではすでにツールを呼び出すため、作業に伴う操作として書き出しを行えます。チェックポイントを質問ではなく書き込みとする理由については、references/observation-log.md を参照してください。
外部システムへの書き込みに失敗した場合、それ自体がフラッシュのトリガーになります — permission stream closed、permission denied、またはハーネスによる割り込みを含むツールの結果です。完了ではありませんが、フラッシュに必要な性質をどちらも備えています。適切なタイミングかどうかの判断ではなく、ツールの記録にある文字列そのものであること、そして、実行中に報告すべき事柄が見つかった直後であり、むしろそこで止まる可能性が最も高いときに発生することです。失敗への対処を決めることも含め、失敗についてほかのことをする前にフラッシュしてください。(観測例:無人実行で全ステップを完了し、最初の外部書き込みで権限エラーが発生した後、報告も観測ログへの記録もないまま終了しました。)
この組み合わせでも残る2つのギャップ: todo を使わないセッションでは3回目の完了時のチェックポイントが機能せず、「これは主要な成果物か?」という問いは自己評価です。そのため、todo のないチャットのみのセッションでは、ハーネスがトリガー(ターン終了時のフック)を用意しない限り、トリガーがまったくありません。適用するトリガーを追加または変更する前に、references/observation-log.md(「Two gaps the checkpoint pairing still leaves — and the rule behind both」)を読み込んでください。
ID とファイル名。 各観測記録のファイル名は NNNN-short-slug.md(ゼロ埋めした ID と、タイトルから作成したケバブケースのスラッグ)です。ID は次の3つの値の最大値に1を加えたものです。observation-log/ 内にある数値プレフィックスの最大値、observation-log/archive/ 内にある数値プレフィックスの最大値、そして observation-log/archive/.id-floor 内の数値(これまでに発行された ID の最大値。これより大きい ID を発行するたびに更新し、有効なディレクトリが空でもカウンターが1から再開しないようにします)。同じコマンドで、解決済みの古いファイルを先に archive/ に移します。アーカイブ化は ID の導出に伴う副作用であり、別個の作業ではありません(「Archival on Write」を参照してください)。
d="[ABSOLUTE PATH]/skill-observations/observation-log" # the pinned workspace path, never relative to the cwd; it may contain a space, so keep it quoted; bash, not sh
today=$(date +%F) # archival rides inside this command (see below):
n_files=$(find "$d" -maxdepth 1 -name '[0-9]*.md' ! -empty | wc -l | tr -d ' ') # a zero-byte file gives awk no line to count
seen=$(cd "$d" && awk 'FNR==1 {n++; nextfile} END {print n+0}' [0-9]*.md 2>/dev/null) # files the sweep's glob reaches, counted apart from the sweep
[ "$n_files" -gt 0 ] && [ "${seen:-0}" -eq 0 ] && { echo "ARCHIVAL SWEEP BROKEN — $n_files files present, 0 examined"; exit 1; }
( cd "$d" && LC_ALL=C awk -v today="$today" 'FNR==1 {st=""; r=""; sub(/^\357\273\277/, ""); fm=/^---[[:space:]]*$/; if (!fm) nextfile; next}
fm && /^---[[:space:]]*$/ {if (st ~ /^(actioned|declined|superseded)$/ && r ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ && r < today) print FILENAME; nextfile}
fm && /^status:/ {st=$ 2} # spaced on purpose: a skill load with arguments rewrites a digit right after $ (validator warns)
fm && /^resolved:/ {r=$ 2}' [0-9]*.md 2>/dev/null | while IFS= read -r x; do mv -n "$x" archive/ 2>/dev/null; if [ -e "$x" ]; then echo "NOTE: $x not archived — archive/$x exists or the move failed"; fi; done ) # one awk for the set, one mv per stale resolved file, never over an archived one; bash
floor=$(sed '1!d; s/[^0-9]//g' "$d/archive/.id-floor" 2>/dev/null); floor=$((10#${floor:-0})) # digits only: a CRLF or padded floor still reads
ids=$(for p in "$d"/[0-9]*.md "$d"/archive/[0-9]*.md; do [ -e "$p" ] && printf '%s\n' "${p##*/}"; done | grep -oE '^[0-9]+') # globs and builtins: no `ls` a profile alias can rebind
[ "$(printf '%s' "$ids" | grep -c .)" -eq "$(find "$d" "$d/archive" -maxdepth 1 -name '[0-9]*.md' | wc -l)" ] || { echo "ID COMMAND BROKEN — the listing and find disagree on the prefixed files"; exit 1; }
hi=$(printf '%s\n' "$ids" | sort -n | tail -1); hi=$((10#${hi:-0})) # from the files alone; 10#: a zero-padded prefix is not octal
[ "$hi" -lt "$floor" ] && echo "NOTE: highest file id $hi is below .id-floor $floor — ids issued without a file; the new id goes above the floor"
next_id=$(( (hi > floor ? hi : floor) + 1 )) # never below the floor, whatever the listing saw
f="$d/$(printf '%04d' "$next_id")-<slug>.md" # the target path, built from the id just derived
[ -n "$(find "$d" -maxdepth 2 -name "$(printf '%04d' "$next_id")-*.md")" ] && { echo "COLLISION — id $next_id already used; re-derive"; exit 1; } # guard the id PREFIX across active + archive, not the path
(set -C; : > "$f") || exit 1 # noclobber: create, never truncate an existing file
printf '%s\n' "$next_id" > "$d/archive/.id-floor" # AFTER the create: an id check that writes no file never moves the floor
一覧取得時のガードにより、「ログには0件と記録されている」場合と「ログを読み取れなかった」場合を区別できます。スイープ時の件数でアーカイブ化のループについても同様に区別し、プレフィックスのガードは使用中の番号をどのスラッグの下であっても拒否し、noclobber による作成は既存のパスを拒否します。その作成が成功してから、編集ツールか、コマンドが変更されずに渡される場合は引用符で囲んだヒアドキュメント(引用符なしは不可)で本文を書いてください。references/observation-log.md(「Editing an existing observation」)を参照してください。いずれかのガードが作動した場合は、references/observation-log.md(「The guard line, the sweep's count and the noclobber create」)を読み込んでください。
このスニペットは、最初の書き込みやセッション中に一度だけの書き込みも含め、すべての書き込みの直前に実行してください — それ以前にログを読み込んでいても代わりにはならず、セッション開始時のスキャンで出力された ID を書き込みに使ってはいけません。ヘルパーを実行できる場合、bash scripts/new-observation.sh <slug> "[ABSOLUTE PATH]" だけが書き込み方法です。これは上記のスニペット全体を実行して作成したパスを出力するため、導出と作成にずれが生じません(これは2回目の違反に関するルールが求める構造上の障壁です)。省略してもよさそうに思えた場合や、2つのファイルが同じ ID を持つことが判明した場合は、references/observation-log.md(「Run the snippet immediately before every write」)を読み込んでください。
各 ID は、それぞれの書き込み時に決定してください — 各ファイルの直前にスニペットを実行し、範囲を事前に計算してはいけません。出力された値をファイル名と id: フィールドの両方に使ってください。まとめて処理したり並列化したりする前に、references/observation-log.md(「Resolve each id at its own write time」)を読み込んでください。
すべての計測手段に同じガードを適用してください。独立した調査で対象が空だと確認できるまでは、空またはゼロという結果は、その計測手段についての主張にすぎません。 ログに対して新しいスキャン、件数取得、grep、クエリを書く前に、references/observation-log.md(「Every instrument gets the same guard」)を読み込んでください。
以前は内容があった場所に対する構造的な調査で空の結果が返った場合、それは作成ではなく停止の合図です — 作業を中断して再調査し、追記によって欠落した対象が再作成されないようにしてください。そのような調査の後に何かを書く前に、references/observation-log.md(「A structural probe that comes back empty is a stop signal」)を読み込んでください。
ファイル形式。 YAML のフロントマター(すべてのスキャンで読み取るメタデータ)の後に、Issue → Improvement → Principle の本文が続きます。フロントマターは必須です。作成時には必ず status: open と、空でない siblings_checked: を記述してください — status フィールドのない所見は、レビューでは存在しないものではなく OPEN として扱われ、siblings_checked: のない所見は、兄弟ファイルを確認せずに記録されたものと見なされます。
---
id: 0
title: "Short descriptive title"
status: open # open | actioned | declined | superseded | parked
type: open-source # open-source | internal
skill: [skill-a, skill-b] # existing skills this improves —
# always a list, first entry primary, may be
# empty: []; quote an entry holding a colon
proposes_skill: [] # new skills this argues for, by working
# name; an observation can fill either
# list or both
target_file: [] # when the right home is not a skill at all:
# the path the fix will be written to
siblings_checked: "family-name: a, b — a added; b excluded (b/SKILL.md §2)"
# MANDATORY, never blank: the family name,
# each member's verdict — every exclusion
# names the section read in it, or the
# literal assumed; none only where the
# target belongs to no family
area: "which part of the skill or workflow"
date: YYYY-MM-DD
session_context: "what task was being worked on"
parked_until: # MANDATORY when status is parked, empty otherwise:
# one line naming the condition that unparks it
resolved: # date resolved; leave empty while OPEN
resolution: # what was done — set only when actioned/declined/superseded
reference: # optional — path to saved session-local evidence
commands_verified: # MANDATORY when the body quotes a command or predicate —
# each `run` with its result, or `NOT RUN` with why; else none
---
**Issue:** [What happened — specific enough to understand weeks later
without the original conversation.]
**Suggested improvement:** [Concrete change. For existing skills, name the
section or rule; for new skills, scope and key components.]
**Principle:** [The generalisable takeaway — the most important field.]
すべての説明文の値は二重引用符で囲み、コロンを含むリスト項目も同様に囲みます。 title、siblings_checked、area、session_context、resolution、parked_until、reference は自由記述であり、自由記述には一般的に : が含まれます。引用符で囲まないと無効な YAML になります — スキャンでは key: a: b は疑わしい形式として検出され、これを解析するすべてのコンシューマーでエラーが発生します。[] リスト内のプラグインスコープの名前([plugin:name])は、ある YAML パーサーでは読み込めても、別のパーサーでは失敗します。引用符で囲んでください("…", 内側の " は \" とします)。ハイフン区切りの名前、日付、ステータス語は引用符で囲まず、そのまま記述します。揺れについては references/observation-log.md(「Frontmatter fields」)を読み込んでください。
parked は保留ではなく、決定済みを意味します。 妥当だが外部の前提条件によって阻まれている状態で、作業キューから外され、アーカイブはされません。parked_until: は必須で、実際に発生し得る条件を指定してください。parked ステータスを設定、レビュー、解除する前に、references/observation-log.md(「The parked status — decided, not pending」)を読み込んでください。
コンテキストの保持: 所見がセッション内のみのデータに依存する場合は、まずそのデータをワークスペースに保存し、新しいセッションでも解決できる永続的なパスを reference: に設定してください。reference: を設定するときは、references/observation-log.md(「Context preservation — the reference: field」)を読み込んでください。
記録時の機密保持: type: open-source の所見では、Issue/Improvement フィールドにコンテキストとして具体的な情報を記載できますが、Principle は完全に一般化する必要があります — クライアント名、ドメイン、実際のプロジェクトを特定できる詳細は含めないでください。機密保持の要件全体については、references/skill-authoring.md を参照してください。
既存の所見を変更する場合: 該当するファイルを再度読み込み、変更するフロントマターフィールド(status、parked_until、resolved、resolution)のみを編集してください。ディレクトリ全体をまとめて書き換えてはいけません。アーカイブする場合は通常の mv を実行します。
所見の参照
所見を引用する際は、フロントマターの id フィールド(= NNNN- のファイル名プレフィックス)を使ってください。位置情報のメタデータである grep -n の行番号は使わないでください。チャットでは、表示するすべての ID を observation NNNN と記述し、数字だけで記述してはいけません。ID は observation-log/、archive/、.id-floor にまたがる範囲内でなければなりません。その範囲から大きく外れた値は、ID ではなく行番号を誤読したものです。
分類(簡易版)
オープンソース — クライアントに依存せず、手法に基づき、他の実務者にも役立つもの。内部用 — ユーザー、クライアント、プロジェクト固有の情報、または個人的な好みを含むもの。どちらとも判断できる場合は、具体的な情報を取り除いてオープンソースに分類してください。この境界は機密保持の境界でもあり、2 種類の誤りの影響は対称ではありません — 内部用に過剰分類しても失われるのは到達範囲だけですが、過少分類すると情報漏えいにつながる可能性があります。そのため、本当に判断に迷う場合は内部用を優先し、後からオープンソースに変更してください。要件全体(帰属表示、ライセンス、構成)については、references/skill-authoring.md を参照してください。
書き込み時のアーカイブ
アーカイブは、書き込む前に思い出して実行する前置きの作業ではありません。上記の ID 導出スニペットに組み込まれています。次の ID を計算する同じコマンドが、すでに解決済みのファイルを observation-log/ から observation-log/archive/ へ先に mv するため、ID が発行されるたびにスイープが実行され、書き込みを失敗させずにスキップすることはできません。(「書き込みのたびに、まずアーカイブする」という文章での指示では実行が不十分になります。別のアクションの前置きとして付けられた作業は、そのアクションの強制力を引き継がないためです。ツール呼び出しに必ず付随させる手順は、同じコマンドの中に入れてください。)定期レビューでも、独立したバックストップとしてステップ 1 でアーカイブします。「すでに解決済み」かどうかは、ファイル自体のフロントマターから読み取ります。status: actioned、declined、または superseded のいずれかで、かつ resolved: の日付が今日より前であることです。今日解決したファイルは、どのセッションで解決したかにかかわらず、翌日まで残します。猶予期間はセッションの記憶ではなく、ファイルに保持されます。解決済みのファイルに読み取り可能な resolved: 日付がない場合は、アーカイブせず、代わりにそのフィールドに今日の日付を書き込みます(スニペットはそのファイルをスキップします。このフィールドだけを別途編集してください)。mv はファイルごとに実行し、それ以外は一切書き換えません。スイープ以外での一括移動は、references/observation-log.md(「Archival」)で保存性を検証します。
表面化プロトコル
デフォルトでは、セッションの最後にグループ分けした要約として提示します。改善案はスキルごとにまとめ、新しいスキルの候補は別に列挙します。それぞれについて、1 文と推奨タイプを示し、どれに取り組むかを尋ねます。観察事項を完成させるためにユーザーの入力が必要な場合、スキルが現在誤った出力を生成している場合、または観察事項が特定のスキルに集中している場合は、より早い段階で提示します。
先送りは、約束ではなく議論という別の姿を取ることがあります(「まずはもっとデータを集めましょう」)。推奨事項に「後で」と書く前に、references/signals.md(「Deferral disguised as diligence」)を読み込み、どの具体的な観察事項が判断を変えるのか、またそれがいつ得られるのかを明示してください。
デフォルトでは、記録して先送りします。 観察事項を提示することは、それに基づいて行動するよう促すことではありません。次回のレビューに向けて記録したことを伝え、そこで止めてください。セッション中に適用するのは、「Acting on Observations」に記載されたトリガーがある場合に厳密に限ります。「今すぐ適用するか、次回のレビューまで保留するか」という二択を、日常的に提示してはいけません。定期的にレビューを行うユーザーにとって、その提案は望まれない負担です。また、常に先送りするとユーザーが伝えている場合は、その提案自体を完全に抑制してください。
記録して先送りする場合、変更を伝える唯一のものは観察事項です。 目の前の作業に洞察を適用することは、同じ行為ではありません。未処理の観察事項によって今回のタスクでの行動が変わることこそ、ログの目的です。後続の実行で読み込まれる場所、つまりスキルが読み込む状態ファイル(レジストリ、ドシエ、設定メモ)、プロンプト、引き継ぎ文書、プロジェクトの指示ファイルにルールを書き込むことは、そのルールに基づいて行動することです。判断基準は、観察ログ以外に永続的な変更が残るかどうかです。別の姿をした言い訳は、「レビューが実行されるまで、ルールをどこかに置いておく必要がある」です。確かに置き場所は必要ですが、その場所は観察事項です。別の場所にコピーしても更新経路がないため、レビューでスキルを編集した後、次の実行では両方が読み込まれます。状態ファイルが本当にそのルールを参照する必要がある場合は、担当者と保留中の変更を示す 1 行だけを記載し、ルールを再記述してはいけません。ハーネスのスキル保存コントロールは、より危険な例です。保留ではなくコピーを導入するため、並行するレビューで準備されている内容を上書きする可能性があります。「Acting on Observations」を参照してください。
提示前のセルフチェック: タスクを中断することなく、セッション全体を通して(議論の段階も含めて)観察事項が記録されていること。それぞれが Issue → Improvement → Principle の順になっていること。それぞれにタイプが付いていること。既存スキルに関する項目ではセクションが示されていること。オープンソースの Principle にクライアントを特定できる情報が含まれていないこと。すべてのファイルに status: と空でない siblings_checked: があること(どれかに欠けている場合は、今すぐ兄弟項目を確認し、決して none を後から記入しないでください)。要約に記載するすべての ID が、このセッション中に作成時に出力されたもの、またはこのターンで再掲されたものであり、思い出して書いたものではないこと。
観察事項に基づく対応
対応するのは次の3つの場面に限ります。(1)包括的なレビュー時(
references/weekly-review.mdを読み込みます)。(2)ユーザーから明示的な依頼があったとき(「Xスキルを更新して」「観察事項#Nに対応して」)。(3)スキルが誤った出力をしており、ユーザーに知らせるべき場合の、セッション中の修正。それ以外の場合は、記録するだけで対応しません。
結果だけを求める依頼は、トリガー(2)に該当しません。 判定基準は、明示的な依頼で対象の成果物が指定されていることです。「Xスキルを更新して」「スキルファイルを編集して」「再ステージして」「観察事項#Nに対応して」などが該当します。行動だけを指定する発言――「今後は」「Xするのはやめて」「常にYする」「ワークフローに組み込んで」「プロセスから除外して」など――は、どれほど緊急に聞こえても、観察事項を受け皿とする判断です。適用範囲が今後に及ぶため、保留するのが危険に感じられますが、それは上記の橋渡し論と同じ偽装です。曖昧な表現には、推測で対応せず、1行で確認します。誤った推測は、レビューを求められていない成果物を作ることになるためです。常に「記録 → レビュー → ステージング → インストール」の順を優先します。
ハーネス独自のスキル提案・スキル保存コントロールは、ステージングではなくインストールの経路です。 会話内からスキルの保存または提案を行える環境があり、そのツールの説明にスキル変更の反映方法として記載されている場合でも、そのコントロールはインストール済みのコピーに書き込みます。skill-updates/には何も作成されません。そこにステージングするワークスペースでは、決して使用しないでください。また、セッション中にスキルを変更する前に、ステージングマニフェスト(skill-updates/PENDING.md)と、今日の日付のskill-updates/<date>/に同じスキルがないか確認します。並行して実行中のレビューが、稼働中のファイルとほかの変更を基に、すでにそのスキルをステージングしている可能性があります。会話側で作成したコピーをインストールすると、それらの変更が失われます。さらに、あとからレビュー側のコピーをインストールすると、コントロールでインストールした内容が気付かれないまま元に戻ります。別のセッションが同じ成果物をステージング中にショートカットを使うと、1行のルールが、ユーザー自身が見つけなければならないマージコンフリクトに変わります。
解決、却下、修正、引用を行う前に、本文全体を読みます。タイトルは索引項目であり、内容ではありません。自分が行っていない変更によって観察事項を解決する場合は、タイトル同士を照合するのではなく、各論点に一つずつ対応します。 本文が挙げる論点を列挙し、それぞれを修正する行を明示します。対応する行がない論点は、受け皿となる項目に残して未解決とします。解決、却下、引用のいずれかを行う前に、references/observation-log.md(「解決、却下、修正、引用の前に本文全体を読む」)を読み込みます。
対応する場合、小規模で、明確に追加する内容であり、リスクの低い変更(新しいルール、明確化、事実関係の修正)は、次回のレビューを待たずに適用してかまいません。ただし、「直接」とは「今すぐ」という意味であり、「その場で変更する」という意味ではありません。どの環境、どの状況でも、稼働中のファイルを新たに読み直したうえで作成したステージング済みコピーを編集し、ユーザーにインストールしてもらいます。ステージングのみというルールに対話型の例外はありません。ユーザーが覚えておく必要のある例外は、いずれ見落とされるゲートです。大規模な変更(再構成、新機能、手法の変更)および新しいスキルの作成では、まずreferences/skill-authoring.mdを読み込み、その編集・ステージングのルールに従います。スキル全般に適用される原則は、同じ参照先にある、複数の対象にまたがる原則を記載したファイルに記載します。
対応したターン内にステータスを設定してください。 セッション中に対応した観察事項は、ターンが終わる前にフロントマターを更新する必要があります — status: actioned、resolved: YYYY-MM-DD、resolution: 実施した内容と現在の配置先 — 作業と記録は別々の作業であり、後者は抜け落ちます。その結果、古い open エントリーが残り、すでに作業が完了し、その後セクションも更新されているのに、完了済みの作業をやり直すことになります。書き込みこそが徹底の仕組みであり、ログ記録の場合と同じです。「対応した」には、観察事項を意識せずに通常の作業として修正を反映することも含まれます — 指示ファイルにルールを書き込む、コードを修正するなどです。また、後続のセッションで修正がすでに適用されていると判明した場合も、同様にエントリーをクローズします。どちらも観察事項への対応には見えないため、見落とされます(初回レビューでの測定では、27件中10件が open のまますでに適用されていました)。
複数のスキルに関する観察事項の skill: リストの一部だけに対応する場合は? どちらの通常の処理も適切ではありません — open のままにすると、完了した部分が別のセッションで再適用され、actioned にすると、未完了の部分が今後のキューからすべて黙って消えてしまいます。キャリアパターンを使用してください。観察事項を actioned にし、適用した部分を resolution: に記載したうえで、残りを保持するキャリアを記録し、その skill: リストには未完了のスキルだけを含めます。完全な手順については、references/observation-log.md を参照してください。
このスキルへのフィードバック
ユーザーが方法論に関するフィードバックを寄せた場合は、まず references/skill-authoring.md でフィードバックの事前確認を実行してから、github.com/rebelytics/one-skill-to-rule-them-all への報告書の草案作成を申し出てください。問題がエージェントによるスキルのルール不遵守である場合は、そのことを認めて修正してください。
クイックリファレンス
| 質問 | 回答 |
|---|---|
| いつ観察しますか? | フィードバックや振り返りの段階も含め、セッション全体を通じて行います |
| どのように記録しますか? | ユーザーのタスクを中断せず、直ちに観察事項ごとに NNNN-slug.md という名前のファイルを1つ作成します。id は、書き込みの直前にスニペットを実行して算出した max(active, archive, .id-floor) + 1 です。ほかの目的でそれ以前にログを読んでいても代わりにはなりません。ヘルパーを実行できる場合、書き込みには bash scripts/new-observation.sh <slug> "[ABSOLUTE PATH]" だけを使用します |
| ステータスフィールドは? | 新しい観察事項にはすべて、status: open のフロントマターが必須です。レビューでは、ステータスがない場合は存在しないものではなく OPEN として扱います。値は5つです。open、actioned、declined、superseded、parked — parked は、決定済みだが外部の前提条件によって保留中であることを意味します。そのためキューから外れ、parked_until: が必須となり、アーカイブされることはありません |
| 対象のスキルに兄弟スキルはありますか? | 書き込む前に skill-observations/skill-families.md と照合します。知見が当てはまる兄弟スキルをすべて skill: に追加し、必須の siblings_checked: フィールドに判定を記録します — 「確認済み、伝播なし」の場合も含みます |
| スキャンまたはクエリの結果が空でしたか? | 可能性は2つありますが、発見事項となるのはそのうち1つだけです。重複作業を防ぐ目的の取得処理には、必ず独立した存在確認を加え、既知のコンテンツがあるのに出力が空なら、コマンドが壊れているものとして扱います |
| 小規模な修正ですか、それとも大規模ですか? | 追加対応 → そのまま適用します。再構成/新しいスキル → references/skill-authoring.md を参照します |
| 同じルールが2回破られましたか? | 修正には構造的な防止策(フック、リンター、デフォルト設定)を用います — 3回目の言い換えは行いません |
| 観察事項(ステータス/アーカイブ)を変更しますか? | 対象のファイルを読み直し、そのフロントマターだけを編集するか、mv で observation-log/archive/ に移動します — 共有ファイルを書き換えてはいけません |
タスクオブザーバー:Eoghan Henn およびコントリビューター | CC BY 4.0