💻 システム開発

2026-05-14_SCALE_CRM_v9.219-v9.234_作業ログ

最終更新 2026年05月14日 / 31_システム開発部/SCALE_CRM/2026-05-14_SCALE_CRM_v9.219-v9.234_作業ログ.md

2026-05-14 SCALE CRM 改修ログ(v9.198〜v9.234 / 37バージョン連続デプロイ)

15:13 - /handoff 実行

対象システム

SCALE CRM (scale-lead) — 本日 v9.198→v9.234 まで 37バージョン 連続デプロイ

セッション背景

2026-05-14 朝、前セッションから v9.198-v9.218 (21V) 引き継ぎで開始。
- ListPool 8000件保存エラー / D1 行制限突破
- members 縮小事故からの復旧
- LinkedIn 全面リニューアル
- 容量モニタリング・整合性 watchdog
- パートナー報告 (重い・位置ずれ・3回押し) への緊急対応
- 日次報告スレッド分裂バグ根治
を 1セッションで完走。

完了タスク(v9.219〜v9.234 / 16V 詳細)

v9.219-v9.223: 構造的バグ 3件根治

  • v9.219: D1 1MB 行制限突破 — _putLargeWithChunks チャンク分割保存 (800KB超は 500KB ずつ分割) / _putSingleWithRetry 5回リトライ / 413 サーバー応答 / _initChunkedJoin 起動時結合 / audit_skip 拡張
  • v9.220: sentinel "__CHUNKED__" 混入による表示エラー (calls.filter is not a function) を 8経路で根治 (D()/起動時掃除/BC/_d1PollTick/forceFetch/_initChunkedJoinフォールバック/render Array.isArray ガード)
  • v9.221: members 縮小事故 5層防御 (S/サーバー/BC/_d1PollTick/_initSupabase) — 別タブ heartbeat の自分1人だけ上書きを物理ブロック
  • v9.222: heartbeat の S() 防御迂回バグ根治 — 直接 fetch PUT を廃止し saveMembers(S()経由) に統一 + サーバー側「1件以下 PUT は X-Allow-Shrink 必須」
  • v9.223: 起動時 hydrate — _appBoot 冒頭で localStorage を _cache に即時同期 → 一瞬1名表示を解消

v9.224-v9.225: LinkedIn 全面リニューアル

  • v9.224: 30+項目を1リリースで投入 — アカウント管理ページ新設 (linkedin_accounts 案件別) / 申請リスト4垢対応 (進捗バー+一括振分) / 承認リスト=架電リスト相当 13機能 (CSV取込/5回オファー履歴/詳細モーダル/プリセット5種/KPIカード/一括操作/取込履歴/ゴミ箱グループ化/Slackアポ通知) / 文面テンプレタグ化+反応率自動集計 / 週次月次自動集計 / 分析レポート LinkedIn版SCALEランク+アカウント別効率+文面別アポ率 Top10 / ListPool→LinkedIn申請リスト振分関数
  • v9.225: 1人複数垢運用モデル最適化 — 「⚡ 4垢一括追加」ボタン+運用メンバー別サマリ表示+owner ラベル名「運用メンバー」化

v9.226: 7点改修

  • ListPool分配時に取込メタ(imported_at/by/from/importBatchId)付与 → 取込履歴に乗る
  • 取込履歴モーダルに「✎ 一括編集」「🗑 バッチ削除」ボタン (担当者/セグメント変更/バッチ全件ゴミ箱)
  • ListPool 経由バッチを橙色識別
  • linkedin_pool セクション削除
  • LinkedIn アカウント管理シンプル化 (ガイドカード+4垢一括ボタン削除)
  • 均等抽出「分配済を除外」チェックボックス
  • オンライン状況リアルタイム化(heartbeat 15s + 手動更新+最終時刻表示)

v9.227: ListPool→LinkedIn分配自動切替

  • 案件 option に data-channel + _lpDistRefreshMembers を channel 判定で LinkedIn アカウント切替
  • _lpExecuteDistributeLinkedIn 新設 — acc:* prefix で linkedin_requests へ振分け

v9.228: 整合性 watchdog

  • 起動 3秒後+5分ごと _watchdogCheck() 実行 / 既知 4パターン (sentinel/非配列/sb残骸/members 1件以下) 自動修復
  • 重大時のみ「🛡 整合性チェック」toast 通知

v9.229: 容量モニタリング

  • 設定ページに「💾 容量モニタリング」カード常設 (admin 専用)
  • localStorage 使用量+進捗バー / _cache キー数 / チャンク化済キー数 / Top10 表示
  • 操作ボタン3つ (容量整理/再読込/整合性チェック)
  • Cloudflare ビルド月500回制限の誤解を解消 (wrangler pages deploy 経由は対象外)

