メインコンテンツへ移動
学習に戻る
14操作読了目安 18 分初心者

実践 · 再現、修正、検証

DeepSeek Harness 実践:検証できる 2 つの修正

注文合計を直し、設定変更を無視するキャッシュを直す。この 2 つで再現可能な習慣を作ります。各課題に入力、観察できる失敗、コピー用プロンプト、独立検証があります。大事な作業の前に、使い捨てプロジェクトで練習しましょう。

最終検証日
2026年9月6日
ガイドのソース基準
0.1.3-alpha.1
インストール状況
選択した項目の記録を確認
検証済みの範囲
  • 固定した DSH Alpha ソースと、コンテキスト管理・Agent 評価の一次資料
  • ローカルで実行した 2 つの合成 Node サンプル、参考修正、対象ファイルの復元
  • モデルの比較ベンチマークや外部サービスの実業務結果は主張しません
このページについて
  1. 実際に確認した範囲
  2. プロンプトの前に境界を決める
  3. 失敗を観察できる小さなプロジェクトを作る
  4. 最初に再現可能な診断を求める
  5. 限定的な修正を許可し、自分でも確認する
  6. 第 2 課題:設定は変わってもキャッシュが古いオブジェクトを返す
  7. この演習でこれらを確認する理由
  8. 中断した課題を引き継ぎやすくする
  9. 観察した失敗に合わせて復旧する
  10. 有効だった手順を小さな Skill にする

実際に確認した範囲

プロンプトの前に境界を決める

  1. 01

    既知のランタイムで始める

    0.1.3-alpha.1 と固定コミットのクイックスタートに従い、Settings → Models でモデルを選びます。認証情報はプロバイダー設定に置き、プロンプトやサンプルには含めません。

  2. 02

    プロジェクトとランタイムを分ける

    独立した演習ディレクトリを Web UI で選びます。公式ランタイムをこのサイト内や、上位ディレクトリに互換性のない node_modules がある場所へ置かないでください。

  3. 03

    最初の課題を小さく保つ

    実際のサンドボックスと承認を確認し、使い捨て範囲で必要な作業だけを行います。3 ファイルのために拡張や依存を追加する必要はありません。

失敗を観察できる小さなプロジェクトを作る

Node.js 24 と Bash 互換の端末を用意し、新しい使い捨てディレクトリで行います。macOS/Linux は Bash、Windows は Git Bash または WSL を使います。harness-lab はまだ存在しないことが条件です。npm 依存、アカウント、個人情報、本番ファイルは不要です。CSV に引用符内のカンマはありません。汎用 CSV パーサーを作る演習ではありません。

bash
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
3 ファイルを作り、バグを再現する

初回は 2 件のアサーションが失敗し、1 件が成功するはずです。返金済み注文の 700 セントを含めるため、正しい 2000 ではなく 2700 になります。paid 行だけを集計し、refunded と pending はゼロとするのが仕様です。金額は整数のセント単位です。

最初に再現可能な診断を求める

text
orders.csv、report.mjs、report.test.mjs だけを調査し、まだ変更しないでください。テストの仕様と返金済み行を説明し、node --test report.test.mjs を実行してください。現在のフィルターが 2000 でなく 2700 を返す理由を示してください。実行できなければ環境の実際の問題を報告し、出力を作らないでください。
最初の往復:編集前に失敗を確認する

役立つ診断は B 行、status !== 'pending'、2 件の失敗を特定します。「修正後は通るはず」は実測結果ではありません。CSV ライブラリ追加や大規模な作り直しを提案したら、既存サンプルと合格条件に戻します。

限定的な修正を許可し、自分でも確認する

text
この使い捨てプロジェクトの 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 の合計を計算してください。変更ファイル、観察したテスト結果、合計、制約を報告し、環境による実行失敗とアサーション失敗を区別してください。
コピーできる課題プロンプト
bash
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.mjs
harness-lab 内でこれらのコマンドを自分でも実行

3 件のテスト成功と、別途出力される合計 2000 を確認します。通常はフィルターが status === 'paid' に変わります。同じ仕様を守りテストを残すなら、別実装も構いません。diff は差分があれば終了コード 1 を返します。ここでは正常であり、テスト失敗ではありません。Node がない、権限がない、といった失敗は環境の問題です。

text
.filter(([, status]) => status === 'paid')
このサンプルの参考修正

ローカルで確認した参考修正はフィルターだけを変え、データとテストを残します。テスト出力と独立計算の合計を一緒に保存してください。コマンドや diff のない緑色の端末画像だけでは不十分です。

第 2 課題:設定は変わってもキャッシュが古いオブジェクトを返す

同じプロジェクトに 2 ファイルを追加します。account は demo のままで、mode だけ light から dark に変わります。キャッシュは account しか比較せず、古いオブジェクトを返します。設定変更と、構築済みインスタンスの無効化を分けて診断する練習です。

