🚀 開発環境が更新されました。以下のPRがマージされました。
#オプチャグラフ
#518: [STG] オープンチャットの長期成長を分析できる詳細分析ページを追加(数年かけてじわじわ伸びる部屋を発見)
---
## 何ができるか
オープンチャットに詳しいメンター・管理者・データ分析者向けの「**詳細成長分析**」を、試験運用版の **分析Labs** に追加します。URL は **`/labs/growth`**、入口は **`/labs`** ページの先頭カード(+トップページのヒーローにも上級者向けの控えめな導線を設置)。通常のランキング(毎時 / 24時間 / 週間)では埋もれてしまう、**長期で伸び続けている部屋**を見つけられます。
- **期間の増加**: 3ヶ月 / 半年 / 1年 / 全期間 / 任意期間 の増加数・増加率ランキング。多い順・少ない順、カテゴリ・キーワードで絞り込み。各窓は *始点にも存在した部屋* だけを対象にします(既定 1年)。
- **じわじわ成長**: 数年かけて安定して伸びた部屋を抽出するスコア(直線性 × 継続年数 × 増加量、途中の暴落は減点)。急騰→崩落した部屋ではなく、`/oc/63267` のように「遅いが極めて安定して数年伸び続ける部屋」が上位に出ます。登録時期で優劣が出る「全期間」を避け、既定は **任意期間 2023-10-30〜最新** の固定窓で公平に比較します。
専門機能のため検索避け(noindex)にしています。
## 仕組み(重い処理でも待たせ方を良くする設計)
全ルーム横断・期間指定の集計は統計データ(約1億行)に対して重く、数十秒かかります。通常の高速ランキングとは別物です。そこで:
- 集計を open_chat_id レンジで分割し、**シンプルなポーリング**で1チャンクずつ進めながら、**本物の進捗%**(例「分析中 76%・4,544件 集計済み・7秒」)とプログレスバーを表示。**中止**して条件を変え、再検索できます。
- **端末スリープや一時的な通信断でも、復帰後にサーバ側の計算済みデータから「続きから」自動再開**します(最初からやり直しになりません。再接続中は専用メッセージを表示)。
- 完成した結果は一括取得してクライアント側で無限スクロール表示。毎時更新なので同一 URL クエリは **CDN キャッシュ**されます(`checkLastModified`)。→ 重い計算は「条件 × 時間帯」で実質1回だけ。**cron・事前計算・新テーブルは不要**。
## 主な変更
- API 2本: 進捗ポーリング `analysis-status`(no-store)/ 結果取得 `analysis-result`(CDN キャッシュ)。中止はクライアント側の AbortController。— AdvancedGrowthAnalysisApiController ・ AdvancedGrowthAnalysisService
- 指標計算(純粋関数)+ phpunit 8件 — GrowthMath ・ テスト
- 統計集計(SQLite)/ 部屋メタ(MySQL)のリポジトリを Interface とセットで追加・DI バインド
- ページ ReactAnalysisPageController と React(`/ranking` と同一バンドルを再利用し、React Router で `/labs/growth` を出し分け)
- **/labs 連携**: labs_content.php の先頭に専用スクリーンショット付きカードを追加。top_content.php のトップページヒーローに控えめな「分析Labs」導線(ja のみ)
- 設計詳細: app/Services/Analysis/README.md
## UI / 表示の調整
- ヘッダー・操作バー・リストを本文と同じ中央カラム(812px)に整列。PC幅で要素が横に広がりすぎる問題を解消。
- リスト各行の不可視クリック領域が右にはみ出して起きていた**横スクロール(スマホ/PC)を解消**。
- 操作バーはコンパクトなセグメント/ピル型。集計中は「進捗%+集計済み件数+経過秒+中止」、再接続中は専用表示。
## 動作確認
- phpunit(GrowthMath 8件)green
- ローカルの実データ(約1億行・2.6年・24万室)で API を curl 検証(増加 / じわじわ・各ソート・昇降順・カテゴリ / キーワード・CDN ヘッダ)
- 実ブラウザ(Chrome headless)で確認: `/labs/growth` の idle / 実行中(進捗%+中止)/ 増加・じわじわ結果 / スマホ縦 / PC幅の整列、`/labs` 先頭カード、トップページ導線。横スクロールは 375・803・1440px で `scrollWidth === clientWidth` を確認
---
🤖 Generated with Claude Code (claude-opus-4-8[1m])
Posted from: `user-B550M-Pro4:~/repos/oc-graph-mock`