v9.230: LinkedIn 4点強化

  • 申請リスト詳細モーダル showLRDetail (承認リスト相当)
  • 行クリックで詳細展開
  • 申請日カレンダー showLiCalendar (28日ヒートマップ+アカウント別)
  • 文面テンプレ A/B 比較 showLiTmplVariations (末尾A/B/C自動グルーピング+🏆勝者判定)

v9.231: 雑多3点

  • 従業員規模 特殊表記対応 (「100名以下」「20-50名」「50人〜」)
  • トレース静音モード (_setVerboseTrace) / デフォルトで真因確定済ログ抑制
  • 案件アーカイブ機能 archiveProject / unarchiveProject / showArchivedProjectsModal

v9.232: パートナーFB対応【緊急】

  • heartbeat 15→30秒・refresh 15→30秒・オンライン10→30秒・watchdog 5→10分 / CPU 半減
  • _onRemoteChange_rerenderKeepScroll 経由に統一 → リスト位置ずれ根治
  • _statusJustSavedAt 5→30秒に拡張 → ステータス3回押し問題根治
  • _onlineDashTimerFmt 「1:54」→「1h 54m」表記明確化

v9.233: スプレッドシート体感化 第1弾

  • clTabNext 関数新設 (未定義だった) / Tab/Shift+Tab で左右セル・Enter で下行・Ctrl矢印で4方向・Escape キャンセル
  • Ctrl+Z で行レベル Undo (call_list ページ限定・既存 _undo_history 活用)

v9.234: 日次報告スレッド分裂バグ根治

  • _slackGetOrCreateDailyThread に D1 直接 GET フォールバック追加
  • 親メッセージ作成成功直後に即時 D1 PUT (debounce バイパス・keepalive:true)
  • 「中断→再開」で別スレが立つ問題を 3層防御で集約

編集ファイル

  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/core.js — _putLargeWithChunks/_initChunkedJoin/_putSingleWithRetry/_shouldShowPutFailToast/_isChunkedSubKey/_watchdogCheck/_setVerboseTrace/archiveProject/unarchiveProject/showArchivedProjectsModal / D() sentinel防御 / BC onmessage / _d1PollTick / forceFetchCallListFromD1 / _initSupabase / S() members縮小防御 / _appBoot hydrate / getVisibleProjects archived フィルタ
  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/list_pool.js — _lpFlushToD1 チャンク経由 / _lpDistOnProjectChange/_lpDistApplyType/_lpDistRefreshAccounts/_lpExecuteDistributeLinkedIn / 取込メタ distMeta 付与 / 「分配済除外」チェック / 従業員規模 特殊表記対応 (_lpClassifyEmployee 抽出)
  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/calllist.js — _flushCallListToD1 チャンク経由 / renderCallList Array.isArray ガード / filterCL 保険 / showCallImportHistory バッチ一括編集ボタン / _clImportBatchEdit/_clImportBatchApply/_clImportBatchDelete/_clBatchTargets / clTabNext/_clCellKeydown/_clKeyboardHandler / _statusJustSavedAt 30秒拡張
  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/pages.js — _renderCapacityMonitor / 設定ページに 💾 容量モニタリングカード + 📦 案件アーカイブボタン / _sendHeartbeat saveMembers(S())経由+1件以下skip / heartbeat 30秒+refresh 30秒 / _onlineDashTimerFmt 「1h 54m」 / _onlineDashManualRefresh/_onRemoteChange _rerenderKeepScroll化 / オンラインダッシュ自動更新30秒 / _slackGetOrCreateDailyThread D1直接GETフォールバック+即時PUT
  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/lib/pages_linkedin.js — LinkedIn 大規模リニューアル全機能 (アカウント管理/申請リストv2/承認リストv2=架電リスト相当/文面テンプレv2/週次月次v2/分析レポートv2/_lpDistributeToLinkedIn) / showLRDetail/showLiCalendar/showLiTmplVariations (v9.230)
  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/service.js — COCREATE_VERSIONS v9.219〜v9.234 (16V 追加)
  • /Users/oogushiyuuki/株式会社SCALE/scale-lead/functions/api/data/[key].ts — AUDIT_SKIP_KEY_PATTERNS 拡張 (list_pool_companies/chunk/_chunked_meta) / MAX_VALUE_BYTES 900_000 で 413 拒否 / members 縮小拒否 (1件以下 X-Allow-Shrink 必須)

デプロイ・バックアップ

  • 本日のデプロイ回数: 37回 (v9.198〜v9.234)
  • 最終デプロイ: 2026-05-14 15:55 (v9.234)
  • 本番URL: https://crm.scale-group.co.jp/
  • 最新バックアップ: ~/scale-lead-backups/scale-lead-2026-05-14-1555-pre-v9.234-slack-thread.tar.gz

