Skip to content

ci: CI が見ていなかった 4 レーンを載せる(GPU 経路・dnn profile・tarball・benchmark) - #76

Merged
ayutaz merged 9 commits into
mainfrom
ci/close-coverage-gaps
Sep 12, 2026
Merged

ayutaz merged 9 commits into
mainfrom
ci/close-coverage-gaps

Conversation

@ayutaz

@ayutaz ayutaz commented Sep 11, 2026 •

Copy link
Copy Markdown
Owner

何をしたか

CI が見ていないものを洗い直したところ、穴の 1 つは穴ではなかった。

CLAUDE.md / docs/roadmap.md / docs/performance.md の 3 つが同じことを書いていた
—— 「CI のレーンは -nographics で走るので、RenderTexture の画素を運ぶ経路は
CI では確かめられない」。根拠として挙がっていた実測はすべてローカルの dev.ps1
側のもので、CI が何を渡しているかは 1 度も測っていなかった。

実物はこうだった(game-ci/docker の images/ubuntu/editor/Dockerfile):

xvfb-run -ae /dev/stdout "$UNITY_PATH/Editor/Unity" -batchmode "$@"

-batchmode は付くが -nographics は付かない。 ただしコンテナに GL の実装が
在るかは Dockerfile からは決まらない(unityci/base は --no-install-recommends で
libglu1 しか入れていない)ので、推測で書かず、レーンを足してそれ自体を実測に
使った。

CI に載せたもの

足したもの それまでの状態
Graphics レーン ローカル専用。[Category("Graphics")] のテストは CI から完全に見えなかった
DnnEditMode / DnnStandalone レーン どの workflow も OCVU_PROFILE_DNN を立てていなかった。Unity の中で dnn の assembly がコンパイルされ、IL2CPP の stripping を生き延びることは人が手で 1 回確かめたきり
tarball job dev.ps1 test-unity-tarball は M3 から在るのに、どの workflow からも走っていなかった(roadmap が M4 の時点で「CI に載せるのは別作業」と書いて置いていた)
benchmarks job dev.ps1 benchmark も同じ。しかも唯一 Unity を持つ開発機では内部の test-unity-player がハングして完走しない

実測

