Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/add-a-platform/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ web-wasm を足し、前者に足し忘れた** —— ローカルの全レー

| 形 | 実例 |
| --- | --- |
| platform **名**のリスト | `.github/workflows/release.yml` に 2 つ(matrix と合わせて同一ファイルに 3 つ) |
| platform **名**のリスト | `.github/workflows/release.yml` に 2 つ(matrix と合わせて同一ファイルに 3 つ)。**`ci-unity.yml` にも 2 つある** —— `unity` job と `tarball` job が、それぞれ「重ねる他 platform」を名前で並べる(2026-09-11 に 2 つ目が増えた。**どちらも fail-closed** で、足りなければ合図が置かれず検査が赤くなる) |
| Unity の `BuildTarget` | `PluginGatingTests.cs` の `Slots` |
| workflow の matrix | 各 `.yml` |

Expand Down
27 changes: 21 additions & 6 deletions .claude/skills/milestone-complete/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,27 @@ pwsh tools/dev.ps1 test-unity-graphics # M7a。GPU に依る RenderTexture の
pwsh tools/dev.ps1 benchmark # M7a。上の 2 レーンから OCVU_BENCH: を集める
```

**下の 2 つはどの workflow からも走らない**(`test-unity-tarball` /
`test-unity-web` も同じである)。**CI に配線されていないレーンは、判定のときだけが
唯一の実行機会である** —— 回さなければ誰も回さない。
`tests/UnityProject/Assets/Tests/EditMode/CiVisibilityTests.cs` が
「CI から見えないテスト」を名指しで固定しているが、それが固定しているのは
まさに `test-unity-graphics` の中身である。
**2026-09-11 より前は、下の 2 つと `test-unity-tarball` がどの workflow からも
走っていなかった**(`test-unity-web` は例外で、**M6 から `web-e2e` job が
同じところを見ている** —— そちらは 2026-09-03 である)。いまは `ci-unity.yml` に
対応するレーンが在る(`Graphics` / `benchmarks` / `tarball` / `web-e2e`)ので、
**「判定のときだけが唯一の実行機会」ではなくなった** —— ただし
**結び付きの強さは 4 つで違う。** `tarball` job は
`./tools/dev.ps1 test-unity-tarball -PrepareOnly` を**実際に呼ぶ**が、
`web-e2e` は `dev.ps1` を通さずスクリプトを直接呼び、`Graphics` /
`benchmarks` はその中間である(Unity の起動はいずれも game-ci)。
したがってローカルで回す意味は残る: **同じ判定 script を通る
別の経路で、同じものが見えるかを突き合わせられる。**

**「CI に配線されていないレーンは、判定のときだけが唯一の実行機会である」
という規則そのものは生きている。** **加えて、配線しただけでは足りない** ——
上の 4 つのうち**必須チェックなのは `web-e2e` だけ**で、残る 3 つは
赤くても merge を止めない。
**判定のときは「CI が走らせているか」と「CI が止めるか」を別々に確かめること。** 配線が無いレーンを作ったら、この一覧に
足すこと —— **走らないレーンは腐る。** 実例が 2 つある(どちらも
`test-unity-tarball`): M4 で期待する binary の数が `3` と直書きされたまま
残り、M7a で Graphics の除外が抜けた。**どちらも無関係な作業の途中で
1 度手で回すまで誰も知らなかった。**

**`test-unity-player` は、このマシンでは後始末段階でハングする既知の欠陥を持つ**
(`Stop-UnityTestPlayers` の中の `Get-CimInstance`。roadmap の
Expand Down
40 changes: 39 additions & 1 deletion .claude/skills/prove-a-check-works/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,9 @@ cmd | tail -3; echo $? # これは tail の終了コード
`-testCategory '!Graphics'` を渡しておらず、`-nographics` の下で
`[Category("Graphics")]` の 6 件が skip されずに fail した(実測: 除外前は
66 件中 6 件失敗・exit 1、除外後は 59 件全通過・exit 0)。**直るまで CI は
緑のままだった** —— このレーンはどの workflow からも走らないからである。
緑のままだった** —— **当時**このレーンはどの workflow からも走らなかったからである
(2026-09-11 に `ci-unity.yml` の `tarball` job として配線した。**ただし必須
チェックではないので、いまも赤は merge を止めない**)。
**教訓は「一度直したから大丈夫」ではない: 走らないレーンは、直した後も
同じ速さで腐る。** なお `unity-probe.yml` にも同じ抜けが**分かっていて
残してある**(意図的な例外は、意図的だと書いてあれば腐らない)。
Expand Down Expand Up @@ -832,6 +834,41 @@ M5 の `calib` で、実装者と再レビュアーが同時に同じソース
コメントには「**契約を成立させている唯一のものとして残してあるが、その必要性を
示す再現テストはまだ無い**」と書き、**安全装置として残す判断そのものを記録した。**

## 「原理的に無理」と書いた前提を、誰も測っていないことがある

**2026-09-11 に踏んだ。** 3 つの文書(`CLAUDE.md` / `docs/roadmap.md` /
`docs/performance.md`)が揃って「CI のレーンは `-nographics` で走るので、
GPU に依る経路は CI では確かめられない」と書いていた。**その根拠として
挙がっていた実測は、すべてローカルのもの**(`tools/dev.ps1` が
`-nographics` を渡す)で、**CI が何を渡しているかは 1 度も測っていなかった。**

実物は逆だった。`game-ci/unity-test-runner` がコンテナの中で呼ぶ
`unity-editor` は `xvfb-run -ae /dev/stdout "$UNITY_PATH/Editor/Unity"
-batchmode "$@"` で、**`-nographics` を付けない。** レーンを 1 本足して
投げたら 7 件とも通り、**そのマイルストーンで「CI からは原理的に見えない」
と判定していた経路が、丸ごと CI に載った。**

**この形は、失敗した検査より見つけにくい。** 検査は赤くなれば気づくが、
**「その検査は書けない」という結論は、書かれなかったコードとして残る**ので
何も赤くならない。しかも 3 箇所に書かれていたことが、確からしさの錯覚を
強めていた —— **3 箇所は 3 つの根拠ではない。1 つの根拠の 3 つの写しである。**

**見分け方**: 「原理的に」「構造上」「〜できない」と書いてある制約を見たら、
**その根拠が測定なのか推論なのかを問う。** 測定なら、**何を測ったのか**を
問う —— 上の例では測定自体は本物だったが、**測った対象がローカルの
`dev.ps1` で、主張していた対象は CI だった。**

**やり方**: 制約が正しければ赤くなり、間違っていれば緑になるレーンを
**実際に足して投げる。** このリポジトリには先例がある
(`unity-probe.yml` は「結論を出すための道具」として存在し、
`game-ci は macOS を支えない` を実測で確定させた)。**推測を文書に
書き足すより、1 回投げるほうが安い。**

**逆向きの陳腐化にも同じ手が要る。** 「まだできていない」と書いた制約が
解消されたとき、**誰も赤くならない**のは同じである(`nightly.yml` が
毎日動いているのに「schedule でまだ 1 度も走っていない」と書かれ続けた例が
このリポジトリにある)。

## やってはいけないこと

- 通ったことを、検査していることの証拠として報告する
Expand All @@ -844,6 +881,7 @@ M5 の `calib` で、実装者と再レビュアーが同時に同じソース
- 壊れていても同じ値を返す述語(常に true を返す能力照会など)で assertion を書く
- SKIP を合格として数える
- **負の対照が取れなかったのに、取れたかのように書く**(上の節)
- **「原理的に無理」と書かれた制約を、根拠を問わずに引き継ぐ**(測定なのか推論なのか、測定なら何を測ったのかを問う。上の節)

## 参照

Expand Down
Loading
Loading