sign-off-axi について
sign-off-axiは、ユーザーの入力やレビューが必要なエージェント向けのローカル意思決定ボード兼CLIです。質問、証拠、レポート、作業チケットを画面に表示し、ユーザーの回答をイベントとしてエージェントに返します。
主な機能
- 01ワンクリック回答の収集
- 02質問と返信の追跡
- 03証拠とデザインのレビュー
- 04チケットによる作業整理
- 05待機イベントで回答を返却
活用シーン
- 01計画についてユーザーの判断を得る
- 02デザインのレビューを依頼
- 03確認用の証拠を提示
- 04プロジェクトの作業と返信を追跡
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ umeranjum17/ sign-off --skill sign-off-axiインストール後、Claude Code で/sign-off-axiを入力して読み込まれたか確認します。
詳細
sign-off-axi
sign-off-axi は質問を 1 つのローカルページ(127.0.0.1)にまとめ、ユーザーがそれぞれワンクリックで回答できるようにし、後から読み返せるように回答を保存します。
各質問は 1 つの項目です。投稿し、回答を待ち、回答を読み返します。
ボードには 5 つの場所があります。Today(ユーザーの対応が必要なこと、今日確認できたこと、およびあなたの返信)、Decide(回答待ちのすべての質問と、レビューが必要なデザイン。スマートフォンでは「Show more」を選ぶと、件数を変えずに次の行が表示されます)、Evidence(証拠。質問は含みません)、Reports(説明)、Tickets(エピック、チケット、タスクとしての作業)です。
各カードを開くと、それぞれ専用の画面が表示されます。画面には 1 つのアクションバー(回答、またはレポートへの「Agree」「Disagree」「Comment」「Ask」)、1 つの Activity(投稿者、各回答、メモ、コメントと返信、およびそれぞれの進捗状況)、そして開いた元のリスト内を移動するための「Previous」と「Next」があります。ボード自体のバージョンは --version、サイドバーの下部、Today の「More」で確認できます。また、HTTPS または localhost ではアプリとしてインストールできます。「More」を選び、次に「Install app」を選んでください。
ボードファイルを指定しない場合、コマンドはプロジェクト内で npx -y sign-off-axi init が設定した最も近い .sign-off/ ボードを使用します(リポジトリのルートまで検索します)。それがなければ ~/.sign-off/decisions.json を使用します。別のボードを使う場合に限り、コマンドの後にボードファイル名を指定してください。テストや一時的な実行がユーザー自身のボードにアクセスすることがあってはなりません。SIGN_OFF_HOME に一時フォルダーを設定してください。
使い捨てのサーバーを open <board> またはフォアグラウンドの serve <board> で起動した場合は、終了前に npx -y sign-off-axi stop <board> で停止してください(同じボードファイルを指定します)。表示された PID をシェルから強制終了したり、タイムアウトまでサーバーを動作させたままにしたりしないでください。stop は記録されたサーバーがそのボードを提供していることを確認し、他のボードには影響しないようにします。
最新のガイダンスは CLI で確認できます
このファイルに記載されたコマンド、フラグ、出力は信用しないでください。インストール済みのコピーは古くなっている場合があります。最新の情報は CLI で確認してください。
npx -y sign-off-axi --helpでコマンド、ボード、使用例を確認できます。npx -y sign-off-axi <command> --helpで特定のコマンドのフラグを確認できます。
sign-off-axi をグローバルにインストールする必要はありません。npx -y sign-off-axi で実行してください。
sign-off-axi の出力に sign-off-axi で始まる後続コマンドが表示された場合は、代わりに npx -y sign-off-axi ... として実行してください。
通常の sign-off コマンドはモデルを呼び出しません。オプトイン方式のスタンドアロン所有者ディスパッチャーは、登録済みのインストール済み Claude Code セッションを通常の認証情報と、任意で登録されたモデルを使って再開します。
回答をイベントとして受け取る
回答はあなたに届くため、誰かが代わりに気づく必要はありません。
- 自分用の filer id を1つ選びます。エージェントのセッション ID、または任意の短い名前(
A-Z a-z 0-9 . _ -の文字を1〜128個)を指定します。指定しない場合、投稿時に Claude Code のセッション ID があれば保存されます。カードのアクティビティでは、短い名前は投稿者と回答を受け取った人として表示され、セッション ID のみの場合は Agent と表示されます。 - すべての項目を
--filer <id>を指定して投稿するか、すべてのコマンドで一度SIGN_OFF_FILER=<id>をエクスポートします。 - 質問、プラン、またはガイド付きレポートを投稿した直後に(エビデンスの投稿は待機しません)、
npx -y sign-off-axi wait --filer <id>を実行します(投稿時と同じボードファイルを使います)。まだ受け取っていない項目への回答をすべて返します。待機を開始する前に届いた回答も対象です。その後、ボード上の該当カードに 既読 と表示されます。また、ガイド付きプランまたはレポートへの さらに掘り下げる 操作も返されます(回答方法は、以下のレポートのセクションを参照してください)。返信のたびに、またプランが差し戻された後にも再度実行します。ガイド付きページは、回答が必要なものがないときも待機を続けます。相手が後から回答を変更することもあります。その場合は、replaces(置き換えられる回答。すでにそれに基づいて行動している可能性があります)が付いた新しい回答として届くため、以前の回答に代えて新しい回答に基づいて行動してください。TIMEOUTの場合は再度実行します。NOT_FOUNDは、待機中の項目も「さらに掘り下げる」をサポートする項目もないことを意味します。ファイラーに紐付いた待機だけが「さらに掘り下げる」を受け取ります。ボード全体を対象にした回答待機では、キューに残ったままになります。これにはリスナーが実行中である必要があります。休止中のエージェントセッションは起動しません。 - 回答、メモ、デザイン変更のメモ、新しいラウンド、またはコメントに基づいて行動したら、相手に知らせます。
npx -y sign-off-axi feedback <key> --reply "<実施した内容を1〜2行で>" --link <プルリクエストまたは新しいバージョン>を実行します(または、文言なしで--acted --link <url>を指定します)。カード上で相手が送ったもの(回答、メモ、新しいラウンド、コメント)にはすべて、送信済み、配信済み(あなたの待機またはon_answerフックが受信)、既読、返信済み の履歴が表示され、あなたの返信とリンクも記録されます。返信は相手の「今日」に表示されます。読んだものの、まだ行動していない場合はfeedback <key> --readを実行します。引き継いだだけの場合は--deliveredを指定します。--at <epoch seconds>を指定すると、過去に発生したステップ(再生)を記録できます。カードにすでに表示されているステップはそのまま残るため、安全に2回実行できます。カードを再投稿すると、相手が送った内容は対応済みとしてマークされます。 - Claude Code セッションがアイドル状態の間に単独で「さらに掘り下げる」を使うには、作成時にセッションの実際の UUID を登録します。
npx -y sign-off-axi owner <board> --filer <id> --host claude --session <actual UUID> --cwd <absolute project folder>を実行します(--model <model id>は任意です)。ホストから提供されたセッション ID を使い、ID をでっち上げたり、別のセッションを登録したりしないでください。ホストから UUID が提供されていない場合は、登録できないと伝えてください。別のローカルプロセスでnpx -y sign-off-axi owner <board> --dispatch --timeout 3600を実行します。プロセスが終了したら再起動してください。そのオーナーのリクエストをwaitで同時に受け取らないでください。サポート対象は Claude Code のみで、Firstmate は不要です。起動したら、リクエストと元のドキュメントを確認し、owner <board> --ack <id>で正確な ID を確認したうえで、deeper <board> --id <id> --text "<answer>"を--moreなしで一度だけ実行して最終回答を送ります。再試行してもリクエストは保持され、完了した回答に追記されることはありません。owner <board>では、配信済みやオーナー既読とは別に、キューに残った失敗が表示されます。代わりの回答を送らないでください。すでに稼働中のリスナーでは、引き続きストリーミング形式の回答を利用できます。 - ブロックできない場合、ボードの所有者はボードと同じ場所にある
config.yamlにon_answer: <command>を設定できます。このコマンドは、回答を JSON として標準入力から受け取り、各回答について実行されます。シェルは介さないため、|や>は機能しません。代わりにスクリプトを指定してください。実行可能かどうかはnpx -y sign-off-axi doctorで確認できます。
各カードは、スマートフォンで10秒で読める内容にします
ユーザーはスマートフォンでボードを見ることがよくあります。コードを書かない人が10秒で理解できる内容にしてください。
- タイトル:結果または質問を、短い一文で示します。「パスキーでサインインできるようになりました」「今週、新しいサインイン機能をリリースしますか?」のようにします。ツール名、実行 ID、バージョン表記、ファイルパス、エラーコードは使いません。
--about:ユーザーにとって何が変わったのかを、短い1〜2文で説明します。ASD-STE100 Simplified Technical English で記述してください。短い文を使い、能動態にし、一般的な語を選びます。- カードに証拠を表示します。スクリーンショットまたは録画(
--media)を添えて、確認する結果を--type evidenceとして投稿してください。ユーザーは「合格」「不合格」「要修正」から選びます。証拠の行には、最初のキャプチャと確認結果(Passed、Failed、Not run)がタイトルの横に表示されます。タップすると行がその場で開き、すべてのキャプチャがスワイプできる帯状の表示に並びます。主張の証拠となるキャプチャを最初に置き、タイトルには結果を書きます。言葉よりも図のほうが伝わる場合は、図またはインタラクティブページを追加してください(下記参照)。 - カードからダウンロードできるファイルをユーザーに提供します。たとえば、インストール用の Android ビルドなどです。
--attach <file>を追加してください(最大5ファイル、種類は問いません。既定では各ファイル1 GBまで。上限はSIGN_OFF_ATTACH_MAX_MBで変更できます)。ユーザーはスマートフォンまたはタブレットで、カードの「ダウンロード」をタップします。ファイルはボードの横にコピーされ、ストリーミングされます。メモリには読み込まれません。カードには--mediaのキャプチャ、またはファイルだけが必要です。 - 1枚のカードにつき、質問は1つにし、推奨する回答も示します(下記の質問の基準を参照)。
- プルリクエストまたはページを
--linkに設定します。runを含む契約証拠メッセージでは、outcomeの行がカードの先頭に表示されます。ユーザーが確認できる結果として記述してください。
各カードをチケットにリンクします
作業がチケットに紐づいていて、その ID がわかる場合は、そのチケットの raise と post のすべてで --ticket <id> を指定してください(--type や --kind の値は問いません。また、メッセージや --from の項目に "ticket" が含まれる場合も同様です)。カードにはチケットの行が表示されます。チケットのタイトルと進捗も表示され、その行を開くと、チケットに紐づくすべてのカードを含めてチケットを開きます。
- これは任意で、参照情報にすぎません。チケットがわからない場合は省略し、IDを決して作らないでください。チケットがボードにない場合、カードには行が表示されず、従来どおり機能します。
- チケットは単独で管理できます。
npx -y sign-off-axi ticket --id <id> --title "<the work>" --progress <0-100>で作成し、作業の進行に合わせて再度--progressを設定します。チケットはエピック > チケット > タスクの階層になります。--parent <id>で別の項目の下に配置できます。また、配下に項目があるチケットは、それらの平均進捗として進捗が計算されるため、配下に何もない項目の進捗を変更します。わかる場合は--priority P0-P3と--project <name>を追加します。作業が待機中なら--hold yes、再開したら--hold noを指定します。ユーザーが作業を依頼した場合は--asked yesを指定します。リリース先には--release <label>を指定します。表示先の状態を設定するには--state queued|"in progress"|"on hold"|doneを指定します(進捗と保留の設定より優先されます)。プルリクエストには--pr <url>を指定します(繰り返し指定するか、カンマ区切りで指定してください)。チケットのページには、リリース、状態、リンクされた各プルリクエストが表示されます。--prを指定すると一覧が置き換わるため、すべて指定してください。値を空にすると、その項目がクリアされます。自分のチケットだけを記述してください。ticket --id <id>でチケットとそのカードを表示し、ticketですべてのチケットを一覧表示します。
カードの緊急度を示し、プロジェクトにアイコンを設定します
- カードの緊急度がわかる場合は、
raiseとpostで--priority P0(最も緊急)からP3(最も緊急度が低い)を指定してください(--typeや--kindの値は問いません。また、メッセージや--fromの項目に"priority"が含まれる場合も同様です)。カードにはチップとして表示され、ボードを緊急度順に並べ替えられます。わからない場合は省略してください。優先度が設定されていないカードにはチップが表示されません。 - プロジェクト専用のアイコンがある場合は、画像をボードのフォルダーに置き、
npx -y sign-off-axi project --name <project> --icon <path from the board's folder>を一度実行してください(.png、.jpg、.webp、.svg のいずれかで、スクリプトを含まず、500 KB 以下)。名前には、カードで使っているプロジェクト名を指定します。アイコンのないプロジェクトには頭文字が表示されます。アイコンを描いたり、勝手に作ったりしないでください。
良い質問をする
これらのルールに違反する質問は sign-off に拒否され、該当するフィールドと修正方法が示されます。現在のフラグは raise --help で確認できます。
- 新しい Decide の質問には
--ask-ref <captain-message-id-or-hold-id>(メッセージまたはフィード内のask_ref)が必要です。これは、この回答を必要としている captain のメッセージまたは実際の hold を指定します。作り上げた参照ではなく、実際の ID を使ってください。CLI が確認するのは形式であり、別のツールでの存在ではありません。フォローアップはボードではなくバックログに登録してください。プラン、レポート、エビデンス、エンゲージメント記録、投稿済みのカードは、引き続き利用できます。 - 1つの決定につきカードは1枚です。投稿する前に
npx -y sign-off-axi list --fullを実行し、未解決のカードを確認してください。同じ決定がすでにある場合は、再度質問しないでください。そのカードの回答を待つか、より適切な質問にするために--merge <its key>を指定してカードを1枚投稿してください。古いカードは、新しいカードのすべての選択肢を提示している必要があり、回答後は非表示になってクローズされます。1つの決定に対してカードを2枚投稿してはいけません。同じ質問を繰り返す投稿(回答が同じ、またはタイトルの単語が80%以上共通するもの)は投稿されず、どのカードの回答を待つべきかが拒否理由に示されます。1枚のカードに回答があると、同じ決定に関するすべての未解決の質問にも、その回答が適用されます。カードには、質問が回答されるまで1つの質問が紐づきます。統合されたカード自体が何かを統合することはなく、回答済みまたは却下済みのカードは統合されません。 - タイトル:ボタンで回答できる、12語以内の簡潔な質問を1つにし、「?」で終えてください。「Say yes or no:」、「Captain hold:」、「Captain:」のような接頭辞や、タスク名、IDは含めないでください。
--why:何についての質問か、なぜ今回答が必要なのかを、1~2行で簡潔に説明してください。- ボタンは、テキスト内の選択肢と一致させてください。はい/いいえの質問には Yes と No を使います。選択式の場合は、選択肢ごとに
--optionを1つ指定し、それぞれのラベルはその文字(A、B、C)で始めてください。テキスト内に A/B/C を記載しながら Yes/No ボタンを使うことはできません。また、質問に Done や Not now のボタンを使うこともできません。 --outcome <value>=<text>:各選択肢について、その回答を選んだ場合に次に何が起きるかを1行ずつ指定します。すべての選択肢に指定してください。--recommendで推奨する回答を指定し、--recommend-reasonに理由を1行で記載してください。--default:ユーザーが応答しなかった場合にどうするかを指定し、いつ適用するかを--silent-by <ISO UTC time>で指定します。その時点での動作は、ユーザーの leash によって決まります。「When it matters」(デフォルト)では、期限の--silent-byに open board が--defaultを適用します。「Act, then tell me」では、raiseがただちに--recommendを適用し、picked <value>と通知します。「Ask me first」では何も適用されません。この方法で適用された回答は、taken: defaultまたはtaken: agentとしてwaitに届きます。そのまま進めて、引き続き回答を待ってください。ユーザーはまだ回答を変更できます(変更にはreplacesが付きます)。ユーザーに代わって自分で選んではいけません。- 削除または上書きを伴う、元に戻せない、金銭を使う、パスワードやキーに触れる、またはアクセス権を変更する質問には、
--guard destructive|irreversible|money|credential|securityを指定してください。leash の設定にかかわらず、こうした質問ではデフォルトの適用も選択も行われません。質問の文面からボードが該当すると判断した場合も保護されますが、該当する場合は必ず guard を指定してください。 - 誤って投稿したカードは、
npx -y sign-off-axi dismiss <key>で非表示にし、restore <key>で戻せます。ユーザーがカードの Discard をタップして理由(Not relevant、Replaced by newer、Done elsewhere)を選ぶと、カードは Archived に移動します。Undo を使えば10秒以内に元に戻せます。その後、wait --filerが理由とともにdiscardedとしてカードを渡します(--eventsの行は"event":"discarded")。そのカードが求めていた作業は中止してください。answersにもdiscardedとして表示されます。同じ効果で自分で破棄するには、dismiss <key> --reason not-relevant|replaced|done-elsewhereを使ってください。 - タスクが終了したら(統合、破棄、または別の方法で回答済みになった場合)、
npx -y sign-off-axi dismiss --filer <id>を実行してください。投稿したカードのうち、まだ回答待ちのものはすべて Decide から消えます。レポートは提出から1日後にメインビューから自動的に消えます。画面の Archived で回答を待ち、restore <key>で戻せます。エビデンスは却下されるまで Evidence 画面に残り、同じキーで証拠を変更して再投稿すると、既存のカードが置き換わります。削除されるものはありません。 適切なはい/いいえ形式の質問:
npx -y sign-off-axi raise --ask-ref <captain-message-id-or-hold-id> --title "Ship the new sign-in screen this week?" \
--why "The screen is ready and the release goes out Friday." \
--outcome yes="It ships to everyone on Friday." --outcome no="It waits for next week's release." \
--recommend yes --recommend-reason "Every check passed on 3 phones." \
--default no --silent-by 2026-10-19T16:00Z
適切な A/B/C の選択肢:
npx -y sign-off-axi raise --ask-ref <captain-message-id-or-hold-id> --title "Which day should the release ship?" \
--why "Two fixes are still in review." \
--option a="A: Today" --option b="B: Friday" --option c="C: Next week" \
--outcome a="It ships now, without the 2 fixes." --outcome b="It ships with both fixes." --outcome c="It waits for the redesign too." \
--recommend b --recommend-reason "Both fixes land by Thursday." --default b
証拠は立証し、レポートは説明し、計画は承認を求めます
- Evidence:実際に機能することを示す証拠です。実際の製品の画面または動画を使用します(
--type evidence)。Evidence に保存され、依頼ではないため、証拠を質問として投稿しないでください。テキストのみの画像やプレースホルダー画像は拒否されます。 - Plan:作業を始める前にユーザーの承認を得るために、これから行うことを示します(
post --kind plan --from plan.json。形式はpost --helpとパッケージのドキュメントにあるコントラクトを参照してください)。ユーザーは各セクションを承認または変更し、各決定に回答して、すべてを一度に返します。依頼と同じように返答を待ち、answers --jsonで内容を読み取ってください(各セクションにつきメモが1つ、各決定につき値が1つです)。 - Design review:
post --kind design(スキーマ 2)は Designs(スマートフォンでは Decide の2つ目のリスト)に投稿し、デザインを振り分ける担当者がレビューします。ユーザーの Decide に直接投稿しないでください。その担当者がpromote <key>を実行すると、カードが Decide に移動します。自分でpromoteを実行しないでください。デザインカードは、閲覧者が Yes または Change で回答する、簡潔な質問を1つだけ含みます。- タイトルはその質問にしてください。12語以内で、たとえば「Reports に新しいスマートフォン用の最終画面を追加してよいですか?」のようにします。タスク名、ブランチ名、PR、スライス、エージェントのメッセージ ID、ファイル名は、タイトルにも
aboutにも使わないでください。画面タイトルやキャプションも使えません。投稿すると拒否されます。 - 変更した状態ごとに画面を1つずつ用意します(最大8つ。同じ状態を3つの幅で表示するのは不可)。各フレームに固有の画像を用意してください。
today(現在リリースされているもの)、builtまたはproposed(新しい見た目)、そして異なる場合に限りtarget(承認済みデザイン)を指定します。他のフレームと同じように見えるフレームは削除してください。フレーム間の差が0.1%未満の場合、投稿すると拒否されます。複数の列を1枚の画像にまとめないでください。ボードがフレームにラベルを付けて整列します。 - 各フレームで、
area(画像内の割合)を使って変更箇所を囲み、1行のcaptionで説明します。変更が表示される状態を撮影してください。フェードや移動した線など、静止状態では確認できない変更には、スクロールした状態が必要です。 acceptsには、Yes の回答が承認するフレームを指定します。振り分け担当者の判定はreviewedに指定します。形式はpost --helpを参照してください。パッケージの fixtures/contract/design.v2 に例があります。
- タイトルはその質問にしてください。12語以内で、たとえば「Reports に新しいスマートフォン用の最終画面を追加してよいですか?」のようにします。タスク名、ブランチ名、PR、スライス、エージェントのメッセージ ID、ファイル名は、タイトルにも
- Report:詳細な説明です。ユーザーが説明を求めた場合、または概念、デザイン、トレードオフについて理解が必要な場合に限り使用します。マージ、PR の結果、受領通知、判定、ステータスメモは Report ではありません。
- Report は、ボードが1つのスクロール表示として描画するフィールドの集まりです。テキストカードでも、自分で作成するページでもありません。
npx -y sign-off-axi report init .sign-off/reports/<key> --purpose <kind>を実行し、report.jsonのFILL:行をすべて置き換えてから、npx -y sign-off-axi post --kind report --from .sign-off/reports/<key>/report.json --filer <id>を実行してください。FILL:のまま残したテキストは拒否されます。 - すべての Report で、
purposeに用途を指定します。report initと投稿処理では、用途のない Report は拒否されます。それより前に投稿した Report には、report kind <key> <kind> --by <your id>を使って一度だけ種類を指定してください。適切な種類を選びます。research(調査と発見:質問、選択肢、情報源)、plan(実装計画:作業をどのように構築するかを順を追って説明)、decision(決定と推奨:1つの選択肢を比較検討)、audit(基準に照らして確認した内容と修正事項)、incident(インシデントと振り返り:何が起きたか、原因、変更内容)、status(作業の進捗状況)、または該当するものがない場合はotherです。ボードでは Report の行と見出しに種類と用途を示す1行が表示され、ユーザーは Reports を種類で絞り込めます。 - Plan も同様ですが、担当者が決定する質問を含みます。
report init .sign-off/plans/<key> --planを実行し、plan.jsonに記入してから、post --kind plan --from <file> --filer <id>を実行し、その後wait --filer <id>を実行してください。担当者は Go ahead を押して、推奨したすべての選択肢を承認できます。そのため、自分が実行する内容を推奨し、相手が何も返答しなかった場合にどうなるかをquietに記載してください。 - ボードに表示される順序に従い、各項目を閲覧者向けに記述します。これは何か(答えと画像を1つ。棒グラフ、手順、タイル、またはデザイン、アーキテクチャ、Plan の Report に必要な図)、理解した内容(依頼を自分の言葉で言い換え、認識違いがあれば指摘できるようにする)、見つけたこと、推奨事項(Plan)、決めていただくこと(Plan。質問は最大5つで、それぞれに自分の選択と理由を添える)、次のステップ。
- 最初に答えを示します。画像の見出しは、答えを述べる簡潔な1文にしてください。
- 各ポイントにつき画像は1つです。数値は
detailsに記載し、タップして開く形にしてください。文中に入れないでください。 - 行は短くします。
textは1行、moreはその場で開く補足とし、ポイントの間は改行してください。閲覧者がスクロールしなければ読めない段落は使わないでください。 - コードを書かない人にも伝わる平易な言葉を使い、ID、ファイルパス、ツール名は含めないでください。
- 事実が古くなる可能性がある場合は、その事実が有効だった日付を記載します。
- 調査 Report(比較、選択肢の検討、「X を使うべきか?」という質問)には、説明 Report より厳しい基準が適用されます。自分で集めた数値だけを根拠にした少数の選択肢は却下されます。
- まず必須条件を示します。実際に存在する選択肢を幅広く調査してから、必須条件に基づいて候補を絞り込みます。各選択肢を除外した理由を1行で示します。
- 候補に残したすべての選択肢を、同じ軸で比較し、長所と短所をすべて示してください。比較可能な1つの表にまとめ、各選択肢につき
foundの項目を1つ用意します。長所と短所はtextに、各軸はmoreに「軸:値。」の形式で、軸ごとに改行して記載します。軸と順序はすべて同じにしてください。ボードではこのセクションを1つの表として描画します。古いボードでは同じ行がテキストとして表示されます。 - 主張ごとに、外部の根拠とリンクを示してください。対象は GitHub の Issue(未解決のバグ、リグレッション、アップグレードによる破損、メンテナーの回答内容)、Reddit、Hacker News、X、フォーラム、ブログです。サイトから情報を取得できない場合は、読めなかった内容を明記してください。ベンダーの宣伝、スター数、自チームの作業ログの数値は根拠になりません。
- 自分で確認した内容と、他者の主張を分けてください。セクションを分けるか、各行の先頭に「確認:」または「報告:」を付けます。
- 最後に、明確な推奨事項を1つと次点を1つ挙げ、それぞれの理由を示します。
- Plan では、その中のすべての選択肢に対して同じ調査基準を満たしたうえで、承認に必要な内容を示します。選択肢とその長所・短所、推奨事項、範囲(対象に含めることと含めないこと)、順序に沿った手順、リスクとその対処方法、完了を証明する方法を記載してください(
understoodにDone when、証拠の保存先をnextに記載します)。 - 新しいガイド付きの既定値は Plan スキーマ 3 と Report スキーマ 5(コントラクト 1)で、必須の filer を指定します。古いスキーマも読み込めます。Plan では各項目に、Report では表示中の項目のバーに、Ask a question、Go deeper、Simplify this、Show an example、Why? に加え、自由記述とフォローアップが用意されています。ユーザーが質問すると、セクションの入力欄にフォーカスが移り、テキストの入力と Send が必要です。それ以外のプリセットはすぐに送信されます。質問とカスタム入力には空でないテキストが必要です(最大500コードポイント)。自由記述とフォローアップにはカスタム入力を使います。該当するセクションで、指定された操作と質問に正確に答えてください。説明する、詳しく述べる、簡単な言葉にする、例を示す、理由を説明する、のいずれかを行います。すべて同じエンゲージメント経路を使います。バージョン1では、操作、変更不可の所有者、ドキュメントのリビジョン、対象を引き継ぎ、選択範囲を任意で含めます(作成者が記述したフィールド、コードポイントでの開始位置と終了位置、正確な引用文)。選択範囲がある場合は、ドキュメント内の引用箇所に即して回答してください。これらのフィールドは
deeper --json --allで読み取ります。元のドキュメントを参照して依頼された操作に回答し、テキストを書き換えたり Plan の決定を変更したりしないでください。対応中の返信には--filer <your id>が必要です。登録済みのセッションでは、まず正確な ID を確認応答します。古くなった対象や別の所有者からの依頼は拒否されます。回答はその場で開き、目に見える形で読まれるまで再読み込み後も New のままです。Report と送信済み Plan の後も、またすべての返信の後も、所有者のディスパッチャー/リスナーを稼働させたままにしてください。 - ボードには、各項目を誰がいつ読んだかと、各項目で利用できるプリセットが表示されます。担当者がプリセットをタップすると、
wait --filer <id>は依頼を返します(操作、項目、質問があればその質問を含む)。またはnpx -y sign-off-axi deeper <board> --filer <id>を実行して、未対応の依頼を一覧表示できます。稼働中のリスナーは平易な言葉で、数行ずつ回答します。各部分についてnpx -y sign-off-axi deeper <board> --filer <id> --id <id> --text "<what you found>" --moreを実行し、最後に--moreを付けずに1回実行して回答を完了してください。登録済みの休止中の所有者は、上記の方法で確認応答し、最終回答を1つ送ります。ボードは各部分を、担当者がタップした位置に表示します。担当者が項目に対して Agree、Disagree、Comment を送ると、その項目とテキストを含むイベントとして同じwaitに届きます。同じdeeper --id <id> --textで回答し、担当者の指摘が正しければページを修正してください。長い説明文で回答しないでください。短く伝えれば、担当者は追加の質問をできます。 - ボードを幅390 pxで開き、担当者に見せる前に確認してください。最初の画面に答えと画像の両方が表示されている必要があります。
- デザインの成果物(モデルが作成した画面、モック、選択肢)についての Report には、貼り付けた画像ではなく、必ずギャラリーを用意します。
report init <folder> --purpose <kind> --galleryを実行し、各選択肢のスクリーンショットをボードファイルのフォルダー内に保存します(幅390のスマートフォン用フレームと幅1280のデスクトップ用フレーム。ライトモード用のコピーは不要です)。最初のセクションのギャラリーに、選択肢ごとのlabel、作成したmodel、実行日時ran(UTC)、各フレームのdevice(phoneまたはdesktop)、src、表示内容を説明するcaptionを記入します。captionまたはdeviceがないフレームは投稿時に拒否されます。ボードでは選択肢がスワイプできる帯(デスクトップでは横並び)として描画され、両方のフレームが並んで表示されます。タップすると全画面で開きます。 - Report の各項目はボード独自のブロックで表示し、HTML や CSS を自分で使わないでください。セクションに
blocksを追加すると、次を使用できます。callout(独立して表示するメモ、警告、質問)、beats(時刻、タイトル、言葉を付けた画像で構成するステッパー)、video(ポスター画像付き動画)、table、compare(変更前と変更後)、evidence行(ステータスはfixed、progress、waiting)。ファイルはボードファイルの隣に置いてください。投稿時に固定されます。最初の段落がaboutの内容と重複していると、投稿時に警告が表示されます。そこで新しい情報を伝えてください。 - Report は、自作ページではなくボードのキット(次の章を参照)を使って作成してください。ページを使えるのは、どのブロックでも表示できず、閲覧者がタップする必要のあるデモに限ります(
report init <folder> --page --purpose <kind>を参照)。
ボードのキットでレポートを作成する
ボードには、単語、ファイル、行を渡します。ボードは独自の書体と色で、ライトモードでもダークモードでも、全幅でひとつの溝に描画します。レポートにHTML、CSS、色、カードを自分で書いてはいけません。自作のページはボードに合わず、読んでもらいたい計画やレポートは、ほかのものと同じ見た目である必要があります。
npx -y sign-off-axi report init .sign-off/reports/<key> --purpose <kind>を実行します(デザイン出力には--galleryを追加します)。その後、すべてのFILL:行を埋めます。表示する内容がないレポートには、ブロックは不要です。- 段落の代わりにブロックで内容を示します。セクションに
blocks(1~12個、指定された順)を追加します。画像や動画はそれぞれreport.jsonの隣に保存し、パスで指定します。投稿するとファイルがピン留めされます。 - 投稿します:
post --kind report --from .sign-off/reports/<key>/report.json --filer <id>。幅390 pxでボードを開き、ライトモードとダークモードの両方で確認してから、表示されたと伝えます。
読者に見せるべきものに合わせてブロックを選びます。
| ブロック | 用途 | フィールド |
|---|---|---|
callout | 注意点、警告、質問など、ひとつの内容を目立たせる | tone(note、warn、askのいずれか)、title(60)、text(280) |
beats | 読者が順にたどる一連の内容:動画のシーン、フローなど | beats、2~12個。それぞれimage、time、title(80)、text(280) |
video | 短い動画 | src(.mp4または.webm、50 MB)、poster、length、caption |
image | 評価を添えない、参考用の画像 | src、caption(280)、任意のalt(280)。画像全体の縦横比は維持されます |
file | ダウンロードするローカルファイル | src(5 MB以下の任意のファイル)、caption(280)。メディアと同様にピン留めされ、添付ファイルとしてダウンロードされます |
table | 不規則な表を含む、元データの数値 | columns(1~20)、rows(最大30)。セルはテキスト(120)または{text, colspan, rowspan}です。空のセルや行ごとに長さの異なる表は、作成時のままにします。幅の広い表や不規則な表は、スマートフォンではブロック内をスクロールできます |
compare | 変更前と変更後 | beforeとafter。それぞれimageとcaption(80) |
evidence | 状態を添えたキャプチャ | rows。各行にimage、title、note、status(fixed、progress、waitingのいずれか) |
- 1ブロックにつきアイデアはひとつ、ポイントごとにブロックをひとつ使います。数値を示すなら3段落より表が適しており、画面の手順を示すなら番号付きリストよりステッパーが適しています。
- 各パートで新しい内容を述べます。セクションの最初の段落が
aboutを繰り返している場合、投稿時に警告が表示されますが、投稿は拒否されません。 - モデルが作成した選択肢は、画像の羅列ではなくギャラリーです。上記のデザイン出力に関するルールを参照してください。
galleryとblocksは同じセクションで併用できます。その場合、ギャラリーを先にします。 - ファイルパスはボードフォルダー内に置き、
..、?、#、バックスラッシュを含めないでください。投稿するとファイルの内容がピン留めされます。ファイルを変更した場合、再投稿するまで利用できません。 - 画像は.png、.jpg、.jpeg、.webpのいずれかで、パスに
..、?、#、バックスラッシュを含めてはいけません。 - すべての見出しとラベルにはセンテンスケースを使い、すべて大文字の表記や色の名前を避けます。フィールド内にマークアップを記述しないでください。
- 自作のページ(
report init --page)は、初回投稿時にボードの見た目に合わせる必要があります。独自の色を3色以上指定したり、カードの中にカードを描画したりするページは投稿が拒否され、ブロックを使うよう案内されます。スキャフォールドはどちらも描画しません。システムカラー(Canvas、CanvasText、GrayText)を使ってください。すでにボードに投稿済みのレポートは、投稿時の状態のままです。
レポートの種類に応じたワークフローに従う
各種類のレポートには、その種類の文書にふさわしい内容が決まった順序であります。各内容を "part": "<id>" として1つのセクションに記述します(最大10セクション)。post は、レポート5にパートの欠落、重複、または種類に合わないパートがある場合、投稿を拒否し、修正箇所を示します。report init <folder> --purpose <kind> を実行すると、記入するすべてのパートが作成されます。ボードは、読み手が各パートを読み進めるにつれて埋まっていくレポートの進捗バーとして、各パートを表示します。
- research(調査と探索。GOV.UK のディスカバリーフェーズ https://www.gov.uk/service-manual/agile-delivery/how-the-discovery-phase-works や、Teresa Torres のオポチュニティ・ソリューション・ツリー https://www.producttalk.org/opportunity-solution-trees/ などに続く形式):
question(問いと、今それが重要な理由)、scope(対象範囲と対象外)、method(どのように調査したか)、sources(少なくとも3件。それぞれにlinkと"source": "primary"または"user"を指定し、ユーザーレポートを少なくとも1件含める:issue、フォーラム、Reddit、Hacker News、X のいずれか)、options(同じ評価軸で少なくとも2件。ボードには1つの表として表示されます)、findings(各項目に"confidence": "high" | "medium" | "low"を指定)、not-checked(確認しなかったこと、または読めなかったもの)、recommendation(推奨案と次点案)、open-questions。ボードは、レポートのヘッダーにリンク付きのソース数とユーザーレポート数を表示します。 - plan(実装計画。Google の設計ドキュメント https://www.industrialempathy.com/posts/design-docs-at-google/、Rust RFC テンプレート https://github.com/rust-lang/rfcs/blob/master/0000-template.md、Shape Up のピッチ https://basecamp.com/shapeup/1.5-chapter-06 などに続く形式):
goal(目標と対象外)、current(現状の仕組み)、design(セクション、項目、またはビジュアルに実際の図を含める)、slices(順番に記載し、各項目に"S, half a day"のようなsizeを指定)、tests(各スライスのテストと、その証拠)、risks(各リスクとロールバック方法)、rollout、estimate(期間を幅で示す)、owner-calls(ユーザーが決める必要のあること)。ユーザーがセクションごとに回答する計画も、引き続きpost --kind planを使います。計画レポートは読み物です。 - decision(意思決定と推奨。Michael Nygard のアーキテクチャ意思決定記録 https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions に続く形式):
context(要因を明確に記述)、options、recommendation、consequences(良い面と悪い面を含む、その後の影響)。 - audit(監査所見。Yellow Book の監査所見の要素、すなわち基準、状態、原因、影響に続く形式:https://www.gao.gov/yellowbook):`scope`、`standard`(照合するルールとそのリンク)、`findings`(各項目に、現状、ルールとの照合結果、その理由、コストを記載)、`fixes`(緊急度の高い順)。
- incident(インシデントと振り返り。Google の SRE ブックにある非難しない事後検証 https://sre.google/sre-book/postmortem-culture/ に続く形式):
impact(対象者、影響の大きさ、継続時間)、timeline(各イベントとその時刻を記載)、root-cause(人ではなく、システムを記載)、actions(再発を防ぐための変更)。 - status:
done、in-progress、blocked(何が原因で滞っているか)、up-next。 - other:パートの指定はありません。どの種類にも当てはまらない場合にのみ使用してください。
すべての設計、アーキテクチャ、計画レポートに実際の図を描く
計画、および設計やアーキテクチャを説明するレポートには、少なくとも1つ、実際の図が必要です。つまり、アーキテクチャ図(構成要素と、それらが何と通信するか)やフロー(順序に沿った手順と矢印)のように、対象そのものを描いた図です。棒グラフ、タイル、番号付きリストは図ではありません。その他のレポートでは、構造、順序、依存関係が主題の場合に限り図を追加します。数値が主題の場合は、棒グラフやタイルをそのまま使います。
- 計画またはレポートのファイルと同じ場所にある
.htmlページに、インラインの<svg>として描きます(手描き、または別途インストールする Archify スキルを使います:npx skills add tt-a1i/archify -g、続けてARCHIFY_UPDATE_CHECK_DISABLED=1 archify finalize --quality showcase)。図の画像、<img>、ウェブから読み込むページは使わないでください。 visual、セクション、または項目に"diagram": [{"label": "Flow", "src": "diagrams/flow.html"}](タブとして表示されるビューを1~3個)を追加します。その横にある行は、リスト内の同じ回答のままにします。メインの図はvisualに配置し、読者が最初に目にする図にします。- スマートフォンで読みやすくします。
viewBoxの幅は320~340、列は最大2列、ラベルは約16文字以内、図中の文字は12 px 以上にし、凡例は付けません。横長のシーケンス図や比較図は収まらないため、同じフローを縦方向に描き、Today と After は2つのビューにします。 - ライトモードとダークモードの両方で読みやすくします。すべての色をCSS変数にし、ライトモードとダークモードで色を切り替える
@media (prefers-color-scheme: dark)ブロックを追加します(明るい背景には濃い文字、暗い背景には明るい文字)。ボードはページにライトモードかダークモードかを伝え、そのルールを有効または無効にするため、図はボードに合わせて切り替わります。黒や白を固定して描かないでください。 - 最小の文字が幅390 pxのスマートフォンで12 px未満の図、ブランドマークを含む図(
brandは設定しないでください)、または<svg>の描画がない図は、Post に拒否されます。Post は各ページを固定します(sha256とbytesは自動で記録されます)。投稿後にページが変更されると表示されないため、変更後に計画またはレポートを再投稿してください。 - レポートでは、図をタップすると全画面表示になり(スマートフォンでは図だけが表示されます)、計画では、スマートフォンに列幅いっぱいの図と Full size が表示され、デスクトップでは Show me をクリックするとその場で開きます。投稿済みだと伝える前に、幅390 pxでライトモードとダークモードの両方を開いて確認してください。
ユーザーにサインインを依頼する
作業にユーザーのサインインが必要な場合(たとえば npm login のログインリンクを使う場合)、サインインカードを1つ投稿します。カードは待機項目の先頭に表示されます。
- 投稿します:
npx -y sign-off-axi post --type signin --key <key> --service "<service>" --link <sign-in URL> --unlocks "<what it unlocks>" --waits "<who waits>" --expires 15m。--expiresはリンクの有効期限です。ISO形式の日時、または現在からの時間(例:15m)を指定します。http(s) のリンクだけを投稿し、パスワードやトークンは絶対に投稿しないでください。 - サインインが完了したことを確認したら、カードを閉じます:
npx -y sign-off-axi signin done --key <key>。wait --key <key>は完了すると戻ります。 - リンクの有効期限が切れると、カードにその旨が表示されます。新しいリンクを取得し、同じ
--keyで再投稿します。カードには新しいリンクが表示され、再び待機状態になります。 - リンクの有効期限が短い場合(
npm login --auth-type=webのリンクは約5分で期限切れになります)、--linkと--expiresの代わりに--start '["npm", "login", "--auth-type=web"]'を投稿します。「Open」をタップするたびに、ボードのコンピューター上でそのコマンドが実行され、出力された新しいリンクが開きます。コマンドが終了コード0で終わると、カードは自動的に閉じます。
デザイン上の決定:言葉ではなく A/B/C のモックを見せる
ユーザーに見た目や動作を選んでもらう必要がある場合は、次の手順に従います。
- デザインに関する質問を1行で提示します。
- 構造(レイアウト、階層、または操作の手がかり)が異なるバリエーションを必ず3つ作成します。色だけが異なるバリエーションは対象外です。
- プロジェクト内の
.sign-off/mocks/<key>/に配置します(.sign-off/がない場合は、npx -y sign-off-axi initを1回実行します)。ファイルを3つ(a.html、b.html、c.html、またはスクリーンショット)用意するか、?variant=a、b、cで指定したバリエーションを表示するindex.htmlを1つ用意します。 - 平易な言葉で簡潔なトレードオフ(5行以内:各バリエーションの長所と短所)を書き、1つを推奨します。
- 次のコマンドでプロジェクトボードに投稿します。
npx -y sign-off-axi post .sign-off/decisions.json --type design --key <key>を実行し、バリエーションごとに--optionと--mockを1つずつ指定して、--tradeoffと--recommendも指定します(post --helpを参照)。モックのパスは.sign-off/からの相対パスです。例:--mock a=mocks/<key>/a.html、または1ページ形式の場合は--mock a=mocks/<key>/index.html?variant=a。バリエーションを URL でも実際に動作させる場合は、該当するバリエーションに--link a=<http or https URL>を追加します(バリエーションごとに1つ)。カードにはモックの下に「Open live」リンクが表示され、新しいタブで開きます。その後、npx -y sign-off-axi open .sign-off/decisions.jsonを実行し、ユーザーに URL を伝えます。 npx -y sign-off-axi wait .sign-off/decisions.json --key <key>を実行して回答を待ちます。npx -y sign-off-axi answers .sign-off/decisions.json --key <key> --jsonを実行して回答を読み取ります。選択結果にはanswerと、場合によってはユーザーが添えたコメントであるnoteが含まれます。"answer": "text"はユーザー自身の回答(「自分の回答として送信」または「返信を送信」)であり、noteに格納されています。answerがないroundsの項目、またはanswerのatより新しいroundsの項目がある場合は、ユーザーがもう一度提案してほしいと考えています。そのnoteを読み、3つの新しいバリエーションを作成して、新しいキーで投稿します。回答またはラウンドにcommentsのリストがある場合、ユーザーはモック内の箇所にコメントしています。mockはオプション、ref、tag、wordsは要素を示し、textはコメントです。該当するバリエーションに反映します。- 選ばれた案を実際のコードに反映してから、
.sign-off/mocks/<key>/を削除します。
モックは使い捨ての作業なので、高速で低コストなモデルで作成します。first-draft がインストールされている場合は、モックの作成とともに、--tradeoff の末尾に Open in first-draft: <label> <url> のリンクを書き込めます。ボードでは実際のリンクとして表示されます。
言葉だけでは伝わらないときは、見てわかる形にします
項目を説明するのに必要な、最もシンプルな形式を使います。プレーンテキスト、図、インタラクティブページ、ナレーション付き動画の順に検討してください。
- 図:
.sign-off/mocks/<key>/に SVG を描画する(または PNG として保存する)し、--type diagram --view mocks/<key>/flow.svgを指定して投稿します。 - インタラクティブページ:
.sign-off/mocks/<key>/に自己完結型の.htmlファイルを 1 つ作成し(CSS と JS はインラインで記述し、ネットワークは使いません)、--type interactive --view mocks/<key>/demo.htmlを指定して投稿します。サンドボックス内で実行されるため、fetch、リモートファイル、ダッシュボードへのアクセスはできません。 - ナレーション付き動画(解説動画):有料またはオンラインの音声サービスは使わず、無料のローカルツールだけを使って、自分で作成します。
- ASD-STE100 簡易テクニカル英語で短い台本を書きます。3~5 部構成とし、各部は短い文を 1~2 文、全体で約 20~40 秒にします。
- 各部につき静止画を 1 枚(スクリーンショットまたはシンプルなスライド)用意します。すべて同じサイズにします。たとえば 1280x720 の PNG にします。
- 無料のローカルエンジンを使って、各部のナレーションを作成します。たとえば piper(
pip install piper-tts)または espeak-ng を使います:piper -m <voice>.onnx -f 1.wav < 1.txt - 各静止画にナレーションを付けてから、各部を結合します:
ffmpeg -loop 1 -i 1.png -i 1.wav -c:v libx264 -tune stillimage -pix_fmt yuv420p -c:a aac -shortest 1.mp4、続いてffmpeg -f concat -i parts.txt -c copy -movflags +faststart explainer.mp4を実行します(parts.txtにはfile '1.mp4'などを記載します)。 --type explainer --media explainer.mp4 --about "<one-line summary>"と、各部につき 1 つの--chapter <m:ss>=<title>を指定して投稿します(各部の長さはffprobe -show_entries format=durationで確認できます)。動画はカード上で再生され、チャプターを使うと各部に移動できます。
これらの形式はどれも、意思決定への回答として示します(はい/いいえ、または独自の --options と、推奨する選択肢を示す --recommend)。回答を待ち、同じように内容を確認してください。
リクエスト
$ARGUMENTS
上の行に質問がある場合、ユーザーはその質問を添えてこのスキルを名前で呼び出しています。最新の CLI ガイダンスを取得してから、その質問をしてください。 空欄の場合、またはプレースホルダーしかない場合は、会話の内容から質問を推測してください。