# 実験#02 の作業記録（AIが書く・各段階の結果）

数値目標は `targets.json`（commit f82df51 で固定。ゲームを作る前）。

## 1. 候補登録と人の選択

- 88d1ec3：AIが企画した候補を登録（created_by: ai・candidate）
- f4455e6：運営者（人）が「GO」と答え、実験#02として選んだ（selection・by: human）
- f82df51：ゲームを作る前に数値目標を固定し、GitHub に push した。実験を開始（experimenting）

## 2. v1（975f30d）

AIが考えたゲーム「さかさまラン」。タップでボールが天井⇔床を行き来し、上か下から来る壁をよける。進むほど速くなる。よけた壁の数がスコア。
v1 とボット（`tools/experiment-002/bots.js`）は、測る前に commit した。

### v1 の数字（`bots-v1.json`。各ボット200回）

| | ランダムに押すボット | 考えて押すボット |
|---|---|---|
| プレイ時間の中央値 | 2.7秒 | 5.2秒 |
| 5秒未満で終わった割合 | 93.5% | 43.0% |
| 平均スコア | 0.39 | 2.72 |

| 目標 | 結果 | 判定 |
|---|---|---|
| M1 プレイ時間の中央値 20〜60秒 | 5.2秒 | 満たさない |
| M2 5秒未満が10%以下 | 43.0% | 満たさない |
| M3 平均スコアが2倍以上 | 約7.0倍 | 満たす |

### 何が悪かったか（AIの分析）

考えて押すボットが死んだ200回を調べた（ゲームとボットのファイルをそのまま使った集計。証拠ではなく分析）。

- 止まっていて、向かった先の壁に当たった：47回
- 切りかえの途中で当たった：153回（向かった先の壁 87回／離れようとした壁 66回）

200回すべてが「反応が間に合わない」死に方だった。壁と壁のあいだを通れる時間は、はじめの速さでも 0.58〜1.34 秒しかない。
一方で、ボットは見てから反応するまでに 0.15〜0.35 秒かかり、切りかえて壁の外に出るまでにさらに 0.17 秒かかる。
壁が交互に出ると、1つよけてすぐ次の判断が必要になり、最初の数枚の時点でほぼ間に合わない。
「進むほど難しくなる」はずが、**最初から難しすぎて、難しさが上がる前に終わっている**。

腕の差（M3）は出ているので、ゲームの仕組みそのものは残し、間隔と速さを直す。

## 3. v2 の直し方（測る前に決めて commit）

考え方：死んだ原因は「壁と壁のあいだの時間が、反応の遅れ＋切りかえの時間より短い」こと。
あいだの時間 ＝（間隔 − 壁の幅 − ボールの直径）÷ 速さ。これを、はじめは十分長く、速くなるにつれて足りなくなるようにする。

| 調整値 | v1 | v2 | 理由 |
|---|---|---|---|
| 壁の間隔 | 170〜300px | 260〜400px | はじめのあいだの時間を 0.58秒 → 1.25秒以上に |
| はじめの速さ | 170 | 150 | 同上 |
| 速くなる量（1秒ごと） | 6 | 8 | はじめをやさしくした分、難しさが上がるのを早める |
| 切りかえの速さ | 1100 | 1300 | 壁の外に出るまで 0.17秒 → 0.14秒 |
| いちばん速いとき | 420 | 420 | 変えない |

見込み（測る前の予想）：反応の遅れが大きいとき（0.35秒）でも、速さがおよそ 376 になるまで（約28秒）は間に合う計算。
プレイ時間の中央値は 20〜40秒くらいになると予想する。v2 は v1 から調整値だけを変え、操作とスコアの数え方は変えていない。
v2 を測る前に、別の調整値を試して数字を見ることはしていない。

## 4. v2 の数字（`bots-v2.json`。各ボット200回）

| | ランダムに押すボット | 考えて押すボット |
|---|---|---|
| プレイ時間の中央値 | 3.0秒 | 8.6秒 |
| 5秒未満で終わった割合 | 86.0% | 22.0% |
| 平均スコア | 0.44 | 4.14 |

| 目標 | v1 | v2 | 判定（v2） |
|---|---|---|---|
| M1 プレイ時間の中央値 20〜60秒 | 5.2秒 | 8.6秒 | 満たさない |
| M2 5秒未満が10%以下 | 43.0% | 22.0% | 満たさない |
| M3 平均スコアが2倍以上 | 約7.0倍 | 約9.5倍 | 満たす |