試したこと・学び(重要)

D1 1MB 行制限への気付き

  • v9.218 で「localStorage 諦め D1 のみ」に切替たが、D1 側 SQLite 単一行 1MB 制限を見落としていた
  • 8000件 JSON (6-8MB) を1行 PUT → INSERT 500 → 3回リトライ全滅 → 連続失敗 toast
  • v9.219 でチャンク分割保存 + サーバー側 413 拒否ゲートで根治

sentinel "__CHUNKED__" 文字列の混入経路

  • v9.219 の chunked モード本体キーが sentinel 文字列で、BroadcastChannel / _d1PollTick / forceFetchCallListFromD1 / 古い localStorage 残骸 などの経路で _cache文字列のまま混入
  • 後段 .filter() で「filter is not a function」エラー → 表示エラー画面
  • v9.220 で 8経路全部に sentinel ガード追加で根治

heartbeat の S() 防御迂回問題

  • v9.221 で S() に members 縮小防御入れたが、_sendHeartbeat/api/data/members を直接 fetch PUT していて S() を完全迂回
  • D1 が事故で 1件になると heartbeat が 1件で上書きし続けて永久ループ
  • v9.222 で saveMembers (S()経由) に統一 + 「members.length<2 で skip」+ サーバー側「1件以下 PUT は X-Allow-Shrink 必須」で根治

パートナー報告 (重い・3回押し)

  • v9.226 の heartbeat 15秒+refresh 15秒+オンライン 10秒再描画 が重なって CPU 負担増 + ステータス変更タイミングと poll が衝突 → 「3回押さないと反映」
  • v9.232 で全部 30秒に戻し + _statusJustSavedAt ガード 5→30秒拡張

日次報告スレッド分裂

  • _slackGetOrCreateDailyThread_cache から ts 取得を試みるが、稼働開始直後 (debounce 300ms前) にリロード/タブ閉じると D1 未保存
  • 次回 _initSupabase で取れず新スレッド作成
  • v9.234 で D1 直接 GET フォールバック + 親メッセージ作成直後に即時 D1 PUT (keepalive) で根治

ユーザーFB(重要なやつ全部)

容量・データ管理

  • 「プールに8000件入れたら保存できませんでした toast」 → v9.219 チャンク分割
  • 「⚠ サーバー同期失敗 連続失敗 N回」 → v9.219 リトライ強化+toast抑制
  • 「リストプール/架電リストが表示エラー calls.filter is not a function」 → v9.220 全経路 sentinel ガード
  • 「容量どれくらいまで大丈夫?」 → 上限の目安提示 (1案件 5万件 / D1 5GB / 案件 600件 余裕)
  • 「Cloudflare 有料化のメリット?」 → 月500ビルド制限は wrangler pages deploy 対象外と明示
  • 「同期されない・リロードで消える問題の原因?」 → 6カテゴリ + 過去 v9.x 全パターン解説

members 縮小事故

  • 「メンバー管理の画面 8名が大串1名に消えてた」 → v9.221 5層防御 + v9.222 heartbeat根治 + v9.223 起動時 hydrate

LinkedIn リニューアル

  • 「LinkedIn 全部一気に実装」 → v9.224 30+項目
  • 「4垢運用は 1人 (細川) で4垢」 → v9.225 1人複数垢モデル最適化
  • 「リストプールから架電リストに入れた場合も取込履歴に反映」 → v9.226 ListPool 分配メタ付与
  • 「取込履歴から間違ったものを一括編集」 → v9.226 一括編集モーダル
  • 「均等抽出で既に DL してるものは含まれる?」 → v9.226 分配済除外チェック
  • 「LinkedIn アカウント管理のガイドカード+4垢一括ボタンいらない」 → v9.226 シンプル化
  • 「オンライン状況のデータが最新? リアルタイム?」 → v9.226 リアルタイム化 / v9.232 軽量化
  • 「LinkedIn 案件もリストプールから振分け」 → v9.227 自動切替

パフォーマンス・体感

  • 「架電システムが重い / リスト位置が勝手にずれる / ステータス変更3回押さないと」 → v9.232 緊急対応
  • 「1:54 は 1時間 54分?」 → v9.232 「1h 54m」表記化
  • 「最速でスピーディーに / スプレッドシートのように」 → v9.233 第1弾 (キーボードナビ+Ctrl+Z)
  • 「日次報告で 中断→再開で別スレ立つ / 全部集約させて」 → v9.234 D1直接GET+即時PUT で集約

その他

  • 「全部順番に実装して」 → v9.228-231 連続投入

注意ポイント・退化リスク(絶対守る)

