From 2a260890c2514f9fedfaaea1638a51d6b4fc1b78 Mon Sep 17 00:00:00 2001 From: toshiki31 Date: Fri, 20 Mar 2026 11:19:07 +0900 Subject: [PATCH 01/28] feat:add CLAUDE.md --- CLAUDE.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..a06b9d7c6e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,66 @@ +# WSH2026 作業指示 + +## 採点方式 +- GitHub Actions で Lighthouse を実行 +- 満点: \ +1. [Lighthouse](https://github.com/GoogleChrome/lighthouse) を用いて、次の2つを検査します + - ページの表示(900点満点) + - ページの操作(250点満点) +2. 検査したそれぞれのスコアを合算し、得点とします(1150点満点) + +## レギュレーション(絶対に守ること) +- ## レギュレーション + +次に挙げる「明確に禁じていること」と「明確に参加者へ要求すること」を守れなかった場合、順位対象外になります。 + +### 明確に許可されていること + +- **課題のレポジトリにあるコード・その他ファイルは、すべて変更してよい** + - API が返却する内容を変更して、新しい項目を追加したり既存の項目を削除したりしてよい + - ただし、運営が用意する fly.io 環境にデプロイする場合、fly.toml を変更してはならない +- **外部のサービス(SaaS など)を自由に利用してよい** + - 無料で使えるサービスは https://free-for.dev/ などで調べられます + - 有料のサービスを使った場合の費用は自己負担となり、運営は負担しません + +### 明確に禁じていること + +- **Google Chrome 最新版において、著しい機能落ちやデザイン差異を発生させてはならない** + - 提供された VRT (Visual Regression Tests) が失敗しないこと + - [./test_cases.md](./test_cases.md) に記載された手動テスト項目が失敗しないこと +- **シードに何らかの変更をしたとき、初期データのシードにある各種 ID を変更してはならない** +- **明らかな悪意を持って VRT と手動テスト項目を通過させるためのコードを書いてはならない** +- **競技終了後にデプロイしたアプリケーションを更新してはならない** +- **`GET /api/v1/crok{?prompt}` のストリーミングプロトコル (Server-Sent Events) を変更してはならない** +- **初期仕様の `crok-response.md` と同等の画面を構成するために必要な情報を Server-Sent Events 以外の方法で伝達してはならない** +- **運営が用意する fly.io 環境にデプロイする場合、`fly.toml` の内容を変更してはならない** + +### 明確に参加者へ要求すること + +- **順位が確定するまでは、アプリケーションにアクセスできる状態であること** + - 競技終了後にレギュレーションチェックを行います + - レギュレーションチェックのときにアプリケーションにアクセスできない場合は、順位対象外になります +- **API `POST /api/v1/initialize` にリクエストを送ると、データベースの内容が初期値にリセットされること** + - 採点サーバーは、データベースの内容が初期値であることを前提に計測をします + - 同等のデータを提供できるのであれば、機能落ちが発生しない範囲においてデータベースの内容は自由に書きかえて構いません + +- Google Chrome最新版で著しいUI差異・機能落ちを発生させない +- VRTと手動テストを不正に通過させるコードを書かない + +## 変更のルール +1. 変更は1施策ずつ /wsh-commit でコミットする +2. UIに触る変更の後は必ずVRTが自動実行される +3. ビルドが通らない状態でコミットしない + +## 優先施策(/wsh-analyze 完了後に記入) +- [ ] 未記入 + +## 禁止操作(レギュレーションを読んで追記) +- **Google Chrome 最新版において、著しい機能落ちやデザイン差異を発生させてはならない** + - 提供された VRT (Visual Regression Tests) が失敗しないこと + - [./test_cases.md](./test_cases.md) に記載された手動テスト項目が失敗しないこと +- **シードに何らかの変更をしたとき、初期データのシードにある各種 ID を変更してはならない** +- **明らかな悪意を持って VRT と手動テスト項目を通過させるためのコードを書いてはならない** +- **競技終了後にデプロイしたアプリケーションを更新してはならない** +- **`GET /api/v1/crok{?prompt}` のストリーミングプロトコル (Server-Sent Events) を変更してはならない** +- **初期仕様の `crok-response.md` と同等の画面を構成するために必要な情報を Server-Sent Events 以外の方法で伝達してはならない** +- **運営が用意する fly.io 環境にデプロイする場合、`fly.toml` の内容を変更してはならない** From 292b3133f96fb8dd81d2ed0eba7ccac94dfc4128 Mon Sep 17 00:00:00 2001 From: toshiki31 Date: Fri, 20 Mar 2026 13:11:08 +0900 Subject: [PATCH 02/28] =?UTF-8?q?build:=20webpack=E3=82=92production?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97?= =?UTF-8?q?minify=E3=83=BBtreeshaking=E3=83=BBasync=20splitChunks=E3=82=92?= =?UTF-8?q?=E6=9C=89=E5=8A=B9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/client/webpack.config.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/application/client/webpack.config.js b/application/client/webpack.config.js index 9fae72647f..aa91acd29f 100644 --- a/application/client/webpack.config.js +++ b/application/client/webpack.config.js @@ -25,7 +25,7 @@ const config = { ], static: [PUBLIC_PATH, UPLOAD_PATH], }, - devtool: "inline-source-map", + devtool: false, entry: { main: [ "core-js", @@ -36,7 +36,7 @@ const config = { path.resolve(SRC_PATH, "./index.tsx"), ], }, - mode: "none", + mode: "production", module: { rules: [ { @@ -60,7 +60,6 @@ const config = { }, output: { chunkFilename: "scripts/chunk-[contenthash].js", - chunkFormat: false, filename: "scripts/[name].js", path: DIST_PATH, publicPath: "auto", @@ -77,7 +76,7 @@ const config = { BUILD_DATE: new Date().toISOString(), // Heroku では SOURCE_VERSION 環境変数から commit hash を参照できます COMMIT_HASH: process.env.SOURCE_VERSION || "", - NODE_ENV: "development", + NODE_ENV: "production", }), new MiniCssExtractPlugin({ filename: "styles/[name].css", @@ -128,12 +127,14 @@ const config = { }, }, optimization: { - minimize: false, - splitChunks: false, - concatenateModules: false, - usedExports: false, - providedExports: false, - sideEffects: false, + minimize: true, + splitChunks: { + chunks: "async", + }, + concatenateModules: true, + usedExports: true, + providedExports: true, + sideEffects: true, }, cache: false, ignoreWarnings: [ From 24f799c71561f65113fe2e5023384ee4cc41014c Mon Sep 17 00:00:00 2001 From: toshiki31 Date: Fri, 20 Mar 2026 13:26:05 +0900 Subject: [PATCH 03/28] =?UTF-8?q?build:=20=E3=83=93=E3=83=AB=E3=83=89?= =?UTF-8?q?=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=81=AENODE=5FEN?= =?UTF-8?q?V=E3=82=92production=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97babel?= =?UTF-8?q?=E3=81=AEdevelopment=E3=83=95=E3=83=A9=E3=82=B0=E3=82=92?= =?UTF-8?q?=E9=80=A3=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/client/babel.config.js | 2 +- application/client/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application/client/babel.config.js b/application/client/babel.config.js index c3c574591a..88d50ec403 100644 --- a/application/client/babel.config.js +++ b/application/client/babel.config.js @@ -13,7 +13,7 @@ module.exports = { [ "@babel/preset-react", { - development: true, + development: process.env.NODE_ENV !== "production", runtime: "automatic", }, ], diff --git a/application/client/package.json b/application/client/package.json index 9f8e80a6a8..af2d3a5156 100644 --- a/application/client/package.json +++ b/application/client/package.json @@ -5,7 +5,7 @@ "license": "MPL-2.0", "author": "CyberAgent, Inc.", "scripts": { - "build": "NODE_ENV=development webpack", + "build": "NODE_ENV=production webpack", "typecheck": "tsc" }, "dependencies": { From 16c9a5fd340e5fc70116ce982c5d1ffa52c2d690 Mon Sep 17 00:00:00 2001 From: toshiki31 Date: Fri, 20 Mar 2026 13:41:18 +0900 Subject: [PATCH 04/28] =?UTF-8?q?build:=20babel=E3=82=BF=E3=83=BC=E3=82=B2?= =?UTF-8?q?=E3=83=83=E3=83=88=E3=82=92last=202=20Chrome=20versions?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97modules=E3=82=92false?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=A6Tree=20Shaking=E3=82=92=E6=9C=89?= =?UTF-8?q?=E5=8A=B9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/client/babel.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/client/babel.config.js b/application/client/babel.config.js index 88d50ec403..7c6373189b 100644 --- a/application/client/babel.config.js +++ b/application/client/babel.config.js @@ -4,9 +4,9 @@ module.exports = { [ "@babel/preset-env", { - targets: "ie 11", + targets: "last 2 Chrome versions", corejs: "3", - modules: "commonjs", + modules: false, useBuiltIns: false, }, ], From 9fe12c7f31ab961ac224ef0cc50e3deafb9ec336 Mon Sep 17 00:00:00 2001 From: toshiki31 Date: Fri, 20 Mar 2026 13:56:16 +0900 Subject: [PATCH 05/28] =?UTF-8?q?perf:=20script=E3=82=BF=E3=82=B0=E3=81=AB?= =?UTF-8?q?defer=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=A6HTML=E3=83=91?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=81=AE=E3=83=96=E3=83=AD=E3=83=83=E3=82=AD?= =?UTF-8?q?=E3=83=B3=E3=82=B0=E3=82=92=E8=A7=A3=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/client/src/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/client/src/index.html b/application/client/src/index.html index 3d949e7473..74b6206a16 100644 --- a/application/client/src/index.html +++ b/application/client/src/index.html @@ -4,7 +4,7 @@ CaX - +