良くはなったが、予想（中央値 20〜40秒）から大きく外れた。

## 5. 予想が外れた理由：ボット（物差し）の不具合が見つかった

v2 の死に方を調べたところ、ゲームではなく**考えて押すボットのほうに不具合**があった（分析。ゲームとボットのファイルをそのまま使い、bots.js の結果と200回すべて一致することを確かめたうえで集計）。

- ボットは、タップしたあと「前の遅れ」の分だけ待ってから、次は「新しい遅れ」の分だけ古い様子を見て判断する
- 新しい遅れが前の遅れより長いと、**自分がタップする前の様子**を見てしまい、「まだ壁の側にいる」と思ってもう一度タップする。これで切りかえを取り消してしまう
- 考えて押すボットのタップのうち、この「取り消してしまうタップ」は v1 で 31.3%（974回中305回）、v2 で 32.1%（1604回中515回）
- このタップから1秒以内に死んだプレイは、v1 で 200回中180回、v2 で 200回中192回

つまり、M1・M2 が満たせない主な原因は、ゲームの難しさではなく、**AIが作った物差し（ボット）がAI自身の判断を誤らせていた**こと。
v1 の分析（2.）でも「反応が間に合わない」と結論したが、その多くはこの不具合によるものだった可能性が高い。

## 6. ここで止めた理由

固定した決まり（targets.json）では「考えて押すボットの判断のしかたは v1 で決め、v2 以降は変えない」「版は最大 v3」としている。

- このままボットを変えずに v3 を作ると、壊れた物差しに合わせてゲームを直すことになり、実験の意味がなくなる
- ボットを直すと、固定した決まりを変えることになる

どちらにするかは人間が決めることなので、v3 は作らずに止めた。v1・v2・ボットのファイル・数字はすべてそのまま残している。

## 7. 人の判断：続け方 A（ボットの不具合だけを直して、v1・v2 を測り直す）

運営者（人）が「A で進める」と判断した。条件：
ボットの不具合だけを直す・v1 と v2 を同じ条件・同じ乱数の種で測り直す・その結果を基準に、残り1回だけ v3 を作る。
固定した数値目標（targets.json）・成功条件・v1/v2 のゲーム・版の上限（v3）・人間の A/B 評価の方法と割り当て方法は変えない。

**この実験では、測定器（ボット）の不具合が途中で見つかり、ボットだけを直して測り直した。** これは実験#02 の重要な出来事として残す。

### 修正前（そのまま残す・上書きしない）

| | ファイル | commit |
|---|---|---|
| もとのボット（不具合あり） | `tools/experiment-002/bots.js` | 975f30d で固定 |
| v1 の旧結果 | `bots-v1.json` | 216f2b4（測ったときの HEAD は 975f30d） |
| v2 の旧結果 | `bots-v2.json` | 9447a78（測ったときの HEAD は 704b85e） |

### 修正版のボット（`tools/experiment-002/bots-fixed.js`）

- 直したのは、考えて押すボットの判断の条件1つだけ：「見えている様子が、自分の最後のタップより前のものなら判断しない」
- 反応の遅れ（0.15〜0.35秒）・判断のしかた・ランダムに押すボット・乱数の種は、もとのボットと同じ
- 確認：ランダムに押すボットは、v1・v2 とも 200回すべて、もとと同じ結果になった。修正版の考えて押すボットの「取り消してしまうタップ」は 0回
- 測る道具（`run-bots.mjs`）は、修正版を使うときに結果を `bots-fixed-<版>.json` という別のファイルに保存するようにした。旧結果のファイルには書き込まない

この修正は、v1・v2 を測り直す前に commit した。

## 8. 修正版のボットで v1・v2 を測り直した結果（`bots-fixed-v1.json`・`bots-fixed-v2.json`）

同じゲーム（v1・v2 は変えていない）・同じ乱数の種（1〜200）・同じ測り方。変えたのはボットだけ。

| 考えて押すボット | v1（旧） | v1（修正版） | v2（旧） | v2（修正版） |
|---|---|---|---|---|
| プレイ時間の中央値 | 5.2秒 | **21.2秒** | 8.6秒 | **78.8秒** |
| 5秒未満で終わった割合 | 43.0% | **0%** | 22.0% | **0%** |
| 平均スコア | 2.72 | 19.66 | 4.14 | 100.3 |
| 300秒で打ち切り | 0回 | 0回 | 0回 | 2回 |