大型データ・チャンク関連

  • CHUNK_THRESHOLD_BYTES = 800KB / CHUNK_SIZE_BYTES = 500KB / CHUNK_SENTINEL = "__CHUNKED__" を変えない (サーバー 900KB 制限のマージン)
  • list_pool_companies / chunk / _chunked_meta の audit_skip を外さない (D1 容量爆発防止)
  • _isChunkedSubKey のスキップ条件を緩めない (chunk_N/chunked_meta/sentinel を通常 forEach で parse すると破壊)
  • _initChunkedJoin は forEach の前に呼ぶ 順序を守る
  • initChunkedJoin のフォールバックは list_pool_companies / proj*_call_list のみ (他キーは配列前提でないので [] セットしない)

sentinel 防御

  • D() の sentinel ガードを外さない — 全画面の D('xxx', []) 呼び出しがこの防御に依存
  • BC onmessage / _d1PollTick / forceFetchCallListFromD1 の sentinel スキップを消さない

members 縮小防御 (v9.221-223)

  • S() の members 縮小防御 (3件以上→1件以下 を block) を外さない
  • サーバー側 members PUT の「1件以下は X-Allow-Shrink:1 必須」 を外さない
  • BC onmessage の members 縮小ブロック条件 (2件以上から減少) を緩めない
  • _d1PollTick / _initSupabase の members 縮小防御を外さない
  • _appBoot 冒頭の localStorage→_cache ハイドレートを消さない (一瞬1名表示再発)
  • heartbeat の S() 経由化 + members.length<2 で skip を維持 (直接 fetch PUT に戻すと再発)

パフォーマンス系 (v9.232)

  • heartbeat 30秒・refresh 30秒・オンライン 30秒・watchdog 10分 を短くしない (重さ復活)
  • _statusJustSavedAt ガード 30秒 を縮めない (3回押し問題再発)
  • _onRemoteChange/_flushPendingRemoteRender の _rerenderKeepScroll 経由化を維持 (位置ずれ防止)

Slack 日次報告 (v9.234)

  • _slackGetOrCreateDailyThread の D1 直接 GET フォールバック+即時 PUT を外さない (中断→再開で別スレ再発)

既存ルール (継続)

  • CONNECTED_ST = ['失注','育成','資料請求','アポ獲得','メール日程調整'] (担当不在の再追加禁止)
  • PM担当セレクト・Slack招待で大串/細川 fallback の再追加禁止 (v9.193)
  • getMembers() merge順序 {...dm,...stored[idx]} (stored優先)
  • today() = _ymdLocal(new Date()) 必須 (UTC基準に戻すと朝早く前日扱い)

次のセッションで取り得る選択肢

  1. ユーザー検証FB待ち — v9.232/233/234 を本番で動作確認
  2. v9.234 続き (スプレッドシート体感化 第2弾) — 仮想スクロール (10万件OK) + 全列インライン編集 + 範囲選択+Ctrl+C/V (各 1-2日級)
  3. ListPool 列順カスタマイズ (見送り中の宿題・v9.212から)
  4. Lv2 同期テストハーネス — デプロイ前自動シナリオテスト (2-3h)
  5. Lv3 アーキテクチャ簡素化 (3層→2層) — 1-2日級大規模リファクタ
  6. トレースクリーンアップ深化 — v9.231 で静音モード追加したが、まだ常時ログが多い箇所を整理

引き継ぎファイル

/tmp/handoff_20260514_151326.txt


累積効果まとめ(v9.219〜v9.234 / 16V)

構造的バグ根治: D1 1MB行制限 / sentinel混入 / members縮小事故 / heartbeat S()迂回 / 起動時hydrate不足
LinkedIn全面リニューアル: アカウント管理+申請4垢+承認=架電リスト相当+テンプレタグ化+分析SCALEランク+ListPool連携
ListPool 改善: 分配メタ付与+取込履歴一括編集+均等抽出分配済除外+linkedin_pool削除+LinkedIn分配自動切替
運用品質: 整合性watchdog+容量モニタリング+案件アーカイブ+トレース静音モード+正規化精度
パフォーマンス: heartbeat 30s/refresh 30s/オンライン 30s/watchdog 10min/_statusJustSavedAt 30s
スプレッドシート体感化 第1弾: Tab/Enter/Ctrl矢印/Escape/Ctrl+Z Undo
Slack 日次報告集約: 中断→再開で別スレ立たない (D1直接GET+即時PUT)
LinkedIn 機能継続強化: 申請詳細モーダル+カレンダー+テンプレA/B 比較

→ SCALE CRM が「大型データ無限件OK + 構造バグ根治 + LinkedIn 業務本格運用可能 + スプレッドシート的操作 + リアルタイム同期保証 + 1スレッド集約」状態に到達。