💻 システム開発
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 ずつ分割) /_putSingleWithRetry5回リトライ / 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経由に統一 → リスト位置ずれ根治_statusJustSavedAt5→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チャンク経由 /renderCallListArray.isArray ガード /filterCL保険 / showCallImportHistory バッチ一括編集ボタン /_clImportBatchEdit/_clImportBatchApply/_clImportBatchDelete/_clBatchTargets/clTabNext/_clCellKeydown/_clKeyboardHandler/_statusJustSavedAt30秒拡張 - /Users/oogushiyuuki/株式会社SCALE/scale-lead/pages.js —
_renderCapacityMonitor/ 設定ページに 💾 容量モニタリングカード + 📦 案件アーカイブボタン /_sendHeartbeatsaveMembers(S())経由+1件以下skip / heartbeat 30秒+refresh 30秒 /_onlineDashTimerFmt「1h 54m」 /_onlineDashManualRefresh/_onRemoteChange_rerenderKeepScroll化 / オンラインダッシュ自動更新30秒 /_slackGetOrCreateDailyThreadD1直接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基準に戻すと朝早く前日扱い)
次のセッションで取り得る選択肢
- ユーザー検証FB待ち — v9.232/233/234 を本番で動作確認
- v9.234 続き (スプレッドシート体感化 第2弾) — 仮想スクロール (10万件OK) + 全列インライン編集 + 範囲選択+Ctrl+C/V (各 1-2日級)
- ListPool 列順カスタマイズ (見送り中の宿題・v9.212から)
- Lv2 同期テストハーネス — デプロイ前自動シナリオテスト (2-3h)
- Lv3 アーキテクチャ簡素化 (3層→2層) — 1-2日級大規模リファクタ
- トレースクリーンアップ深化 — 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スレッド集約」状態に到達。