ランダムに押すボットは、旧・修正版で同じ（v1 平均スコア 0.39、v2 0.435）。

| 目標 | v1（修正版） | v2（修正版） |
|---|---|---|
| M1 中央値 20〜60秒 | 21.2秒 ○ | 78.8秒 × （長すぎる） |
| M2 5秒未満が10%以下 | 0% ○ | 0% ○ |
| M3 平均スコアが2倍以上 | 約50倍 ○ | 約231倍 ○ |

### 分かったこと

- **v1 は、正しく測れば最初から目標をすべて満たしていた。** 「最初から難しすぎる」という v1 の分析（2.）は、ボットの不具合による誤りだった
- **v2 の改良は、壊れた物差しに合わせた直しだったため、正しく測ると「やさしすぎる」方向に行き過ぎていた**（中央値 78.8秒）
- AIは、自分の作った物差しの数字を信じて、ゲームを逆の方向に直していたことになる

### 固定した決まりとの食い違い（記録）

targets.json の決まりには「版ごとに目標を判定し、すべて満たしたらそこで改良をやめる」とある。修正版のボットで判定すると v1 がすべて満たすので、この決まりどおりなら v2 は作らなかったことになる。
一方で、人（運営者）は、修正版の結果が出る前に「修正版の結果を基準に、残り1回だけ v3 を作る」と指示した。
AIは人の指示に従って v3 を作る。ただし、この食い違いはここに残し、A/B 評価でどの版を比べるかは人が決める。

## 9. v3 の直し方（最後の改良。修正版のボットの結果を基準に、測る前に決めて commit）

### 何が問題だったか

修正版のボットで測ると、v2 は「やさしすぎる」（中央値 78.8秒。目標は 20〜60秒）。
v2 では速さが約34秒で上限（420）に達し、そこから先は難しさが上がらない。考えて押すボットは、上限の速さのまま長く生き残り、まれな運の悪い並びで死ぬ。
つまり、**難しさが途中で止まっている**ことが、長すぎる原因。

### 何を変えたか（v2 → v3。はじめのやさしさは v2 のまま）

| 調整値 | v1 | v2 | v3 | 理由 |
|---|---|---|---|---|
| 速くなる量（1秒ごと） | 6 | 8 | 10 | 難しさを早く上げる |
| いちばん速いとき | 420 | 420 | 560 | 上限で難しさが止まらないようにする |
| 壁の間隔・はじめの速さ・切りかえの速さ | | | v2 と同じ | はじめの数秒で終わらない（M2）ことは保つ |

### 見込み（測る前の予想）

速さ 420 に達するのが約27秒（v2 は約34秒）になり、その後も上がり続ける。中央値は 30〜45秒くらいになると予想する。
v3 を測る前に、別の調整値を試して数字を見ることはしていない。操作・スコアの数え方・ボット（修正版）は変えていない。

（記録：v3 の最初の commit 5ce3595 では、版の名前を書きかえる手順の誤りで v3 の index.html が空だった。c0a4bd0 で、v2 のページの「v2」を「v3」にしただけのものに直した。game.js は 5ce3595 のまま。v3 はこの修正のあとで初めて測った）

## 10. v3 の数字（`bots-fixed-v3.json`。修正版のボット・各200回）

| 考えて押すボット | v1（修正版） | v2（修正版） | v3（修正版） |
|---|---|---|---|
| プレイ時間の中央値 | 21.2秒 | 78.8秒 | **37.9秒** |
| 5秒未満で終わった割合 | 0% | 0% | **0%** |
| 平均スコア | 19.66 | 100.3 | 37.46 |
| ランダムなボットの平均スコア | 0.39 | 0.435 | 0.43 |

| 目標 | v3 | 判定 |
|---|---|---|
| M1 中央値 20〜60秒 | 37.9秒 | 満たす |
| M2 5秒未満が10%以下 | 0% | 満たす |
| M3 平均スコアが2倍以上 | 約87倍 | 満たす |

予想（中央値 30〜45秒）の範囲に入った。v2 → v3 で中央値は 78.8秒 → 37.9秒。

## 11. 成功条件の状態（v3 の測定まで）

