実際に確認した範囲
入力と合格条件をそろえる
入力は orders.csv、report.mjs、report.test.mjs。成果物は report.mjs の限定的な修正、3 件のテスト成功、合計 2000、短い説明です。入力データの変更やテストの弱体化は禁止します。実際のモデル、プロバイダー、ツール、追加プロンプト、所要時間を記録し、条件が異なる場合は差を Harness だけの効果とみなさないでください。
この演習でこれらを確認する理由
Pi 作者 Mario Zechner の 2025 年の設計記事は、見えるコンテキストと小さなツール集合を重視しています。本問では、各ツールが 3 ファイルのどれを実際に読み、どんな追加指示を読み込んだかを記録します。Anthropic の Agent 評価記事は会話記録と最終結果を区別しています。そのため、終了メッセージだけでなく、ツールログ、保存済み report.mjs、変更されていないテストを確認します。2025 年の記事は設計の背景資料であり、現在の Pi コマンドは現行文書で確認します。
失敗を観察できる小さなプロジェクトを作る
Node.js 24 と Bash 互換の端末を用意し、新しい使い捨てディレクトリで行います。macOS/Linux は Bash、Windows は Git Bash または WSL を使います。harness-lab はまだ存在しないことが条件です。npm 依存、アカウント、個人情報、本番ファイルは不要です。CSV に引用符内のカンマはありません。汎用 CSV パーサーを作る演習ではありません。
create_harness_lab() {
mkdir harness-lab || return
cd harness-lab || return
cat > orders.csv <<'CSV'
id,status,cents
A,paid,1200
B,refunded,700
C,paid,800
D,pending,400
CSV
cat > report.mjs <<'JS'
export function totalPaid(csv) {
const rows = csv.trim().split(/\r?\n/).slice(1);
return rows.map(row => row.split(','))
.filter(([, status]) => status !== 'pending')
.reduce((sum, [, , cents]) => sum + Number(cents), 0);
}
JS
cat > report.test.mjs <<'JS'
const { default: assert } = await import('node:assert/strict');
const { readFileSync } = await import('node:fs');
const { default: test } = await import('node:test');
const { totalPaid } = await import('./report.mjs');
const csv = readFileSync(new URL('./orders.csv', import.meta.url), 'utf8');
test('only paid orders count', () => assert.equal(totalPaid(csv), 2000));
test('refunds alone count as zero', () => assert.equal(totalPaid('id,status,cents\nB,refunded,700\n'), 0));
test('an empty ledger counts as zero', () => assert.equal(totalPaid('id,status,cents\n'), 0));
JS
cp report.mjs report.original.mjs
node --test report.test.mjs
}
create_harness_lab初回は 2 件のアサーションが失敗し、1 件が成功するはずです。返金済み注文の 700 セントを含めるため、正しい 2000 ではなく 2700 になります。paid 行だけを集計し、refunded と pending はゼロとするのが仕様です。金額は整数のセント単位です。
同じ開始状態の独立ディレクトリを用意する
どちらかの Agent が編集する前にコピーします。DSH は harness-lab、Pi は harness-lab-pi を使い、両方に同じ不具合と原本を残します。会話の分岐は独立した作業ツリーではありません。比較中に同じディレクトリを両方で編集しないでください。
copy_harness_lab() {
(cd .. && test ! -e harness-lab-pi && cp -R harness-lab harness-lab-pi)
}
copy_harness_labDSH で課題を進める
- 01
ランタイムとモデルを確認
リンク先の Alpha クイックスタートに従い、正確なコミットからビルドします。認証情報は Settings → Models に設定し、プロンプトに書かず、選択モデルを記録します。
- 02
プロジェクトを明示的に選ぶ
ワークスペース選択から harness-lab の絶対パスを追加します。新しい Web UI では、dsh をプロジェクトから起動していてもワークスペースは未選択です。
- 03
実効権限を確認
この使い捨てローカル演習では、利用可能なら workspace-write を選び、承認要求を確認します。これは workspace-write モードと ask を組み合わせ、設定済み実行器が制約を適用します。全ファイル書き込みでダイアログが出るわけではありません。
- 04
実行して観察
共通プロンプトを送り、読み取り、コマンド、変更、テストを確認します。範囲外のアクセスや無関係な依存のインストールを求めたら、停止して課題を限定し直します。
Pi で同じ課題を進める
公式クイックスタートで Pi を導入し、harness-lab-pi に移動します。/login と /model で対応モデルを設定し、可能なら DSH とそろえます。まず下記の限定ツールで調べます。任意のリソース探索を無効にし、無関係な拡張やプロジェクト指示が暗黙に混ざるのを避けます。
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
cd ../harness-lab-pipi --no-extensions --no-skills --no-prompt-templates --no-themes --no-context-files --tools read,grep,find,lsPi にはファイル、プロセス、ネットワーク、認証情報を制御する組み込みの権限システムがありません。許可リストはモデルに公開するツールを制限しますが、プロセスの OS 権限は変更しません。信頼できないプロジェクトにはコンテナ、仮想マシンなど、確認済みの OS 隔離環境を使ってください。公式ガイドでは、ツールの実行先を変えるだけではホスト上の別の拡張を隔離できない理由を説明しています。
pi -c --no-extensions --no-skills --no-prompt-templates --no-themes --no-context-files --tools read,edit,write,bash,grep,find,ls両 Agent に同じ範囲の課題を渡す
この使い捨てプロジェクトの report.mjs を修正し、totalPaid が paid 行だけを集計するようにしてください。先に orders.csv と report.test.mjs を読み、node --test report.test.mjs を実行して元の失敗を報告してください。orders.csv、report.test.mjs、report.original.mjs は変更せず、依存追加や他ディレクトリへのアクセスもしないでください。実装を最小限変更し、3 件のアサーションを再実行して orders.csv の合計を計算してください。変更ファイル、観察したテスト結果、合計、制約を報告し、環境による実行失敗とアサーション失敗を区別してください。Agent の終了メッセージとは別に検証する
node --test report.test.mjs
node --input-type=module -e "import {readFileSync} from 'node:fs'; import {totalPaid} from './report.mjs'; console.log(totalPaid(readFileSync('orders.csv','utf8')))"
diff -u report.original.mjs report.mjs3 件のテスト成功と、別途出力される合計 2000 を確認します。通常はフィルターが status === 'paid' に変わります。同じ仕様を守りテストを残すなら、別実装も構いません。diff は差分があれば終了コード 1 を返します。ここでは正常であり、テスト失敗ではありません。Node がない、権限がない、といった失敗は環境の問題です。
実際に必要だった作業を比較する
| トークン | 役割 | チェック |
|---|---|---|
| 開始時のコンテキスト | DSH:ワークスペースを選び、セッションとツールを確認。Pi:現在ディレクトリと探索されたコンテキストが起点。本演習では任意の探索を明示的に無効化。 | 正確なディレクトリとコンテキストを記録。同じプロンプトでも同じコンテキストとは限りません。 |
| 承認と隔離 | DSH はサンドボックスと承認を組み合わせます。Pi は公開ツールを選べますが、強い OS 境界は別途設定します。 | 実効境界と手動承認を記録し、ダイアログ数を安全性の指標にしないでください。 |
| 計画と委任 | DSH の構成には計画やサブ Agent を含められます。Pi コアは plan-mode やサブ Agent の流れを拡張やパッケージに委ねます。 | 3 ファイルの修正には不要です。公式 plan-mode 例は追加インストールせず仕組みを読むために使えます。 |
| レビューと再開 | DSH はセッションイベントを記録し、Pi は /session、/resume、/tree、/fork を提供します。 | テスト済み変更と引き継ぎを保存。会話履歴は文脈であり、編集済みファイルを復元しません。 |
| 費用と速度 | モデル、指示、拡張、承認待ちが結果に影響します。 | 観察値または「未測定」を記録。1 つの合成課題から一般順位は決められません。 |
意図して中断・再開・復元する
終了前に目標、変更ファイル、正確な実行結果、次の作業を要約させます。DSH では同じ保存セッションを開き、ワークスペースを確認。Pi では同じプロジェクトで pi -c を使うか、pi -r で選択します。/tree と /fork は会話の分岐であり、ファイルを巻き戻しません。失敗した変更を残してから、演習の実装だけを原本に戻します。
cp report.mjs report.attempt.mjs
cp report.original.mjs report.mjs
node --test report.test.mjs元の 2 件の失敗が再発すれば、意図した復元確認です。report.attempt.mjs は比較用に残します。実際のリポジトリではクリーンなブランチや作業ツリーを使い、対象ファイルごとに確認して復元してください。本例の上書きコマンドを無関係な作業に使わないでください。
一通りレビューしてから選ぶ
共有 Web 作業台、見えるセッション・ツール状態、組み合わせたワークフローが合うなら DSH を試せます。端末の既存ツール群、明示的な CLI 起動、小さな拡張可能コアが好みなら Pi を試せます。同じ課題と diff のレビュー後に決めましょう。どちらも修正の正しさを保証せず、信頼できないコードを単独で安全にするものではありません。
Harness/バージョン:
モデル/プロバイダー:
ワークスペースと初期ファイル:
実効ツール/権限:
追加プロンプトと承認:
テスト:初期 __ 件失敗、最終 __ 件成功
観察した合計:
変更ファイル:
時間/報告された使用量(または未測定):
復元結果:
残る制約:具体的な次の一歩へ
一次資料となる公式文書を読む
よくある質問
変更を行う前に
フォーマット、互換性、証拠、ロールバックに関する回答
このガイドでは何を確認しますか?
このガイドの対象:固定 DSH Alpha ソースと、現在の Pi 公式 CLI・セッション・拡張文書、ローカル実行した注文集計の合成例、参考修正と指定ファイルの復元、モデルの比較ベンチマークや外部サービスの実業務結果は主張しません
最初に何をすべきですか?
返金済み注文を誤って集計するレポートから始めましょう。独立したコピーを 2 つ作り、両方で対応する場合は同じモデルを選び、受け入れテストを固定します。比べるのは製品紹介ではなく、レビューできる変更に到達するまでの作業です。
最も重要な境界は何ですか?
DSH の手順はコミット d347e703908d0406b7a7ef80e3a0e594d86b2215 からビルドした 0.1.3-alpha.1 を使います。Pi のコマンドは 2026 年 9 月 6 日時点の公式文書と照合済みです。注文例と参考修正はローカルで実行しましたが、両ツールのプロンプトをモデルで比較検証したわけではありません。
3 件成功すれば優れた Harness と証明できますか?
いいえ。この実装が 3 条件を満たすだけです。一般化するにはモデル、入力、条件をそろえて課題を増やしてください。
DSH と Pi でセッションファイルを共用できますか?
互換性を仮定しないでください。プロジェクトとテキストの引き継ぎをコピーし、各ツールのセッションを残します。DSH Alpha の形式移行は Pi セッションの取り込みではありません。
plan-mode プラグインは必要ですか?
不要です。調査、編集、テストの短い流れで足ります。必要なら公式例を確認し、拡張の読み込みは別の信頼判断として扱ってください。
学習を続ける
検証済みの証拠から続ける
公開済みのアーティファクトを比較するか、インストール手順に戻ります。