bash
create_cache_lab() {
test ! -e cache.mjs && test ! -e cache.test.mjs && test ! -e cache.original.mjs || return
cat > cache.mjs <<'JS'
let cached;
export function getSettings(config) {
  if (!cached || cached.account !== config.account) cached = { ...config };
  return cached;
}
JS
cat > cache.test.mjs <<'JS'
const { default: assert } = await import('node:assert/strict');
const { default: test } = await import('node:test');
const { getSettings } = await import('./cache.mjs');
test('a changed setting refreshes the instance', () => {
  const first = getSettings({ account: 'demo', mode: 'light' });
  const second = getSettings({ account: 'demo', mode: 'dark' });
  assert.notEqual(second, first);
  assert.equal(second.mode, 'dark');
  assert.equal(getSettings({ account: 'demo', mode: 'dark' }), second);
});
JS
cp cache.mjs cache.original.mjs
node --test cache.test.mjs
}
create_cache_lab
データベースや認証情報なしで再現する
text
cache.mjs と cache.test.mjs を読み、失敗を再現してください。account または mode が変わると新しいインスタンスを作り、同じ値なら再利用するよう修正してください。元のテストは維持し、必要なら account 変更の別アサーションを追加してください。依存、タイマー、全体キャッシュ消去は導入しないでください。node --test cache.test.mjs を実行し、どの入力が同一性を決めるか説明してください。
コピーできる課題プロンプト
text
if (!cached || cached.account !== config.account || cached.mode !== config.mode) cached = { ...config };
参考修正:動作を変える両入力を比較する

node --test cache.test.mjs を実行します。参考修正では mode 変更後に dark を持つ別オブジェクトとなり、次の同一呼び出しは再利用され、テストが成功します。例の入力は account と mode だけです。実サービスでは構築入力をすべて列挙し、読み取り失敗の動作を保ち、秘密値を出さずに変更を検証します。本番キャッシュや決済プロバイダーの認証ではありません。

この演習でこれらを確認する理由

Anthropic のコンテキスト工学の記事は必要な情報の取得と構造化したメモを扱い、評価記事は会話記録と最終結果を区別します。本演習では、指定ファイルから始め、編集後に読み直し、実際のテスト出力と合計を diff と一緒に残します。HANDOFF.md にパス、実行済みコマンド、残作業を記録すれば、再開したセッションが現在のファイルを再確認できます。長い指示やログを品質の証拠とせず、コンテキスト、検証結果、引き継ぎを結び付ける方法です。

中断した課題を引き継ぎやすくする

report.original.mjs と cache.original.mjs は維持します。新セッション前に現在のファイル、最後のコマンド、残作業の短いメモを求めます。再開時はファイルを読みテストを再実行してください。要約は古い状態かもしれません。DSH セッションは履歴であり、バージョン管理やバックアップの代わりではありません。

text
演習の HANDOFF.md を書いてください。目標、変更ファイル、元の失敗、実際に実行した正確なコマンドと結果、残る問題、次の検証を含めます。認証情報や未実行検証の成功主張は含めないでください。新しいセッションがメモと現在のファイルで続けられる内容にしてください。
具体的な引き継ぎ依頼

観察した失敗に合わせて復旧する

  1. 01

    コマンドが動かない

    Node バージョン、現在ディレクトリ、選択ワークスペースを確認。実行ファイル不足や権限拒否をコード変更で隠さず、先に環境を直します。

  2. 02

    テストや無関係ファイルが変更された

    停止して試行結果を保存し、diff を読みます。影響した演習ファイルだけを原本から戻し、条件を再提示します。

  3. 03

    モデルやプロバイダーが使えない

    ファイルとメモを残し、プロンプト外で設定を直します。同じ条件で再開または新セッションを開始。API エラーをコードテスト成功と扱ってはいけません。

bash
cp report.mjs report.attempt.mjs
cp report.original.mjs report.mjs
node --test report.test.mjs
試行結果を保存し、演習ファイルだけを復元する

元の 2 件の失敗が再発すれば、意図した復元確認です。report.attempt.mjs は比較用に残します。実際のリポジトリではクリーンなブランチや作業ツリーを使い、対象ファイルごとに確認して復元してください。本例の上書きコマンドを無関係な作業に使わないでください。

有効だった手順を小さな Skill にする

演習後に調査、再現、修正、テスト、引き継ぎを記録します。DSH のローカル探索には .dsh/skills と .agents/skills があり、名前と優先順位が影響します。Skill は手順であり、新しいシステム権限ではありません。探索対象にする前に読み、コマンドを限定し、自動化をうたうだけの未知の拡張を読み込まないでください。

具体的な次の一歩へ

一次資料となる公式文書を読む

よくある質問

変更を行う前に

フォーマット、互換性、証拠、ロールバックに関する回答

このガイドでは何を確認しますか?

このガイドの対象:固定した DSH Alpha ソースと、コンテキスト管理・Agent 評価の一次資料、ローカルで実行した 2 つの合成 Node サンプル、参考修正、対象ファイルの復元、モデルの比較ベンチマークや外部サービスの実業務結果は主張しません

最初に何をすべきですか?

注文合計を直し、設定変更を無視するキャッシュを直す。この 2 つで再現可能な習慣を作ります。各課題に入力、観察できる失敗、コピー用プロンプト、独立検証があります。大事な作業の前に、使い捨てプロジェクトで練習しましょう。

最も重要な境界は何ですか?

2 つの Node 例はローカルで実行し、初期の失敗、参考修正、report.mjs モジュールの元の内容への復元を確認しました。DSH の手順はコミット d347e703908d0406b7a7ef80e3a0e594d86b2215 の 0.1.3-alpha.1 に対応します。設定済みモデルで試す演習であり、モデルによる実行結果を主張するものではありません。

小さな修正にも長い計画が必要ですか?

この例では短い診断と明確なテストで十分です。大きな課題は、各段階にレビュー可能な成果と検証を持たせて分けます。

完了メッセージの後に何を残しますか?

diff、正確な出力、期待値、制約、原本です。自分でもテストしてください。説明文だけでは検証になりません。

注意するよう指示すればサンドボックスは不要ですか?

いいえ。指示は意図を示します。実行器、プロセス権限、設定された OS 境界が実際のアクセスを決めます。

学習を続ける

検証済みの証拠から続ける

公開済みのアーティファクトを比較するか、インストール手順に戻ります。