主張 根拠
コンテナに実物の graphics device が在り、AsyncGPUReadback も動く run 34612557397 —— Graphics 7 passed。AGraphicsDeviceIsPresent / SyncReadbackProducesTheExpectedPixels / VerticalFlipIsApplied / AsyncMatchesSync / TakingTheMatTwiceIsRejected がすべて通った
dnn が Unity でコンパイルされ、stripping を生き延びる 同 run —— DnnEditMode で OCVU_PROFILE_DNN is defined and the dnn assemblies are compiled が 3 assembly 分出力、DnnStandalone(stripping 済み IL2CPP Player)で AbiSurfaceDnnPlayerTests.EveryDnnEntryPointIsReachable が Passed
配る形の tarball が実際に導入できる run 34613947274 —— native plugins present: 6 [ と gating 4 件、resolved from file:../../upm/com.ayutaz.opencv-unity-native.tgz(ディレクトリ参照ではなく tarball で解決されたこと)
benchmark を CI が publish できる run 34615630480
ローカルのレーンが壊れていない このマシンで test-unity-tarball が全部入り 59 passed / exit 0、dev.ps1 test が exit 0

途中で見つかった欠陥 3 件(CI 追加とは別)

  1. first_pinvoke=0 —— CI の Linux Player で分解能不足。収集器は 0 を「測定が
    効いていない」として落とすので、このままでは benchmark を CI で集められない。
    測定が壊れていたのではなく、マイクロ秒では足りなかった(既に読み込まれた
    後の 1 回の呼び出しで、1 µs に満たない)。ナノ秒にし、単位をキー名に入れた。
  2. latest.json の単位が嘘だった —— unit: 'microseconds per call' を全 entry
    共通で持っており、CI の出力は first_pinvoke_ns = 400 us になっていた。単位を
    entry ごとに持たせ、接尾辞 _ns で決まる規約にした。
  3. tools テスト 4 本が、途中の例外を静かな合格にしていた —— 'Continue' +
    trap 無しで、終了エラーが出ても残りを飛ばして exit 0。負の対照を取ろうとして
    対照そのものが素通りして発覚した。
    PackageRelease.Tests.ps1 が持っていた
    trap を 4 本に足し、機械が見る検査も足した。

レビュー(3 巡)

PR 前に 3 体の AI レビューを回した(CI 機構 / 文書の真実性 / 修正差分の再レビュー)。
Critical 3 件・Important 8 件・Minor 30 件超。

差し戻された判断が 1 件: CiVisibilityTests を削除したが、戻した。削除の
根拠にした docstring は「graphics レーンを CI に配線できたら消してよい」で、
実際に必要な条件は「merge を止めるようになったら」だった。Unity Graphics (Linux)
は非必須なので、[Category("Graphics")] を付ける行為はいまも「必須レーンから、
赤くても止めないレーンへ無言で移す」ままである。

私が作り込んだ誤りが 1 件: 「この 4 つの CI check はどれも必須ではない」と
3 箇所に書いたが、Web browser E2E は必須である。しかも README.md は 50 行下で
自分で逆のことを書いており、同じ節の中で矛盾していた。

レビューの指摘 1 件は実測で覆した: 「& で .ps1 を呼んでも $LASTEXITCODE は
設定されない」——設定される(exit 7 する .ps1 をパイプ越しに呼んで 7)。いったん
外した検査を戻した。「仮説のまま直さない」はレビューの指摘にも同じだけ掛かる。

負の対照

検査 壊し方 結果
matrix 要素ごとの customParameters tarball の除外を '' に CAUGHT(旧版は MISSED)
同上 DnnEditMode の除外を '' に CAUGHT
同上 Graphics の肯定形を消す CAUGHT
同上 testMode を未知の値/行ごと削除 CAUGHT(レビューが見つけた穴)
native plugins present: N 5 に書き換え CAUGHT
benchmark の単位 _ns を無視/共通 unit に戻す/値だけの map に戻す 3 通りとも CAUGHT
扱えない単位の接尾辞 *_ms / *_sec を流す CAUGHT(正当な key は落とさないことも確認)
tools テストの trap 例外を注入/trap を削除 4 本とも CAUGHT

意図的にやっていないこと

  • 必須チェックにしていない。 足した 5 本はどれも非必須のままである
    (本数は PR ci: CI が見ていなかった 4 レーンを載せる(GPU 経路・dnn profile・tarball・benchmark) #76 で実測した —— 完了後の gh pr checks は 42 件、必須 24 件、
    差は 18 本。この数字は 2 度書き直した: 最初は算術で 18 と書き、次に
    「測って 12」と直し、それが走行中の測定だったので 18 に戻した。game-ci の
    * results check は各 job の終盤に作られるので、途中で数えると出てこない。
    「数は写さず測る」は正しいが、測る時刻も測定の一部である。)このリポジトリの手順は「安定して緑になったのを見てから
    昇格する」で、Web の 3 本は 11 本の PR を見てから昇格した。いまの実績は 1 ブランチ
    上で多くても 3 run
    (benchmarks は 1 run)。帰結を隠さず書いた: いまは赤くても
    merge を止めない。
    昇格の条件は roadmap の「GPU 経路を CI に載せる」にある。
  • Player(IL2CPP)側の GPU 経路は閉じていない。 game-ci の run_tests.sh は
    Standalone Player を -nographics で起動しており、その指定は action の中にあって
    こちらからは外せない。
  • 実機は変わらず 1 度も動かしていない。 Android / iOS / dnn のいずれも。
  • Windows の Unity EditMode レーンは足していない。 2026-08-31 に windows-2022 で
    33 件通る実測があり、PluginGatingTests は現在 Linux でしか走っていないので価値は
    あるが、Windows job には Linux の .so が無い(plugin job が作らず、unity job
    がコンテナの中で自分でビルドしている)ので、構造の変更が要る。

文書

「CI に配線されていない」と書いた箇所を 14 箇所直した。 このブランチが skill に
書いたばかりの教訓(3 箇所は 3 つの根拠ではなく、1 つの根拠の 3 つの写しである)が
そのまま当たった —— 写しを 3 つ直したが、実際には 14 あった。.ps1 のコメントや
実行手順(配布 step 7)にも在り、.md だけを洗うと足りないという
milestone-complete skill の記録の 5 例目になった。

prove-a-check-works に新しい節を足した ——
「原理的に無理」と書いた前提を、誰も測っていないことがある。
検査は赤くなれば気づくが、「その検査は書けない」という結論は書かれなかった
コードとして残る
ので何も赤くならない。

**game-ci の Editor は -nographics で走っていない**と実測で分かった ――
コンテナの unity-editor wrapper は

    xvfb-run -ae /dev/stdout "$UNITY_PATH/Editor/Unity" -batchmode "$@"

で、仮想 X の下から -nographics 無しで起動する(game-ci/docker の
images/ubuntu/editor/Dockerfile)。したがって
「GPU に依る経路は CI では原理的に無理」という前提は、少なくとも
Editor については崩れている。

ただし unityci/base は --no-install-recommends で libglu1 しか入れて
おらず、Mesa の実装が入るかは Dockerfile からは決まらない。
**仮説のまま書かず、このレーンそのものを実測に使う。**

足したレーンは 3 つ:

- Graphics      … -testCategory Graphics(既存レーンの補集合)
- DnnEditMode   … OCVU_PROFILE_DNN を立てて EditMode
- DnnStandalone … 同じ define で IL2CPP Player(stripping 済みの実物)

ProfileGatingTests の 3 件を「define が無ければ無い」から
**「define の有無と一致する」**に変えた。1 回の実行では正の方向へ
届かないという同 class の断りは正しく、届かせる方法はレーンを分ける
ことだけである。どちらの分岐を通ったかは TestContext.WriteLine に
書き、CI は -RequireOutput でその行を要求する ―― 判定を両方向に
したことで、テスト名だけを要求する検査は define を立て損ねた
レーンを緑のまま通すようになるため。
test-unity-tarball は M3 から在るのに **どの workflow からも走っていな
かった**。roadmap は M4 の時点で「CI に載せるのは別作業である」と書いて
そのまま置いており、その間に 2 度壊れた(M4 で binary の数が 3 直書き、
M7a で Graphics 除外の抜け)。どちらも無関係な作業の途中で 1 度手で回す
まで誰も知らなかった。

載せ方: プロジェクトの作り方を dev.ps1 に寄せたまま Unity の起動だけを
game-ci に渡す。`-PrepareOnly -WorkDir` を足し、

  - native はビルドし直さない(host の新しい glibc で上書きすると
    v0.1.0 の欠陥をそのまま再現する)
  - Unity を探さない(runner には無い)
  - manifest の file: 参照を**相対パス**にする(コンテナでは
    ワークスペースが別のパスに mount されるので絶対パスは解決できない。
    ローカルも同じ形にする ―― 分けると CI で通る形を一度も試さないまま
    になる)

合図は書かずに**届いたかを見る**。dev.ps1 が木から導出して置くので、
書き直すと導出が壊れていても合図だけ在る状態を自分で作ることになる。

あわせて tools/tests/OpenCvConfig.Tests.ps1 の 4 つの assertion を
合計から要素ごとの判定に変えた。レーンが増えて数が合わなくなったが、
**数を書き換えるのは誤り** ―― 「非空の requireTest がちょうど 1 本」は
レーンが 1 本しかなかったことの言い換えで、どの 1 本かは保証していない。
いま見るのは:

  - gating を要求する行がちょうど 1 本(既存)
  - 全 platform を報告させる行がちょうど 1 本(既存)
  - **否定形の -testCategory を使う行は 1 本残らず正本と一致**
  - **肯定形はちょうど 1 本で、否定形の補集合**

最後の 1 つは新しい ―― Graphics と !Graphics が補集合でなくなると、
どちらのレーンからも漏れるテストが生まれ、しかもどのレーンも赤くならない。
benchmarks job を足した。Standalone と Graphics の結果 XML を集めて
run-benchmarks.ps1 に渡し、latest.json を artifact にする。**GPU に依る側が
CI で走るようになって初めて成立した** ―― GraphicsBenchmarkRunner は
Graphics レーンにしか居ない。

その過程で欠陥を 1 件見つけた: CI の Linux Player で
`OCVU_BENCH: first_pinvoke=0` が出る。run-benchmarks.ps1 は 0 を
「測定が効いていない」として落とすので、このままでは集められない。
**0 が出たのは測定が壊れていたからではなく、マイクロ秒では分解能が
足りなかったからである**(既にライブラリが読み込まれた後の 1 回の
呼び出しを測っており、それは 1 µs に満たない)。ナノ秒に変え、
単位をキー名に入れた(first_pinvoke_ns)。

CiVisibilityTests を削除した。「CI から見えないテストの一覧」を固定する
検査で、同 class の docstring が「graphics レーンを CI に配線できたら、
この一覧は空にでき、そのとき検査ごと消してよい」と書いていた。配線した。
EditMode は 59 → 58 件になる。

文書は実測に合わせた。CLAUDE.md の「CI が保証していないこと」から
3 項目(dnn profile / 全部入り tarball / RenderTexture の GPU 経路)が
閉じ、RenderTexture は Player 側だけが残る ―― game-ci が Player を
-nographics で起動しており、その指定は action の中にあって外せない。

roadmap に「GPU 経路を CI に載せる」を足した。**前提が誤っていたことを
記録する節である** ―― 3 つの文書が「CI では原理的に無理」と書いていたが、
根拠はすべてローカルの実測で、CI が何を渡しているかは 1 度も測って
いなかった。

skill も直した:
- prove-a-check-works に「『原理的に無理』と書いた前提を、誰も測って
  いないことがある」を足した。**検査は赤くなれば気づくが、「その検査は
  書けない」という結論は書かれなかったコードとして残るので何も赤く
  ならない。** 3 箇所に書いてあったことが確からしさの錯覚を強めていた
  ―― 3 箇所は 3 つの根拠ではなく、1 つの根拠の 3 つの写しである
- milestone-complete の「下の 2 つはどの workflow からも走らない」は
  失効した。規則そのもの(配線が無いレーンは判定のときだけが唯一の
  実行機会)は生きているので、そちらは残した
**CiVisibilityTests を戻した(C-2)。** 削除の根拠にした docstring は
「graphics レーンを CI に配線できたら消してよい」で、**「必須チェックに
なったら」ではなかった**。Unity Graphics (Linux) は非必須なので、
[Category("Graphics")] を付ける行為はいま「CI から完全に消える」ではなく
「必須レーンから、赤くても merge を止めないレーンへ無言で移る」になる ――
程度が下がっただけで性質は残る。docstring を実態に合わせ、削除の条件を
**「merge を止めるようになること」**に書き換えた。

**既定レーンが「define が立っていない」ことを要求しなくなっていた(I-1)。**
ProfileGatingTests を両方向にしたとき、既定側から前提 assertion が消えて
いた。ProjectSettings.asset に OCVU_PROFILE_DNN を誤って commit すると、
dnn を切った利用者のビルドを守るはずのレーンが陽性分岐を通って緑になる。
EditMode と tarball の requireOutput に `OCVU_PROFILE_DNN is not defined`
を足した。

**customParameters の検査が、要素 1 本の欠落を見逃していた(I-3)。**
否定形が 3 本ある状態では 1 本が '' に落ちても残り 2 本で緑になる ――
消えうる 1 本は tarball レーンの除外で、**M7a で実際に踏んだ回帰そのもの**
である。matrix の要素を切り出し、「EditMode を走らせる要素は 1 つを除いて
全部が否定形を持つ」「その 1 つは補集合」「Standalone は空を明示」
「matrix の外の tarball job も否定形を持つ」を要素ごとに見る形にした。
**負の対照を 4 通り取り、4 件とも CAUGHT。**

**publish する latest.json の単位が嘘だった(I-5 / I-2)。**
unit = 'microseconds per call' を全 entry 共通で持っており、
first_pinvoke_ns が入った時点で CI の出力が `= 400 us` になっていた。
単位を entry ごとに持たせ、key の接尾辞 `_ns` で決まる規約にした
(列挙しない ―― 次に足した人が直し忘れる)。

**その負の対照を取ろうとして、ハーネス側の欠陥が出た。**
tools/tests のうち 4 本が $ErrorActionPreference = 'Continue' で trap を
持たず、**検査の途中で例外が出ても残りを飛ばして exit 0 になる**。実測で
踏んだ(無いプロパティを読む assertion が例外を出しつつ `OK` と表示した)。
PackageRelease.Tests.ps1 が持っていた trap を 4 本に足し、**4 本とも
例外注入で exit 1 になることを確かめた。**

そのほか: Graphics レーンの requireTest に
EveryCheckInTheSharedBodyIsWiredIntoThisEntryPoint を足した(M-6。
共有本体の配線を見る唯一のテストで、外れても残り 6 件で緑になる)/
`&` で .ps1 を呼んだ後の $LASTEXITCODE を見るのをやめた(M-5。設定されない)/
`native plugins present: N [` を workflow 中の全出現に対して正本と突き合わせる
ようにした(M-1。tarball の PowerShell 引数が検査の外に居た)/
benchmarks job に !cancelled() を付けない理由と、収集が写しである理由を書いた。
レビューが、このブランチが roadmap と skill に書いたばかりの教訓
(**3 箇所は 3 つの根拠ではない。1 つの根拠の 3 つの写しである**)を
そのまま当ててきた ―― **写しを 3 つ直したが、実際には 14 箇所あった。**

直した先(.md だけではない):
- tools/dev.ps1 の Test-UnityGraphics docstring(「CI には配線しない
  (controller の裁定)」が残っていた。**.ps1 は「文書」と呼ばれないので
  見落とす**という milestone-complete skill の記録の 5 例目)
- docs/roadmap.md の**配布手順 step 7**(「誰もやらないから人が回せ」)。
  要約や表は先に直り、実行手順と散文が残る ―― これも同 skill の記録どおり
- docs/performance.md の読み方 1(**同じファイルの 20 行下が否定している**)
- docs/README.md / docs/api-reference.md / GraphicsTests.cs /
  ProfileGatingTests.cs / prove-a-check-works / milestone-complete /
  add-a-platform / OpenCvConfig.Tests.ps1 のコメント

**必須チェックの判断を記録した(C-1)。** 足した 9 本(job 5 本 +
game-ci の結果 check 4 本)は**どれも必須にしない** ―― 実績が 1 ブランチ
3 run しかない。Web の 3 本は 11 本の PR を見てから昇格した。**帰結を
隠さず書いた: いまは赤くても merge を止めない。** 昇格の条件も roadmap に
書いた。CLAUDE.md の非必須の行(9 → 18 本)と、唯一の二重記述として
認められている README 2 本の該当段落も直した。

**EditMode の件数を 59 に戻した。** CiVisibilityTests を残したためで、
「58 件になった」は 1 度書いて取り消した記録として残してある。

**performance.md の表を 2 つに割った** ―― このマシン(Windows)と
CI(Linux)。CI が publish するようになって初めて 2 環境の数字が並んだ。
**texture2d_to_mat が 292 µs 対 52 µs で 5 倍以上違う**ことと、CI の GPU が
ソフトウェア実装であることを書いた。単位も表に入れた(first_pinvoke_ns は
ナノ秒)。
**I-A(自分で作った誤り)**: 「この 4 つの CI check はどれも必須では
ありません」と 3 箇所(README 2 本と skill)に書いたが、**`Web browser E2E`
は必須である**(2026-09-10 に昇格済み)。しかも README.md は 50 行下で
自分で「A red Web lane now stops a merge」と書いており、**同じ節の中で
矛盾していた**。3 つと 1 つに分けて書き直した。

**C-A**: `CiVisibilityTests` を戻したのに「消した」と書いた文書が 3 箇所
残っていた。悪いのは事実が逆なことより、**レビューが「誤り」と判定した
削除条件(「CI に配線できたら消してよい」)が roadmap に判断の正本として
そのまま残っていた**ことである ―― 次に読む人が同じ削除をやり直す。
正しい条件(「merge を止めるようになったら」)に書き換えた。

**I-B(検査の穴)**: matrix 要素ごとの customParameters 検査で、
**testMode を捕まえられなかった要素が EditMode / Standalone のどちらの
ループにも入らず、値を一切見られないまま緑になる**。レビューが負の対照で
実測した(testMode の行末にコメントを足しつつ同じ要素の除外を '' にすると
全 assertion が PASS)。要素ごとに「知っている testMode を持つか」を問う
形にし、`- lane:` の緩い数え方との突き合わせも足した。**負の対照 3 通り
とも CAUGHT。**

**I-C**: CLAUDE.md の「閉じた」3 件に、非必須であることが書かれて
いなかった。同じ節の別の bullet が「必須でないレーンが赤いこと」を
保証していないものに挙げているので、節の中で衝突していた。

**レビューの指摘 1 件は実測で覆した。** 「`&` で .ps1 を呼んでも
$LASTEXITCODE は設定されない」と指摘され、いったん検査を外したが、
**実測すると設定される**(`exit 7` する .ps1 をパイプ越しに呼んで 7)。
dev.ps1 の失敗経路 `Write-DevFailure` は throw ではなく `exit 1` なので、
見ないと静かに次へ進む。**検査を戻し、測って引き返したことをコメントに
書いた** ―― 「仮説のまま直さない」はレビューの指摘にも同じだけ掛かる。

機械で守る形を 2 つ足した:
- **`$ErrorActionPreference='Continue'` のテストは trap を持つこと**
  (M-9)。直した 4 本は次に書く人が付け忘れる。負の対照で確認
- **扱えない単位の接尾辞を黙って µs として publish しない**(M-10)。
  規約を守っているのは publish 側だけで、C# 側には強制が無かった ――
  `*_ms` を足した日に 1000 倍ずれた数字が世に出る

そのほか: `native plugins present` の検査に文脈のアンカーを戻した
(コメント 1 行で満たせる形になっていた)/assertion のメッセージを
「CI から見えない」から「必須レーンから外れた」に/「3 run」は全部には
当たらない(tarball は 2、benchmark は 1)/`latest.json` の新しい形は
CI がまだ 1 度も出していないことを明記。
**私が書いた「18 本」は誤りだった。** 9 本増えると算術で出した数を、
実測せずに書いていた ―― このリポジトリが繰り返し記録している
「数は写さず測る」を、必須チェックの本数そのもので破っていた。

PR #76 での実測: `gh pr checks 76` は **36 件**、必須は 24 件、
集合演算で突き合わせた差は **12 件**である。内訳は Plugin 5 本 +
`Publish the release` + 集約 `CodeQL` + 今回足した 5 本。

**数え方に注意が要ることも分かった。** game-ci は `checkName` から
`EditMode results` のような check run を commit 上に作るが、
**`gh pr checks` はそれを列挙しない**(同じ SHA の check-runs API は 55 件)。
以前ここに書いてあった「9 本」はその 2 本を数に入れていたので、
**同じ方法で数え直すと 7 本だった** ―― 方法を書かずに数だけ写すと、
次に数え直した人が別の数に着く。

CLAUDE.md・README 2 本・roadmap の 4 箇所を、実測値と数え方に直した。
**測り方で間違えた。** 直前の commit で 18 → 12 に「直した」が、
**走っている途中に数えていた。** game-ci の `* results` check は各 job の
終盤に作られるので、`gh pr checks` は 36 件しか返さなかった。完了を待つと
**42 件**で、必須 24 本との差は **18 本**である ―― 最初に書いた数が
正しかった。

**集合演算で突き合わせたので確からしく見えたが、入力のほうが未完成だった。**
「数は写さず測る」は正しいが、**測る時刻も測定の一部である。**

内訳(完了後の実測): 増えた 9 本 = 足した job 5 本 + game-ci の結果 check
4 本(Graphics / DnnEditMode / DnnStandalone / Tarball)。それ以前の 9 本 =
Plugin 5 本 + Publish the release + 集約 CodeQL + EditMode/Standalone results 2 本。

4 箇所(CLAUDE.md・README 2 本・roadmap)を戻し、**測る時刻の注意**を
それぞれに書いた。roadmap にはこの往復そのものを記録した。
必須は 24 → 29 本、必須でないものは 18 → 13 本になる。昇格するのは
Unity Graphics (Linux) / Unity DnnEditMode (Linux) /
Unity DnnStandalone (Linux) / UPM tarball install (Linux) /
Publish the benchmarks の 5 本。

**これはこのリポジトリの手順からの逸脱なので、記録しておく。** これまでの
昇格はすべて「安定して緑になったのを見てから」で、Web の 3 本は 11 本の PR で
緑を見てから昇格した。**今回の実績は 1 ブランチ上で多くても 3 run である**
(benchmarks は 1 run)。所有者がその差を承知のうえで決めた。フレークで
main が固まった場合は、PATCH 1 回で戻せる。

**`benchmarks` job に `if: !cancelled()` を足した。同じ commit で入れる
必要がある** ―― 素の `needs: unity` だと依存が落ちた瞬間に skip になり、
**GitHub は skip を required check の合格として通す**。必須にしたまま
素の `needs:` を残すと、「依存が落ちているのに緑と同じ意味を持つ」状態を
自分で作ることになる。

**game-ci の結果 check(`* results` 6 本)は昇格させない。** PR では
neutral になり、GitHub は neutral を合格として通すので、必須にしても
止める力は増えない(EditMode results / Standalone results を必須に
していないのと同じ理由)。

**昇格の順序の注意も書いた**: 必須にした 5 本はこの変更が入った workflow で
しか作られないので、**この PR が main に入る前に main から切った branch には
現れず、その PR は永久に待たされる。** 今回は開いている PR が 1 本だけで、
そこでは 5 本とも緑なので踏んでいない。

あわせて OpenCvConfig.Tests.ps1 の綴り表に Twenty-six 〜 Thirty-two を足した
(README の本数一致検査が「綴りの表が古いなら足すこと」と書いている経路)。
@ayutaz
ayutaz merged commit 0b11094 into main Sep 12, 2026
42 checks passed
@ayutaz
ayutaz deleted the ci/close-coverage-gaps branch September 12, 2026 04:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant