From 10941ec718c322ee4cd9f9f7a7d8dc21a202784f Mon Sep 17 00:00:00 2001 From: yousan Date: Thu, 10 Sep 2026 20:33:28 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20Web=20=E3=81=AE=203=20=E6=9C=AC?= =?UTF-8?q?=E3=82=92=E5=BF=85=E9=A0=88=E3=81=B8=E6=98=87=E6=A0=BC=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=81=93=E3=81=A8=E3=82=92=E5=8F=8D=E6=98=A0=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Web wasm32 (cross-build)` / `Web browser E2E` / `Package web-wasm` を 必須チェックへ昇格させた(21 → 24 本)。根拠は #63 / #69 / #70 / #72 / #73 の 5 本すべてで success になったことで、必須外にしていた当初の理由 (「緑の実績が浅い」)は失効していた。モバイルの 2 本が M4 の直後は必須外で 2026-08-31 に昇格したのと同じ手順である。 設定は required_status_checks だけを PATCH した(/protection への PUT は 他の保護設定を消しうる)。変更後に strict / enforce_admins / 直線履歴 / force push 禁止 / 削除禁止がいずれも元のままであることを確認した。 CLAUDE.md の列挙 24 件が API の 24 件と過不足なく一致することを機械で 突き合わせてある(両向きとも差分なし)。CLAUDE.md 自身が「増減したら README の 2 段落も一緒に直せ」と書いているので、両 README の該当段落も 同じ commit で直した —— 片方だけ直すと翻訳同士が食い違う。 **帰結: Web のレーンは、いまは赤ければ merge を止める。** ついでに、両 README がリンク済み module を 8 つと書いていたのを 9 つに 直した(`dnn` が抜けていた。正本は cmake/FindOpenCvUnityDeps.cmake:84)。 --- CLAUDE.md | 4 ++-- README.ja.md | 4 ++-- README.md | 22 +++++++++++----------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 708c57c..a65467d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -413,8 +413,8 @@ CI が赤くて直した場合、その修正差分にもレビューが要る | 設定 | 値 | 意味 | | --- | --- | --- | | main の branch protection | 有効 | 直接 push は `GH006` で拒否される | -| 必須チェック | **21 本。** `ci-native` の 3 job(`Windows x64 (L1 + L3)` / `macOS arm64 (L1 + L3)` / `Linux x64 (L1 + L3)`)、`ci-sanitizers` の 2 job(`Windows x64 AddressSanitizer (L2)` / `Linux x64 ASan+LSan (L2)`)、`ci-lint` の 4 job(`Workflows (actionlint)` / `Shell scripts (shellcheck)` / `PowerShell (PSScriptAnalyzer)` / `Documentation links`)、`codeql` の 2 job(`Analyze c-cpp` / `Analyze csharp`)、`ci-unity` の 2 job(`Unity EditMode (Linux)` / `Unity Standalone (Linux)`)、**`release` の 6 job(`Package windows-x64` / `macos-arm64` / `linux-x64` / `android-arm64` / `ios-arm64` と `Assemble the release assets`)、`ci-native` のモバイル 2 job(`Android arm64-v8a (cross-build)` / `iOS arm64 (cross-build)`)**。2 本 → 5 本(M3 完了時)→ 13 本(2026-08-29、PR #30 が 13 本すべてを緑にしたのを見てから拡張)→ **21 本(2026-08-31。`release.yml` を PR でも走らせるようにして 6 本、モバイルのクロスビルド 2 本を足した。どちらも main と PR の両方で安定して緑になったのを見てから拡張した)**。2026-08-31 に API で実測し、この表と一致 | 全部 pass しないと merge できない | -| 必須でないもの | **`ci-unity` の `Plugin ` 5 本、`release` の `Publish the release` の 1 本、そして M6 が足した 3 本(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)。** **M6 の 3 本を必須にしない理由として「緑の実績がまだ浅い」と書いていたが、その根拠は失効した。** 2026-09-10 に実測した実績は次のとおり: **`Web wasm32 (cross-build)` / `Web browser E2E` / `Package web-wasm` の 3 本とも、PR #63 / #69 / #70 / #72 / #73 の 5 本すべてで success**。加えて **main の直近 6 run でも `Web wasm32 (cross-build)` と `Web browser E2E` が success** である(`Package web-wasm` は `release.yml` が main の push で走らないので、実績は PR 側だけである)。**したがって「浅いから」はもう理由にならない。** それでも必須へ昇格させていないのは、**昇格が GitHub 側の設定変更であって文書修正ではなく、リポジトリ所有者の判断だからである** —— **これは未決の判断として開いている。** モバイルの 2 本が M4 の直後は必須外で 2026-08-31 に昇格したのと同じ手順を踏む。**帰結を直視すること: いま Web のレーンは赤くても merge を止めない。****`Plugin` が 4 本から 5 本になった**のは web-wasm が加わったためである。 `Plugin` は落ちると `unity` job が `if: !cancelled()` で走って材料が無いまま赤くなるので、必須チェックである Unity の 2 レーンがそのまま止める(**skip は required check を通す**ので `needs:` だけでは止まらない —— そこは workflow の構造で塞いである)。**モバイルの 2 本は 2026-08-31 に必須へ昇格した** —— 当初の理由(この構成の CI がまだ 1 度も緑になっていない)が失効し、M4 以降 PR と main で安定して緑になったためである。**`Publish the release` は必須にしない** —— PR では常に skip される job で、**GitHub は skip を合格として通す**ので、必須にしても何も止めない。「見ているが止めない」の典型である。`build-opencv` / `nightly` は PR では起動しない(構成変更・定期実行が trigger)ので、そもそも必須にできない | — | +| 必須チェック | **24 本。** `ci-native` の 3 job(`Windows x64 (L1 + L3)` / `macOS arm64 (L1 + L3)` / `Linux x64 (L1 + L3)`)、`ci-sanitizers` の 2 job(`Windows x64 AddressSanitizer (L2)` / `Linux x64 ASan+LSan (L2)`)、`ci-lint` の 4 job(`Workflows (actionlint)` / `Shell scripts (shellcheck)` / `PowerShell (PSScriptAnalyzer)` / `Documentation links`)、`codeql` の 2 job(`Analyze c-cpp` / `Analyze csharp`)、`ci-unity` の 2 job(`Unity EditMode (Linux)` / `Unity Standalone (Linux)`)、**`release` の 6 job(`Package windows-x64` / `macos-arm64` / `linux-x64` / `android-arm64` / `ios-arm64` と `Assemble the release assets`)、`ci-native` のモバイル 2 job(`Android arm64-v8a (cross-build)` / `iOS arm64 (cross-build)`)、**M6 の Web 3 job(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)**。2 本 → 5 本(M3 完了時)→ 13 本(2026-08-29、PR #30 が 13 本すべてを緑にしたのを見てから拡張)→ **21 本(2026-08-31。`release.yml` を PR でも走らせるようにして 6 本、モバイルのクロスビルド 2 本を足した。どちらも main と PR の両方で安定して緑になったのを見てから拡張した)** → **24 本(2026-09-10。M6 が足した Web の 3 本を昇格した —— PR #63 / #69 / #70 / #72 / #73 の 5 本すべてで success になり、「緑の実績が浅い」という当初の理由が失効したため)**。2026-09-10 に API で実測し、この表と一致 | 全部 pass しないと merge できない | +| 必須でないもの | **`ci-unity` の `Plugin ` 5 本、`release` の `Publish the release` の 1 本。** **M6 が足した Web の 3 本(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)は 2026-09-10 に必須へ昇格した** —— モバイルの 2 本と同じ手順で、PR #63 / #69 / #70 / #72 / #73 の 5 本すべてで success になり、「緑の実績が浅い」という当初の理由が失効したのを見てからである。**したがって Web のレーンは、いまは赤ければ merge を止める。****`Plugin` が 4 本から 5 本になった**のは web-wasm が加わったためである。 `Plugin` は落ちると `unity` job が `if: !cancelled()` で走って材料が無いまま赤くなるので、必須チェックである Unity の 2 レーンがそのまま止める(**skip は required check を通す**ので `needs:` だけでは止まらない —— そこは workflow の構造で塞いである)。**モバイルの 2 本は 2026-08-31 に必須へ昇格した** —— 当初の理由(この構成の CI がまだ 1 度も緑になっていない)が失効し、M4 以降 PR と main で安定して緑になったためである。**`Publish the release` は必須にしない** —— PR では常に skip される job で、**GitHub は skip を合格として通す**ので、必須にしても何も止めない。「見ているが止めない」の典型である。`build-opencv` / `nightly` は PR では起動しない(構成変更・定期実行が trigger)ので、そもそも必須にできない | — | | strict | 有効 | ブランチが main より古いと merge できない(`allow_update_branch` で自動更新可) | | 必須レビュー数 | **0** | PR は必須だが人間の承認は不要 | | enforce_admins | **有効** | 管理者も例外ではない。抜け道は無い | diff --git a/README.ja.md b/README.ja.md index 3b24332..9baa259 100644 --- a/README.ja.md +++ b/README.ja.md @@ -247,7 +247,7 @@ Unity のレーンは Linux で走り、Windows の IL2CPP Player はローカ 表の外では、すべての pull request が `actionlint` / `shellcheck` / `PSScriptAnalyzer` とリポジトリ内リンクの検査を走らせ、CodeQL が C++ と C# を解析します。nightly の workflow は Linux 成果物の glibc の下限を再確認し、Windows と macOS で速いレーンを走らせ、固定した OpenCV の artifact が期限切れでないことを確かめます —— **誰も push していない間に壊れるもの**です。**この nightly は 2026-08-29 から毎日 schedule で走っています** —— 2026-09-10 時点で 13 回、直近 8 回は緑です。(以前ここには「まだ schedule で起動したことがない」と書いてありました。1 週間以上のあいだ偽で、**この種の記述は真でなくなっても何も赤くなりません。**) -**pull request で走るレーンのほとんどが merge を止めます。** 必須チェックは 21 本です: desktop 3 platform の契約・P/Invoke・sanitizer、Android と iOS のクロスビルド、lint の 4 job、CodeQL の 2 つ、Unity の 2 レーン、そしてその 5 platform 分の配布物をビルド・組み立てる release の 6 job。9 本は意図的に必須にしていません。うち 5 本は Unity のレーンが消費する platform ごとのプラグインをビルドするもので、**どれかが失敗すると Unity のレーンは走ったうえで材料が無いことで赤くなり**、それが merge を止めます。3 本は Web / Wasm のもの(クロスビルド・ブラウザでの E2E・リリースの梱包)で、**昇格していないため、現時点では Web のレーンが赤くても merge を止めません。** 以前ここには「まだ昇格の実績を積んでいない」と書いていましたが、2026-09-10 の時点でそれは成立しません —— 3 本とも直近 5 本の pull request すべてで緑で、そのうち main でも走る 2 本は main の直近 6 run でも緑です。**昇格するかどうかは、測定待ちではなく未決の判断です。****skip された必須チェックは合格として通る**ので、その守りなしにそれらへ依存すると、壊れたビルドが通ってしまいます。**レーンは安定して緑になってから必須にします** —— ただし過去 2 回踏んだのは、その逆の形でした: **レーンを足したのに必須にしないまま置いたこと**が、「赤いのに merge できる」隙間そのものです。2026-08-29 までは Unity・lint・CodeQL の workflow がすべての pull request で走りながら必須ではなく、**赤いまま merge できました。CI が見ていることと CI が止めることは別で、ゲートなのは後者だけです。** 残る 3 つの workflow(`build-opencv`、`nightly`、`unity-probe`)は pull request では起動しないので、そもそも必須にできません。`release` は 2026-08-31 までその一覧にありました —— いまは pull request でも走ります。tag でしか走らなかった間に配布の経路に欠陥が 3 件たまり、**うち 1 件は「tag を打つとリリースが 1 件も作られない」というものでした。** その `Publish the release` job だけは必須にしません —— pull request では設計上 skip され、**skip は合格として通る**ので、必須にしても何も止まらないからです。 +**pull request で走るレーンのほとんどが merge を止めます。** 必須チェックは 24 本です: desktop 3 platform の契約・P/Invoke・sanitizer、Android・iOS・Web / Wasm のクロスビルド、lint の 4 job、CodeQL の 2 つ、Unity の 2 レーン、ブラウザでの E2E、そして 6 platform 分の配布物をビルド・組み立てる release の 7 job。6 本は意図的に必須にしていません。うち 5 本は Unity のレーンが消費する platform ごとのプラグインをビルドするもので、**どれかが失敗すると Unity のレーンは走ったうえで材料が無いことで赤くなり**、それが merge を止めます。Web / Wasm の 3 本(クロスビルド・ブラウザでの E2E・リリースの梱包)は **2026-09-10 に必須へ昇格しました** —— 直近 5 本の pull request すべてで緑になり、そのうち main でも走る 2 本は main の直近 6 run でも緑だったのを見てからです。**したがって Web のレーンも、赤ければ merge を止めます。****昇格は証拠に従いますが、その証拠は誰かが見に行かないと出てきません。****skip された必須チェックは合格として通る**ので、その守りなしにそれらへ依存すると、壊れたビルドが通ってしまいます。**レーンは安定して緑になってから必須にします** —— ただし過去 2 回踏んだのは、その逆の形でした: **レーンを足したのに必須にしないまま置いたこと**が、「赤いのに merge できる」隙間そのものです。2026-08-29 までは Unity・lint・CodeQL の workflow がすべての pull request で走りながら必須ではなく、**赤いまま merge できました。CI が見ていることと CI が止めることは別で、ゲートなのは後者だけです。** 残る 3 つの workflow(`build-opencv`、`nightly`、`unity-probe`)は pull request では起動しないので、そもそも必須にできません。`release` は 2026-08-31 までその一覧にありました —— いまは pull request でも走ります。tag でしか走らなかった間に配布の経路に欠陥が 3 件たまり、**うち 1 件は「tag を打つとリリースが 1 件も作られない」というものでした。** その `Publish the release` job だけは必須にしません —— pull request では設計上 skip され、**skip は合格として通る**ので、必須にしても何も止まらないからです。 ## 貢献とセキュリティ @@ -258,7 +258,7 @@ Unity のレーンは Linux で走り、Windows の IL2CPP Player はローカ このリポジトリ自身のソースは Apache License 2.0 です。**それだけでは、配布される binary にリンクされる third-party のコードの条件は決まりません** —— 固定した OpenCV のビルドが bundle するもののライセンスは [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) にあります。同ファイルは成果物が運ぶすべてのライセンスを列挙し、component ごとに **OpenCV 自身のどの静的ライブラリにコンパイルされているか**を述べます。SoftFloat・annoylib・MSCR の chi table・Rubik フォントが、zlib・libpng・libjpeg-turbo・libclapack と並んでリンクされています(**ライセンスファイルは入っているがリンクされていないもの**もいくつかあります)。**Rubik フォントは BSD 系ではなく SIL Open Font License なので、この集合は一様ではありません。** 依存は allowlist(`tools/verify-opencv-artifact.ps1`)で縛られ、ビルド profile ごとに文書化されています。 -**そのうちどれが、あなたが再配布するプラグインに実際に届くかは、このプラグインがどの OpenCV module をリンクするかで決まり、それは何度か変わってきました。** いまは `core` / `imgproc` / `imgcodecs` / `objdetect` / `features` / `geometry` / `calib` / `stereo` をリンクしています(`imgcodecs` の前は `core` と `imgproc` だけでした)。**静的リンクは参照されたものしか引き込まない**ので、その module に入る関数が書かれるまで、その module のコードは配布ライブラリに 1 バイトも届きません。**書くことが引き込みます** —— Windows の debug ライブラリは encode / decode の関数が入ったときに 8,831,488 から 10,177,536 バイトへ(zlib / libpng / libjpeg-turbo が一緒に来ました)、QR と ORB が入ったときに 20,136,960 バイトへ(`annoylib` と MSCR の chi_table が `features` と一緒に来ました)増えました。いまは **22,283,264 バイト**です。**ここに記録してあった直前の値は 21,464,576 バイト**(`calibrateCamera` が入ったときの実測)ですが、**同じソースを M6 のあとで測り直すと 21,465,600 バイト**でした —— Web の作業がビルドを変えたのに誰も測り直していなかったので、差のうち 1,024 バイトはこの作業のものではありません。**2026-09 の API 拡張で入った 26 本(姿勢・ArUco・imgproc の実用関数・core の基本演算・特徴点マッチング・ステレオ視差)のぶんは 817,664 バイトです。****ビルドシステムに module を足すだけでは何も変わりません** —— `calib` をリンクしたときも `stereo` をリンクしたときも、実際にそこへ入る関数が書かれるまで、ライブラリの大きさはちょうど 0 バイトしか動きませんでした。 +**そのうちどれが、あなたが再配布するプラグインに実際に届くかは、このプラグインがどの OpenCV module をリンクするかで決まり、それは何度か変わってきました。** いまは `core` / `imgproc` / `imgcodecs` / `objdetect` / `features` / `geometry` / `calib` / `stereo` / `dnn` をリンクしています(`imgcodecs` の前は `core` と `imgproc` だけでした)。**静的リンクは参照されたものしか引き込まない**ので、その module に入る関数が書かれるまで、その module のコードは配布ライブラリに 1 バイトも届きません。**書くことが引き込みます** —— Windows の debug ライブラリは encode / decode の関数が入ったときに 8,831,488 から 10,177,536 バイトへ(zlib / libpng / libjpeg-turbo が一緒に来ました)、QR と ORB が入ったときに 20,136,960 バイトへ(`annoylib` と MSCR の chi_table が `features` と一緒に来ました)増えました。いまは **22,283,264 バイト**です。**ここに記録してあった直前の値は 21,464,576 バイト**(`calibrateCamera` が入ったときの実測)ですが、**同じソースを M6 のあとで測り直すと 21,465,600 バイト**でした —— Web の作業がビルドを変えたのに誰も測り直していなかったので、差のうち 1,024 バイトはこの作業のものではありません。**2026-09 の API 拡張で入った 26 本(姿勢・ArUco・imgproc の実用関数・core の基本演算・特徴点マッチング・ステレオ視差)のぶんは 817,664 バイトです。****ビルドシステムに module を足すだけでは何も変わりません** —— `calib` をリンクしたときも `stereo` をリンクしたときも、実際にそこへ入る関数が書かれるまで、ライブラリの大きさはちょうど 0 バイトしか動きませんでした。 **この区別は失われやすく、このリポジトリも一時期それを失っていました。** 固定した OpenCV のビルドは最初から `imgcodecs` を含む構成で、`ocvu_get_build_information()` も「To be built」にそれを並べます —— **それは「OpenCV がその module を含めてビルドされた」であって「このプラグインがそれにリンクしている」ではありません。** リンクしていなかったのですが、決着をつけたのはリンカでした —— `cv::imencode` への最初の呼び出しが未解決の外部シンボルになったのです。 diff --git a/README.md b/README.md index 227f4c4..738e27f 100644 --- a/README.md +++ b/README.md @@ -379,18 +379,18 @@ eight of them green. (An earlier version of this paragraph said it had never run a schedule. That was wrong for over a week, and nothing goes red when a statement like that stops being true.) -**Almost every lane that runs on a pull request blocks a merge.** Twenty-one checks are +**Almost every lane that runs on a pull request blocks a merge.** Twenty-four checks are required: the contract, P/Invoke and sanitizer jobs across the three desktop platforms, the -Android and iOS cross-builds, the four lint jobs, both CodeQL analyses, both Unity lanes, -and the six release jobs that build and assemble the distributable for those five platforms. -Nine are deliberately not required. Five build the per-platform plugins the Unity lanes +Android, iOS and Web/Wasm cross-builds, the four lint jobs, both CodeQL analyses, both +Unity lanes, the browser end-to-end test, and the seven release jobs that build and +assemble the distributable for all six platforms. +Six are deliberately not required. Five build the per-platform plugins the Unity lanes consume: when one fails the Unity lanes run anyway and go red on the missing input, which -is what stops the merge. Three cover Web/Wasm — its cross-build, its browser end-to-end -test and its release packaging — and **have not been promoted, so a red Web lane does -not currently stop a merge**. The stated reason used to be that they were too new; as of -2026-09-10 that no longer holds — all three have passed on five consecutive pull -requests, and the two that also run on `main` have passed on its last six runs. -**Promotion is an open decision, not a pending measurement.** A skipped required check +is what stops the merge. The three Web/Wasm checks — its cross-build, its browser +end-to-end test and its release packaging — **were promoted on 2026-09-10**, after +passing on five consecutive pull requests and, for the two that also run on `main`, its +last six runs. A red Web lane now stops a merge like any other. +**Promotion follows evidence, but somebody has to go and look at it.** A skipped required check counts as passing, so depending on one without that guard would let a broken build through. A lane is only made required once it has been reliably green — but the failure mode seen twice here was the opposite of impatience: **a lane was added and left @@ -419,7 +419,7 @@ Apache License 2.0 for this repository's own source. That does not by itself det Which of those then reach the plugin **you** redistribute depends on which OpenCV modules this plugin links, and that has changed several times. It now links `core`, -`imgproc`, `imgcodecs`, `objdetect`, `features`, `geometry`, `calib` and `stereo`; before +`imgproc`, `imgcodecs`, `objdetect`, `features`, `geometry`, `calib`, `stereo` and `dnn`; before `imgcodecs` it linked only `core` and `imgproc`. Static linking pulls in only what is referenced, so until the functions that call into a module are written, none of that module's code reaches the shipped library. Writing them is what pulls it in — on Windows the debug library grew from 8,831,488 to From f2d0de996004283dfb2a0290871a1d899b7f3c1b Mon Sep 17 00:00:00 2001 From: yousan Date: Thu, 10 Sep 2026 20:46:38 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix(review):=20=E6=98=87=E6=A0=BC=E3=81=AE?= =?UTF-8?q?=E5=8F=8D=E6=98=A0=E6=BC=8F=E3=82=8C=E3=81=A8=E3=80=81=E5=A4=AA?= =?UTF-8?q?=E5=AD=97=E8=A8=98=E5=8F=B7=E3=81=AE=E4=B8=8D=E5=9D=87=E8=A1=A1?= =?UTF-8?q?=E3=82=92=E7=9B=B4=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit review-1: docs/roadmap.md の M6「満たしていないもの」に「必須にするかは まだ決着していない」「同じ手順を踏む」が現在形で残っていた。昇格で偽に なったのに前の commit が触っていなかった。解消した項として書き直す。 review-2(自分で作り込んだ欠陥): CLAUDE.md:416 で Web 3 job を挿すときに 開き ** を足したため、対応がずれて ** が奇数(9 個)になっていた。結果、 足した文は太字にならず、代わりに履歴の部分が太字になり、生の ** が本文に 出ていた。開き記号を落として 1 つの太字が 3 群を覆う形に戻した。416/417 の 両行が偶数であること、ファイル全体で「** が奇数の行」が main と同じ 35 行の ままであることを機械で確認した。 review-3: 根拠の呼び名が集合と合っていなかった。「直近 5 本」「five consecutive」はどちらも #63/#69/#70/#72/#73 を指さない(#64-#68 を飛ばし #74 を含まない)。実測すると根拠はもっと強く、#63 以降に merge された 11 本すべてで 3 本とも success だったので、そう書き直した。あわせて CLAUDE.md の同じ根拠が 2 箇所にあったのを 1 箇所にし、他方は上を指す。 review-4: 必須でないものを 6 本と書いていたが、PR #74 の 33 checks から 必須 24 本を引くと 9 本である。CodeQL の集約 check と、PR では skip される Unity の結果公開 job 2 本が漏れていた。3 文書とも 9 本に直した。 (旧「9 本」も同じ穴を持っていたので、今回の混入ではない。) --- CLAUDE.md | 4 ++-- README.ja.md | 2 +- README.md | 9 ++++++--- docs/roadmap.md | 6 ++++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index a65467d..21fcb6b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -413,8 +413,8 @@ CI が赤くて直した場合、その修正差分にもレビューが要る | 設定 | 値 | 意味 | | --- | --- | --- | | main の branch protection | 有効 | 直接 push は `GH006` で拒否される | -| 必須チェック | **24 本。** `ci-native` の 3 job(`Windows x64 (L1 + L3)` / `macOS arm64 (L1 + L3)` / `Linux x64 (L1 + L3)`)、`ci-sanitizers` の 2 job(`Windows x64 AddressSanitizer (L2)` / `Linux x64 ASan+LSan (L2)`)、`ci-lint` の 4 job(`Workflows (actionlint)` / `Shell scripts (shellcheck)` / `PowerShell (PSScriptAnalyzer)` / `Documentation links`)、`codeql` の 2 job(`Analyze c-cpp` / `Analyze csharp`)、`ci-unity` の 2 job(`Unity EditMode (Linux)` / `Unity Standalone (Linux)`)、**`release` の 6 job(`Package windows-x64` / `macos-arm64` / `linux-x64` / `android-arm64` / `ios-arm64` と `Assemble the release assets`)、`ci-native` のモバイル 2 job(`Android arm64-v8a (cross-build)` / `iOS arm64 (cross-build)`)、**M6 の Web 3 job(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)**。2 本 → 5 本(M3 完了時)→ 13 本(2026-08-29、PR #30 が 13 本すべてを緑にしたのを見てから拡張)→ **21 本(2026-08-31。`release.yml` を PR でも走らせるようにして 6 本、モバイルのクロスビルド 2 本を足した。どちらも main と PR の両方で安定して緑になったのを見てから拡張した)** → **24 本(2026-09-10。M6 が足した Web の 3 本を昇格した —— PR #63 / #69 / #70 / #72 / #73 の 5 本すべてで success になり、「緑の実績が浅い」という当初の理由が失効したため)**。2026-09-10 に API で実測し、この表と一致 | 全部 pass しないと merge できない | -| 必須でないもの | **`ci-unity` の `Plugin ` 5 本、`release` の `Publish the release` の 1 本。** **M6 が足した Web の 3 本(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)は 2026-09-10 に必須へ昇格した** —— モバイルの 2 本と同じ手順で、PR #63 / #69 / #70 / #72 / #73 の 5 本すべてで success になり、「緑の実績が浅い」という当初の理由が失効したのを見てからである。**したがって Web のレーンは、いまは赤ければ merge を止める。****`Plugin` が 4 本から 5 本になった**のは web-wasm が加わったためである。 `Plugin` は落ちると `unity` job が `if: !cancelled()` で走って材料が無いまま赤くなるので、必須チェックである Unity の 2 レーンがそのまま止める(**skip は required check を通す**ので `needs:` だけでは止まらない —— そこは workflow の構造で塞いである)。**モバイルの 2 本は 2026-08-31 に必須へ昇格した** —— 当初の理由(この構成の CI がまだ 1 度も緑になっていない)が失効し、M4 以降 PR と main で安定して緑になったためである。**`Publish the release` は必須にしない** —— PR では常に skip される job で、**GitHub は skip を合格として通す**ので、必須にしても何も止めない。「見ているが止めない」の典型である。`build-opencv` / `nightly` は PR では起動しない(構成変更・定期実行が trigger)ので、そもそも必須にできない | — | +| 必須チェック | **24 本。** `ci-native` の 3 job(`Windows x64 (L1 + L3)` / `macOS arm64 (L1 + L3)` / `Linux x64 (L1 + L3)`)、`ci-sanitizers` の 2 job(`Windows x64 AddressSanitizer (L2)` / `Linux x64 ASan+LSan (L2)`)、`ci-lint` の 4 job(`Workflows (actionlint)` / `Shell scripts (shellcheck)` / `PowerShell (PSScriptAnalyzer)` / `Documentation links`)、`codeql` の 2 job(`Analyze c-cpp` / `Analyze csharp`)、`ci-unity` の 2 job(`Unity EditMode (Linux)` / `Unity Standalone (Linux)`)、**`release` の 6 job(`Package windows-x64` / `macos-arm64` / `linux-x64` / `android-arm64` / `ios-arm64` と `Assemble the release assets`)、`ci-native` のモバイル 2 job(`Android arm64-v8a (cross-build)` / `iOS arm64 (cross-build)`)、M6 の Web 3 job(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)**。2 本 → 5 本(M3 完了時)→ 13 本(2026-08-29、PR #30 が 13 本すべてを緑にしたのを見てから拡張)→ **21 本(2026-08-31。`release.yml` を PR でも走らせるようにして 6 本、モバイルのクロスビルド 2 本を足した。どちらも main と PR の両方で安定して緑になったのを見てから拡張した)** → **24 本(2026-09-10。M6 が足した Web の 3 本を昇格した —— #63 以降に merge された 11 本の PR(#63〜#70 と #72〜#74)すべてで 3 本とも success になり、「緑の実績が浅い」という当初の理由が失効したため)**。2026-09-10 に API で実測し、この表と一致 | 全部 pass しないと merge できない | +| 必須でないもの | **9 本**(PR #74 の 33 checks から必須 24 本を引いて実測)。**`ci-unity` の `Plugin ` 5 本、`release` の `Publish the release` の 1 本、`codeql` の集約 check `CodeQL` の 1 本(言語ごとの `Analyze c-cpp` / `Analyze csharp` を個別に必須にしてあるので、集約を足しても止める力は増えない)、`ci-unity` の `EditMode results` / `Standalone results` の 2 本(PR では skip される)。** **M6 が足した Web の 3 本(`ci-native` の `Web wasm32 (cross-build)` / `ci-unity` の `Web browser E2E` / `release` の `Package web-wasm`)は 2026-09-10 に必須へ昇格した** —— モバイルの 2 本と同じ手順である(根拠は上の行に 1 度だけ書いてある)。**したがって Web のレーンは、いまは赤ければ merge を止める。****`Plugin` が 4 本から 5 本になった**のは web-wasm が加わったためである。 `Plugin` は落ちると `unity` job が `if: !cancelled()` で走って材料が無いまま赤くなるので、必須チェックである Unity の 2 レーンがそのまま止める(**skip は required check を通す**ので `needs:` だけでは止まらない —— そこは workflow の構造で塞いである)。**モバイルの 2 本は 2026-08-31 に必須へ昇格した** —— 当初の理由(この構成の CI がまだ 1 度も緑になっていない)が失効し、M4 以降 PR と main で安定して緑になったためである。**`Publish the release` は必須にしない** —— PR では常に skip される job で、**GitHub は skip を合格として通す**ので、必須にしても何も止めない。「見ているが止めない」の典型である。`build-opencv` / `nightly` は PR では起動しない(構成変更・定期実行が trigger)ので、そもそも必須にできない | — | | strict | 有効 | ブランチが main より古いと merge できない(`allow_update_branch` で自動更新可) | | 必須レビュー数 | **0** | PR は必須だが人間の承認は不要 | | enforce_admins | **有効** | 管理者も例外ではない。抜け道は無い | diff --git a/README.ja.md b/README.ja.md index 9baa259..6943ac8 100644 --- a/README.ja.md +++ b/README.ja.md @@ -247,7 +247,7 @@ Unity のレーンは Linux で走り、Windows の IL2CPP Player はローカ 表の外では、すべての pull request が `actionlint` / `shellcheck` / `PSScriptAnalyzer` とリポジトリ内リンクの検査を走らせ、CodeQL が C++ と C# を解析します。nightly の workflow は Linux 成果物の glibc の下限を再確認し、Windows と macOS で速いレーンを走らせ、固定した OpenCV の artifact が期限切れでないことを確かめます —— **誰も push していない間に壊れるもの**です。**この nightly は 2026-08-29 から毎日 schedule で走っています** —— 2026-09-10 時点で 13 回、直近 8 回は緑です。(以前ここには「まだ schedule で起動したことがない」と書いてありました。1 週間以上のあいだ偽で、**この種の記述は真でなくなっても何も赤くなりません。**) -**pull request で走るレーンのほとんどが merge を止めます。** 必須チェックは 24 本です: desktop 3 platform の契約・P/Invoke・sanitizer、Android・iOS・Web / Wasm のクロスビルド、lint の 4 job、CodeQL の 2 つ、Unity の 2 レーン、ブラウザでの E2E、そして 6 platform 分の配布物をビルド・組み立てる release の 7 job。6 本は意図的に必須にしていません。うち 5 本は Unity のレーンが消費する platform ごとのプラグインをビルドするもので、**どれかが失敗すると Unity のレーンは走ったうえで材料が無いことで赤くなり**、それが merge を止めます。Web / Wasm の 3 本(クロスビルド・ブラウザでの E2E・リリースの梱包)は **2026-09-10 に必須へ昇格しました** —— 直近 5 本の pull request すべてで緑になり、そのうち main でも走る 2 本は main の直近 6 run でも緑だったのを見てからです。**したがって Web のレーンも、赤ければ merge を止めます。****昇格は証拠に従いますが、その証拠は誰かが見に行かないと出てきません。****skip された必須チェックは合格として通る**ので、その守りなしにそれらへ依存すると、壊れたビルドが通ってしまいます。**レーンは安定して緑になってから必須にします** —— ただし過去 2 回踏んだのは、その逆の形でした: **レーンを足したのに必須にしないまま置いたこと**が、「赤いのに merge できる」隙間そのものです。2026-08-29 までは Unity・lint・CodeQL の workflow がすべての pull request で走りながら必須ではなく、**赤いまま merge できました。CI が見ていることと CI が止めることは別で、ゲートなのは後者だけです。** 残る 3 つの workflow(`build-opencv`、`nightly`、`unity-probe`)は pull request では起動しないので、そもそも必須にできません。`release` は 2026-08-31 までその一覧にありました —— いまは pull request でも走ります。tag でしか走らなかった間に配布の経路に欠陥が 3 件たまり、**うち 1 件は「tag を打つとリリースが 1 件も作られない」というものでした。** その `Publish the release` job だけは必須にしません —— pull request では設計上 skip され、**skip は合格として通る**ので、必須にしても何も止まらないからです。 +**pull request で走るレーンのほとんどが merge を止めます。** 必須チェックは 24 本です: desktop 3 platform の契約・P/Invoke・sanitizer、Android・iOS・Web / Wasm のクロスビルド、lint の 4 job、CodeQL の 2 つ、Unity の 2 レーン、ブラウザでの E2E、そして 6 platform 分の配布物をビルド・組み立てる release の 7 job。9 本は意図的に必須にしていません。うち 5 本は Unity のレーンが消費する platform ごとのプラグインをビルドするもので、**どれかが失敗すると Unity のレーンは走ったうえで材料が無いことで赤くなり**、それが merge を止めます。Web / Wasm の 3 本(クロスビルド・ブラウザでの E2E・リリースの梱包)は **2026-09-10 に必須へ昇格しました** —— #63 以降に merge された 11 本の pull request すべてで 3 本とも緑になり、そのうち main でも走る 2 本は main の直近 6 run でも緑だったのを見てからです。残る 3 本は、言語ごとの解析を個別に必須にしてある `CodeQL` の集約 check と、pull request では skip される Unity の結果公開 job 2 本です。**したがって Web のレーンも、赤ければ merge を止めます。****昇格は証拠に従いますが、その証拠は誰かが見に行かないと出てきません。****skip された必須チェックは合格として通る**ので、その守りなしにそれらへ依存すると、壊れたビルドが通ってしまいます。**レーンは安定して緑になってから必須にします** —— ただし過去 2 回踏んだのは、その逆の形でした: **レーンを足したのに必須にしないまま置いたこと**が、「赤いのに merge できる」隙間そのものです。2026-08-29 までは Unity・lint・CodeQL の workflow がすべての pull request で走りながら必須ではなく、**赤いまま merge できました。CI が見ていることと CI が止めることは別で、ゲートなのは後者だけです。** 残る 3 つの workflow(`build-opencv`、`nightly`、`unity-probe`)は pull request では起動しないので、そもそも必須にできません。`release` は 2026-08-31 までその一覧にありました —— いまは pull request でも走ります。tag でしか走らなかった間に配布の経路に欠陥が 3 件たまり、**うち 1 件は「tag を打つとリリースが 1 件も作られない」というものでした。** その `Publish the release` job だけは必須にしません —— pull request では設計上 skip され、**skip は合格として通る**ので、必須にしても何も止まらないからです。 ## 貢献とセキュリティ diff --git a/README.md b/README.md index 738e27f..c5af3eb 100644 --- a/README.md +++ b/README.md @@ -384,12 +384,15 @@ required: the contract, P/Invoke and sanitizer jobs across the three desktop pla Android, iOS and Web/Wasm cross-builds, the four lint jobs, both CodeQL analyses, both Unity lanes, the browser end-to-end test, and the seven release jobs that build and assemble the distributable for all six platforms. -Six are deliberately not required. Five build the per-platform plugins the Unity lanes +Nine are deliberately not required. Five build the per-platform plugins the Unity lanes consume: when one fails the Unity lanes run anyway and go red on the missing input, which is what stops the merge. The three Web/Wasm checks — its cross-build, its browser end-to-end test and its release packaging — **were promoted on 2026-09-10**, after -passing on five consecutive pull requests and, for the two that also run on `main`, its -last six runs. A red Web lane now stops a merge like any other. +passing on all eleven pull requests merged since #63 and, for the two that also run on +`main`, its last six runs. A red Web lane now stops a merge like any other. The other +three unrequired checks are the aggregate `CodeQL` check, whose two per-language +analyses are required individually, and the two Unity result-publishing jobs, which are +skipped on pull requests. **Promotion follows evidence, but somebody has to go and look at it.** A skipped required check counts as passing, so depending on one without that guard would let a broken build through. A lane is only made required once it has been reliably green — but the failure diff --git a/docs/roadmap.md b/docs/roadmap.md index 83aeb7b..d4d54d0 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1854,10 +1854,12 @@ Emscripten は既定で C++ 例外を無効にするので、`throw` は残る **満たしていないもの / 意図してやっていないことを明記する。** -- **M6 が足した 3 本の check を必須にするかは、まだ決着していない** +- **M6 が足した 3 本の check を必須にするかは、M6 の時点では決着していなかった** (`Web wasm32 (cross-build)` / `Web browser E2E` / `Package web-wasm`)。 `CLAUDE.md` の規律は「**安定して緑になったのを見てから必須へ加える**」で、 - **モバイルの 2 本も M4 の直後は必須外で、後から昇格した。** 同じ手順を踏む。 + **モバイルの 2 本も M4 の直後は必須外で、後から昇格した。** + **2026-09-10 に同じ手順で昇格させ、この項は解消した** —— #63 以降に merge された + 11 本の PR すべてで 3 本とも success だった(実測)。 **現在どれが必須かをここには書かない** —— 記載場所は `CLAUDE.md` の 「機構として強制されていること」の表 1 行だけで、正本はさらにその先の GitHub 側の設定である From 427f8eea434b5ac9c9486447ff543e2332aa7413 Mon Sep 17 00:00:00 2001 From: yousan Date: Thu, 10 Sep 2026 20:50:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix(review):=20=E3=80=8C=E6=AE=8B=E3=82=8B?= =?UTF-8?q?=203=20=E6=9C=AC=E3=80=8D=E3=81=AE=E8=B6=B3=E3=81=97=E7=AE=97?= =?UTF-8?q?=E3=81=8C=E9=96=89=E3=81=98=E3=81=A6=E3=81=84=E3=81=AA=E3=81=8B?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=AE=E3=82=92=E7=9B=B4=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 必須外を 9 本に直したとき、両 README に「残る 3 本は…」/「The other three unrequired checks are…」と書いたが、9 - 5 = 4 で残余は 4 本である。名指し していたのは集約 CodeQL と Unity の結果公開 2 本の計 3 本で、4 本目の Publish the release は段落末尾にしか出てこない。「残る」/「other」は残余を 宣言する語なので、読者が数えると 8 本で止まる。 前の文("Three cover Web/Wasm")は残余を主張していなかったので、この閉じ 方は前の commit で入ったものである。4 本と書き、Publish the release が 後述であることを明示した。EN と JA は同じ形で間違っていたので、翻訳の ずれは無い。 あわせて roadmap の M6 の項の頭に「(解消済み)」を置いた。見出しが 「満たしていないもの」なので、走り読みで取り違えないようにする。 --- README.ja.md | 2 +- README.md | 6 +++--- docs/roadmap.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.ja.md b/README.ja.md index 6943ac8..e6c009e 100644 --- a/README.ja.md +++ b/README.ja.md @@ -247,7 +247,7 @@ Unity のレーンは Linux で走り、Windows の IL2CPP Player はローカ 表の外では、すべての pull request が `actionlint` / `shellcheck` / `PSScriptAnalyzer` とリポジトリ内リンクの検査を走らせ、CodeQL が C++ と C# を解析します。nightly の workflow は Linux 成果物の glibc の下限を再確認し、Windows と macOS で速いレーンを走らせ、固定した OpenCV の artifact が期限切れでないことを確かめます —— **誰も push していない間に壊れるもの**です。**この nightly は 2026-08-29 から毎日 schedule で走っています** —— 2026-09-10 時点で 13 回、直近 8 回は緑です。(以前ここには「まだ schedule で起動したことがない」と書いてありました。1 週間以上のあいだ偽で、**この種の記述は真でなくなっても何も赤くなりません。**) -**pull request で走るレーンのほとんどが merge を止めます。** 必須チェックは 24 本です: desktop 3 platform の契約・P/Invoke・sanitizer、Android・iOS・Web / Wasm のクロスビルド、lint の 4 job、CodeQL の 2 つ、Unity の 2 レーン、ブラウザでの E2E、そして 6 platform 分の配布物をビルド・組み立てる release の 7 job。9 本は意図的に必須にしていません。うち 5 本は Unity のレーンが消費する platform ごとのプラグインをビルドするもので、**どれかが失敗すると Unity のレーンは走ったうえで材料が無いことで赤くなり**、それが merge を止めます。Web / Wasm の 3 本(クロスビルド・ブラウザでの E2E・リリースの梱包)は **2026-09-10 に必須へ昇格しました** —— #63 以降に merge された 11 本の pull request すべてで 3 本とも緑になり、そのうち main でも走る 2 本は main の直近 6 run でも緑だったのを見てからです。残る 3 本は、言語ごとの解析を個別に必須にしてある `CodeQL` の集約 check と、pull request では skip される Unity の結果公開 job 2 本です。**したがって Web のレーンも、赤ければ merge を止めます。****昇格は証拠に従いますが、その証拠は誰かが見に行かないと出てきません。****skip された必須チェックは合格として通る**ので、その守りなしにそれらへ依存すると、壊れたビルドが通ってしまいます。**レーンは安定して緑になってから必須にします** —— ただし過去 2 回踏んだのは、その逆の形でした: **レーンを足したのに必須にしないまま置いたこと**が、「赤いのに merge できる」隙間そのものです。2026-08-29 までは Unity・lint・CodeQL の workflow がすべての pull request で走りながら必須ではなく、**赤いまま merge できました。CI が見ていることと CI が止めることは別で、ゲートなのは後者だけです。** 残る 3 つの workflow(`build-opencv`、`nightly`、`unity-probe`)は pull request では起動しないので、そもそも必須にできません。`release` は 2026-08-31 までその一覧にありました —— いまは pull request でも走ります。tag でしか走らなかった間に配布の経路に欠陥が 3 件たまり、**うち 1 件は「tag を打つとリリースが 1 件も作られない」というものでした。** その `Publish the release` job だけは必須にしません —— pull request では設計上 skip され、**skip は合格として通る**ので、必須にしても何も止まらないからです。 +**pull request で走るレーンのほとんどが merge を止めます。** 必須チェックは 24 本です: desktop 3 platform の契約・P/Invoke・sanitizer、Android・iOS・Web / Wasm のクロスビルド、lint の 4 job、CodeQL の 2 つ、Unity の 2 レーン、ブラウザでの E2E、そして 6 platform 分の配布物をビルド・組み立てる release の 7 job。9 本は意図的に必須にしていません。うち 5 本は Unity のレーンが消費する platform ごとのプラグインをビルドするもので、**どれかが失敗すると Unity のレーンは走ったうえで材料が無いことで赤くなり**、それが merge を止めます。Web / Wasm の 3 本(クロスビルド・ブラウザでの E2E・リリースの梱包)は **2026-09-10 に必須へ昇格しました** —— #63 以降に merge された 11 本の pull request すべてで 3 本とも緑になり、そのうち main でも走る 2 本は main の直近 6 run でも緑だったのを見てからです。残る 4 本は、言語ごとの解析を個別に必須にしてある `CodeQL` の集約 check、pull request では skip される Unity の結果公開 job 2 本、そしてこの節の末尾で述べる `Publish the release` です。**したがって Web のレーンも、赤ければ merge を止めます。****昇格は証拠に従いますが、その証拠は誰かが見に行かないと出てきません。****skip された必須チェックは合格として通る**ので、その守りなしにそれらへ依存すると、壊れたビルドが通ってしまいます。**レーンは安定して緑になってから必須にします** —— ただし過去 2 回踏んだのは、その逆の形でした: **レーンを足したのに必須にしないまま置いたこと**が、「赤いのに merge できる」隙間そのものです。2026-08-29 までは Unity・lint・CodeQL の workflow がすべての pull request で走りながら必須ではなく、**赤いまま merge できました。CI が見ていることと CI が止めることは別で、ゲートなのは後者だけです。** 残る 3 つの workflow(`build-opencv`、`nightly`、`unity-probe`)は pull request では起動しないので、そもそも必須にできません。`release` は 2026-08-31 までその一覧にありました —— いまは pull request でも走ります。tag でしか走らなかった間に配布の経路に欠陥が 3 件たまり、**うち 1 件は「tag を打つとリリースが 1 件も作られない」というものでした。** その `Publish the release` job だけは必須にしません —— pull request では設計上 skip され、**skip は合格として通る**ので、必須にしても何も止まらないからです。 ## 貢献とセキュリティ diff --git a/README.md b/README.md index c5af3eb..1d1325a 100644 --- a/README.md +++ b/README.md @@ -390,9 +390,9 @@ is what stops the merge. The three Web/Wasm checks — its cross-build, its brow end-to-end test and its release packaging — **were promoted on 2026-09-10**, after passing on all eleven pull requests merged since #63 and, for the two that also run on `main`, its last six runs. A red Web lane now stops a merge like any other. The other -three unrequired checks are the aggregate `CodeQL` check, whose two per-language -analyses are required individually, and the two Unity result-publishing jobs, which are -skipped on pull requests. +four are the aggregate `CodeQL` check, whose two per-language analyses are required +individually; the two Unity result-publishing jobs, which are skipped on pull requests; +and `Publish the release`, described at the end of this section. **Promotion follows evidence, but somebody has to go and look at it.** A skipped required check counts as passing, so depending on one without that guard would let a broken build through. A lane is only made required once it has been reliably green — but the failure diff --git a/docs/roadmap.md b/docs/roadmap.md index d4d54d0..8444df5 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1854,7 +1854,7 @@ Emscripten は既定で C++ 例外を無効にするので、`throw` は残る **満たしていないもの / 意図してやっていないことを明記する。** -- **M6 が足した 3 本の check を必須にするかは、M6 の時点では決着していなかった** +- **(解消済み)M6 が足した 3 本の check を必須にするかは、M6 の時点では決着していなかった** (`Web wasm32 (cross-build)` / `Web browser E2E` / `Package web-wasm`)。 `CLAUDE.md` の規律は「**安定して緑になったのを見てから必須へ加える**」で、 **モバイルの 2 本も M4 の直後は必須外で、後から昇格した。**