オープンソース · MIT · ローカルファースト

言えば、
Witness が残す 証拠を。

いつも通り触りながら、違和感を声にするだけ——「このボタン、押しても反応しない」。Witness はあなたの言葉をその瞬間の因果エビデンスに溶接し、パケットを AI コーディングエージェントに渡します。

$
↑ これを AI エージェントに渡すだけ——インストールから録画までやってくれます
wit CLI が入ります——録画 · レンダリング · MCP が一体 · Node 18+ · システムの Edge/Chrome · キー不要
00:00REC
01 · 課題

エージェントには、あなたの目が見えない。

人間なら「スクロールするとボタンが変に縮む」と2秒で気づく。でもそれを AI エージェントに書き起こすと、スクリーンショット・セレクター・プロンプトで10分かかる——しかもなぜは消えたまま。音声はいちばん安い注釈チャンネルなのに、レコーダーが無かっただけです。

00:18
02 · 実録

1クリック。すべての結果を記録。

これは実際の録画セッションです——発話、マーク、反応しないクリック、保存まで。下の Pay ボタンは押しても何も起きません。「起きなかった」という事実そのものがエビデンスです。

localhost:5173/checkout
PLAYWRIGHT で実録 · ワンテイク
3録画トラック
12MCP ツール
0クラウドキー不要
17テスト全パス
MITオープンソース
03 · 仕組み

3つの録画ライン、1つのタイムライン。

wit start <dev-url> で管理ブラウザが開きます。その瞬間から3本のストリームが並行して走ります——手作業ゼロ:

01 / 音声

あなたの声

連続録音 + 真ストリーミング ASR(doubao-web → doubao-ime → ブラウザ SR の自動フォールバック)。ツールバー下にライブ字幕——思いついた順に話せば、一発撮りで複数の問題を報告できます。
02 / 操作

操作 + 因果バースト

クリックごとに直後 ~1.8s の結果を捕捉:リクエスト、レスポンス、console エラー、DOM 変化。何も起きなかったクリックは、それ自体がエビデンス。
03 / 状態

ページの変遷

rrweb フル DOM リプレイ + イベント駆動スクリーンショット + 定期 DOM スナップショット。任意の秒のページ状態に巻き戻せます。
wit start <url>→触って話す→Ctrl+クリック / M でマーク→■ 停止→エビデンスパケット
リモコンはこれだけ。全部です。
話す+ブラウズ 主入力はこれだけ——ただ実況する
Ctrl+クリック 要素をマーク:selector + コンポーネントチェーン + 枠付きショット
M inspect モード:ホバーで選択、またはドラッグで範囲選択
N 新しい問題の境界を切る——一発撮りで複数の問題
P 一時停止/再開:エビデンスもマイクも完全にフリーズ
■/Alt+Shift+R 停止——エビデンスパケットがディスクに落ちる
01:12
04 · 出力

あなたの言葉が、エビデンスのアンカーになる。

話した断片がタイムライン上のブロックになり、その瞬間の因果ファクトがぶら下がる——「因果バースト」。引用をクリックしてみて:

session.md — interactive引用をクリックするとエビデンスが開きます
SCROLLy=3936
MUTbutton.feedback · data-collapsed: false → true
MUTbutton.feedback · data-collapsed: true → false
└─ 境界で属性が往復している
CLICKbutton#submit “送信” · @482,701
└─ クリック後 1.8s ページは無反応——それ自体がエビデンス
CLICKa[href="/orders"] “注文”
NET →GET /api/orders?page=1
NET ←200 /api/orders · items: []
└─ レスポンスボディを捕捉 → bodies/req_0041.json
01:48SAY ×3
05 · 2つの読者

人にはリプレイを。エージェントには構造を。

人間向け

AI エージェント向け

06 · プッシュではなくプル

wit mcp——エビデンスを API に。

静的ダンプではなく、セッションが stdio MCP server になります。MCP 対応エージェントを向けると、必要なエビデンスだけをクエリします:

list_says

タイムスタンプ付きの全発話——問題のアンカー。

events_around

時間窓+種別で絞った生イベント。

get_dom_state

ある時刻に最も近い完全な DOM。

get_errors

console エラー、ページエラー、HTTP ≥400。

get_shot / get_body

必要な時だけ取るスクショとレスポンスボディ。

session_md

全文が欲しい時はレンダリング済みタイムライン。

get_asr / set_asr

エージェント自身が音声エンジンを確認・切替——設定ループに人は要りません。

……登録ツールは全 12 個——セッションはダンプではなく、クエリ可能な API です。

パケットは自己記述型でロックインなし。エージェントの能力に応じて2つの経路:

PROMPT.md → 貼る

どのセッションにも引き継ぎファイルが付属:フォーマット仕様、ページ語彙、修正ルール。コマンドを実行できるエージェントなら何にでも貼れる——エビデンスの読み方と、直す前に復唱する作法を理解します。

wit mcp → 挿す

MCP 対応エージェントは stdio server に直結:12 ツールでオンデマンドにエビデンスを掘り、コンテキストを埋め尽くしません。Devin には全ループを回すネイティブ skill もあります。
対応 DevinClaude CodeCursorCodexWindsurfあらゆる MCP クライアント
02:31STOP ■
08 · 原則

エビデンスは嘘をつかない。

ローカルファースト、設定ゼロ

システムの Edge/Chrome + 無料ストリーミング ASR(doubao-web → doubao-ime → ブラウザ SR フォールバック。wit config asr で切替)。API キー不要。LLM 仕上げは常に任意レイヤーで、パイプラインではありません。

言葉は書き換えない

発話は events.jsonl に逐語で落ちます。マージ・訂正・関連付けは表示層の提案——生の証言は監査可能なままです。

エビデンス ≠ 意図

クリックやスクロールは事実であって苦情ではありません。発話アンカーが無い時、エージェントには明確に伝えます:行動からバグを推測するな、と。

設計されたプライバシー

パスワード欄は4チャンネルでマスク。POST ボディは認証フィールドを自動マスク。P でマイクごと全停止。敏感なアプリには WIT_NO_BODIES。
03:05

バグレポートを手打ちしても、動画を添付してもいい。それぞれの着地地点:

手書きレポート画面録画Witness
1件報告するコスト約10分:撮って、切って、文章化数分——でも読むたびに再生が必要一言話せば、エビデンス付き
エージェントが直せるか書き残した分だけピクセルのみ——人が文脈を再推論session.md + events.jsonl + MCP
「押しても無反応」書き忘れがち動画では見えないエビデンスとして記録
クリックの因果バースト——~1.8s の リクエスト/レスポンス/console/DOM
あの瞬間のページに戻る—動画 ≠ DOMrrweb フル DOM リプレイ
データはローカルに—アップロード先次第常に .witness/sessions 内
10 · こんな人に

「目が最後の QA」なすべての人へ。

個人開発 × エージェント

自分で作ったものを自分で触りながら話す。エージェントにはすぐ直せるパケット——発見から修正まで一座のまま。

デザイン・モーションのレビュー

ジャンク、チラつき、レイアウトシフト——スクショでは伝わらないもの。動いた場所を言えば、DOM 変更はすでに添付済み。

QA・プロダクトチェック

機能ごとにワンテイク、N で問題の境界。セッションをエージェントに渡すか、review.html をチケットに添付。

OSS メンテナー

報告者にスクショではなく wit セッションを求める:selector、console、ネットワークが自己記述フォルダひとつで届く。
04:02SAY ×8
11 · FAQ

聞かれる前に、答えておきます。

何をインストールすればいい?

Node 18+ とシステムの Edge/Chrome——まず実際のブラウザを使い、無ければ同梱 chromium にフォールバック。npm i -g github:wookat/witness で終わりです。

何かがマシンの外に出ますか?

エビデンスパケットはローカルの .witness/sessions/ に残り、既定で gitignore されます。ライブ字幕は選んだ ASR エンジンにマイク音声をストリーミングします(既定 doubao-web)。--asr sr で OS/ブラウザの認識、--asr off でライブ字幕なし。最終文字起こしは bcut(無料)か自分の OPENAI_API_KEY で whisper——--no-transcribe で丸ごと省略可。LLM レイヤー(訂正・関連付け)は flag とキーを渡した時だけ動きます。

どのエージェントに対応?

CLI を実行できるエージェントなら session.md + PROMPT.md を読めます。MCP 対応(Devin、Claude Code、Cursor、Codex…)は wit mcp に直結——静的ダンプではなく12のクエリツール。Devin には録画フロー全体を回すネイティブ skill もあります。

画面にパスワードが映ったら?

パスワード欄は4チャンネルでマスク、POST ボディは認証フィールドを自動マスク、P でマイクごと全停止、敏感なアプリは WIT_NO_BODIES=1 でレスポンス自体を残しません。

何語で話せますか?

--lang で認識言語を設定(既定 zh-CN、例:en-US、ja-JP)。発話は常に逐語で保存——ASR の誤字は監査可能なまま残り、LLM 訂正は任意の表示レイヤーです。

localhost 以外も録れますか?

どんな URL でも——普通に使う実際の管理ブラウザなのでログインも動きます。一番切れるのはローカル開発:直すエージェントがソースも見えるからです。

途中でクラッシュ/強制終了したら?

events.jsonl は行ごとにストリーミング保存。失われるのは最大でも最後の数百ミリ秒。wit recover <dir> で session.md・review.html・PROMPT.md をいつでも再構築できます。

有料ですか?

MIT。アカウント不要、必須キーなし。無料 ASR が既定経路で、有料モデルのフックは全て BYO キーの任意機能です。

12 · はじめる

3文。それがループの全部です。

あなたが指示し、エージェントがコマンドを叩きます。Witness はエージェントが運転する CLI(wit)——管理ブラウザを開いて録画し、ローカルのエビデンスパケットを返します:review.html はあなたへ、session.md/PROMPT.md/wit mcp はエージェントへ。Node 18+、システム Edge/Chrome、クラウドもキーも不要。

あなた×agent
witness をインストールして
npm i -g github:wookat/witness
http://localhost:5173 を録画して
wit start ✓ · 管理ブラウザが開きます。報告を待っています
普通にプロダクトを触って、気づいたことを話して、問題をマークして ■ を押す
さっきの録画の問題を直して
session.md を読む → 問題リストを復唱 → あなたが確認 → 修正