| 成功条件（企画書のまま） | 状態 |
|---|---|
| 1. スマホ幅（375px）でエラーなく遊べる | v1・v2・v3 とも、375 / 430 / 1280px で表示・タップ操作・ゲームオーバーまで、エラーなし（作業環境のブラウザで確認） |
| 2. 各版でボットが200回以上遊び、記録が残っている | v1・v2：もとのボット・修正版のボットとも各200回。v3：修正版のボットで各200回 |
| 3. 最後の版で、事前に決めた数字の目標をすべて満たす | v3 は修正版のボットですべて満たす。ただし、もとのボットに不具合があり、ボットを直して測ったという経緯つき |
| 4. 人間が、どちらか知らないまま、最後の版を最初の版より面白いと評価する | まだ（人間の A/B 評価の前で止めている） |

## 12. ここで止めた（人間の A/B 評価の前）

- 修正版のボットで測ると v1 も目標をすべて満たしている。v1 と v3 は、どちらも数字の上では目標の範囲（中央値 21.2秒と 37.9秒）
- 企画書どおりの比較は「最初の版（v1）と最後の版（v3）」。ただし 8. の食い違い（決まりどおりなら v1 で改良をやめていた）もふまえて、比べる版は人が決める
- A/B の割り当ては、人が遊ぶ前にハッシュ値だけを commit して固定する（targets.json の決まりどおり）。まだ作っていない

## 13. 人間の A/B 評価の準備（割り当てを固定）

人（運営者）が、比べる版を **v1（AIが作った最初の版）と v3（AIが自動測定をもとに改良した最終版）** に決めた。

- どちらを A・B にするかは、AI が暗号用の乱数（Python の secrets）で決めた
- 割り当ての中身（どちらがどちらか と salt）はこの commit に入れず、sha256 の値だけを `ab-commitment.json` に記録した
- A・B のページ（`/lab/experiment-002/a/`・`/lab/experiment-002/b/`）のゲームは、元の版の game.js から、版の名前と調整値の横のコメントだけを消したもの。修正版のボットで200回ずつ動かし、元の版とまったく同じ結果になることを確かめた（どちらが元のどの版かは表示せずに確かめた）
- 375 / 430 / 1280px でエラーなく遊べることを確かめた
- この commit のあと、評価が終わるまで、割り当て・ゲームの内容・難しさ・数値は変えない

## 14. 人間のブラインド評価の結果（人の報告。対応表を明かす前に記録）

| | 評価（5段階） |
|---|---|
| A | **1**（つまらない） |
| B | **2**（あまり面白くない） |

- 評価者は運営者（人）**1人**。スマートフォンで A・B を各3回遊んだ（人の報告）
- 評価者は、評価の前に A/B の対応表を見ていない（人の報告）
- 割り当ては commit c35b958 で固定したまま。評価の値は報告されたまま記録し、変更・補正していない
- 感想・スコアの報告はなし
- この時点では、A・B がどちらの版かは記録していない（次の commit で明かす）

## 15. A/B の対応表の開示（人間の評価を記録した 4ad357e のあと）

- 開示した文字列：`A=v3;B=v1;salt=8f0b4a067dd821316476790be8a475c3`
- この文字列の sha256 は `dddf1174…f1fe759d` で、commit c35b958 の `ab-commitment.json` に記録した値と**一致**（`ab-reveal.json`）。割り当ては評価の前から変わっていない

| ページ | 版 | 人間の評価（5段階・人の報告） | 考えて押すボットの中央値（修正版） |
|---|---|---|---|
| A | **v3**（AIが自動測定をもとに改良した最終版） | **1** | 37.9秒 |
| B | **v1**（AIが作った最初の版） | **2** | 21.2秒 |

### 数値上の改善と人間の評価は一致したか

**一致しなかった。** 人間は、最後の版（v3）より最初の版（v1）を面白いと評価した。

- 成功条件4「人間が、どちらか知らないまま、最後の版を最初の版より面白いと評価する」は満たさない
- 企画書の失敗条件には「人間が最初の版のほうを面白いと評価する」がある。今回はこれに当たる
- （企画書には「成功条件の3までなら一部確認」という書き方もある。最終の判定は、実験記録をまとめるときに人の確認のうえで決める）
- 2つとも評価は低い（1 と 2）。評価者は1人で、差は1段階だけ。どちらの版も「面白い」とは評価されていない
- 修正版のボットで測ると、v1 も v3 も数値目標をすべて満たしていた。数値目標を満たすことと、人が面白いと感じることは、この実験では結びつかなかった
