💻 システム開発
2026-05-14_SCALE_CRM_v9.198-v9.219_作業ログ
最終更新 2026年05月14日 / 31_システム開発部/SCALE_CRM/2026-05-14_SCALE_CRM_v9.198-v9.219_作業ログ.md
2026-05-14 SCALE CRM 改修ログ(v9.198〜v9.219 / 22バージョン連続デプロイ)
10:00 — v9.219 デプロイ(D1 1MB行制限を根治する大型データ チャンク分割保存)
ユーザーFB(ラリー最小化指示)
「リストプール / プールに8000件入れたら 保存できませんでした toast / プールから架電リスト移行時 ⚠ サーバー同期失敗 (call_list) 連続失敗 2回 / 何回もラリーしてるから一気にやれること全部やって解決して / 有料化すれば解決するならそれも検討」
真因確定(v9.218 が片肺だった理由)
- v9.218 で「localStorage 諦め → D1 のみ運用」に切替えたが、D1 側 (SQLite) の単一行サイズ上限 1MB を見落としていた
- 8000件 × 800B/件 ≈ 6-8MB の JSON を 1行 PUT →
INSERT failed500 → 3回リトライ全部 NG → 連続失敗 toast - これは Cloudflare D1 の物理制約(Free/Paid 共通の SQLite 仕様)→ 有料化で解決しない
投入した保険的修正(10経路 / 1リリース)
- チャンク分割保存システム
_putLargeWithChunks(key, valStr, reason, opts)新設(core.js)
- 800KB 超は 500KB ずつ分割 →<key>_chunk_0..N+<key>_chunked_meta+<key>(sentinel "__CHUNKED__")の3点セット - 起動時 chunked 結合
_initChunkedJoin(data)新設 /_initSupabase受信直後にメタ検出 → chunk 結合 →_cache[base]復元 - _d1PutWithRetry 透過ルーティング 800KB 超は自動で _putLargeWithChunks へ
- リトライ 3→5回 指数バックオフ 500/1500/4000ms → 500/1500/4000/10000/30000ms(瞬間障害復活)
- 413 サーバー応答対応 サーバー側
/api/data/[key].tsが 900KB 超を 413 で早期拒否 → クライアント即チャンクへ切替 - 連続失敗 toast 抑制
_shouldShowPutFailToast(k)新設 / 同一キー 30秒以内は出さない - audit_log 二重書き込み防止
AUDIT_SKIP_KEY_PATTERNSに list_pool_companies / chunk / _chunked_meta 追加 - _lpFlushToD1 / _flushCallListToD1 書き換え 両方とも
_putLargeWithChunks呼び出しに変更 - 起動時クリーンアップ強化
_autoCleanupOldLocalStorageに audit_log_global / undo_history / snapshots / voice_recordings 追加 - 観測トレース全経路
[PUT-DIAG]/[CHUNK-PUT]/[CHUNK-LOAD]/[D1-PUT-ROUTE]/[FLUSH-CL-D1 v9.219]/[LP-FLUSH-D1 v9.219]
退化リスク(v9.219 で守るルール)
- CHUNK_THRESHOLD_BYTES = 800KB / CHUNK_SIZE_BYTES = 500KB を変えない(サーバー 900KB 制限のマージン)
- CHUNK_SENTINEL =
"__CHUNKED__"を変えない(旧データの整合性チェックに使う) _isChunkedSubKeyのスキップ条件を緩めない(chunk_N / chunked_meta / sentinel を通常 forEach で parse すると破壊)- _initChunkedJoin は forEach の前に呼ぶ 順序を守る(_cache[base] が結合済みの状態で forEach が走る)
- list_pool_companies / chunk / _chunked_meta の audit_skip を外さない(D1 容量爆発・v9.112 の再発防止)
有料化判断材料(ユーザーFB「有料化すれば解決するなら検討」への回答)
- Cloudflare Workers Paid ($5/月) で変わるのは CPU time 10ms → 50ms-1000ms だけ
- D1 行サイズ 1MB は Free/Paid 共通 の SQLite 物理制約
- → 今回の問題には課金不要・v9.219 のチャンク分割で完全解決
- 将来 ListPool が 50万件規模になった場合の有料化検討候補:
- D1 Paid: $0.001/100K reads, $1/M writes, $0.75/GB-month — ストレージ 5GB→無制限
- Workers KV (代替): 25MB/value 上限 → ListPool 用には不向き
- Workers R2 (代替): ファイル全体保存 → JSONブロブ用に有効・$0.015/GB-month + free egress
編集ファイル
core.js: 約180行追加(_putLargeWithChunks / _initChunkedJoin / _putSingleWithRetry / _shouldShowPutFailToast / _isChunkedSubKey)+ _d1PutWithRetry リトライ強化 + _initSupabase forEach スキップ + _autoCleanupOldLocalStorage 拡張 + _flushCallListToD1 書き換えlist_pool.js: _lpFlushToD1 を _putLargeWithChunks 呼び出しに書き換え(フォールバック付き)service.js: COCREATE_VERSIONS 最上段 v9.219 エントリ追加functions/api/data/[key].ts: AUDIT_SKIP_KEY_PATTERNS 拡張 + MAX_VALUE_BYTES = 900_000 で 413 拒否
バックアップ
~/scale-lead-backups/scale-lead-2026-05-14-0957-pre-deploy.tar.gz(v9.218 状態)~/scale-lead-backups/scale-lead-2026-05-14-0958-post-deploy.tar.gz(v9.219 デプロイ後)~/scale-lead-backups/scale-lead-2026-05-14-1010-pre-v9.219-chunked.tar.gz(v9.218 から v9.219 直前)
09:41 - /handoff 実行
対象システム
SCALE CRM (scale-lead) — 本日 v9.198→v9.218 まで 21バージョン 連続デプロイ
セッション背景
2026-05-13 (前日) の v9.171-197 (27V) を引き継ぎ、本日は 架電報告FMT刷新 + SCALE List Pool MVP + 多数の UX 改善 + 大型データ容量対策 を実施。
完了タスク(v9.198〜v9.218 / 21V)
架電報告 FMT 系
- v9.198: 架電報告FMT刷新 + script→talkScript (自由記述・失注/育成/資料請求/メール日程調整に表示)
- v9.202: タイトルに「架電報告」復活 + 項目絵文字を全削除 (タイトルアイコンのみ維持: 🚫❌⏳📎📧)
SCALE List Pool (新機能)
- v9.199: List Pool MVP デプロイ (新ファイル list_pool.js / グローバルD1 list_pool_companies / CSV取込+フィルタ+均等抽出+案件分配+使用状況可視化+deep link / PM限定)
- v9.211: ListPool CSV ヘッダマップを SALESNOW_HEADER_MAP 参照に / 列順を架電リスト並びに統一 / 「→ 架電リスト」明示ボタン / 架電リストに地域(prefecture)列追加
- v9.212: ListPool 並び替え機能 (列クリックソート + デフォルト取込順)
- v9.213: ListPool データ連携完全化 (分配時補完更新) + 従業員/売上 自動正規化 + 取込バッチ管理フィルタ
- v9.215: ListPool消失バグ根治 (_safeSetItem 3段階クリーンアップ + 保護キー明示 + D1強制PUT + CSV取込即時PUT + 警告改善)
- v9.217: 【緊急】容量不足救済 (起動時自動クリーンアップ + 🧹容量整理ボタン + 🔄D1復元ボタン + 保護キー強化)
- v9.218: 大型データ(>4MB)は localStorage 諦め D1 のみ運用 (8000件超対応・_lpSavePool/_initSupabase 大型判定 + 警告toast改善)
架電リスト UX 改善
- v9.200: 本日の架電履歴フィルタ + 担当者自動上書き + ステータスモーダル抜け道ボタン
- v9.201: ロールバック「ステータスを取り消す」無条件まっさら化 + 担当者自動上書き全経路化
- v9.203: today() UTC→ローカル基準 (朝早い時間帯で前日扱いになる事故根治)
- v9.204: today_called 除外(重複/NG/架電NG) + 誤タップ担当者上書き防止(newVal!==oldVal + ロールバック復元)
- v9.205: 架電時間帯「~9:00」追加 + 9時前の自動判定
- v9.210: 上部集計バグ根治(ステータス変更後の全体再描画) + リロード後ページ/スクロール復元 + ListPool大幅拡張(CSV50項目/列10追加/フィルタ4追加/均等抽出複数キー/分配セグメント)
- v9.214: ホイール最下端→右スクロール挙動廃止 (縦余地ある間は常に縦動作)
- v9.216: ゴミ箱グループ化(削除バッチ別 + 一括復元/削除 + チェックボックス選択UI + セグメント/担当者表示)
バージョン自動更新システム
- v9.206: 新バージョン自動検知バナー(5分ごとチェック+クリック更新)
- v9.207: 5秒カウントダウン後 自動リロード(入力中保護 + 5分snooze + 入力focus待機)
- v9.208: ステータス保存消失調査(保存検証トレース + プリセット除外警告 + BC/D1Poll 5秒上書きブロック)
- v9.209: バナーver取得を service.js から(index.html コメント v9.147 誤拾い修正)
編集ファイル
- /Users/oogushiyuuki/株式会社SCALE/scale-lead/core.js
- today() ローカルタイム化
- _safeSetItem 3段階クリーンアップ + 保護キー + 大型データ D1救済PUT
- _initSupabase 大型データ localStorage スキップ
- _autoCleanupOldLocalStorage / _emergencyCleanupLocalStorage / _emergencyRestoreFromD1 新設
- 自動アップデート バナー (cache-bust検知+5秒カウントダウン+リロード)
- リロード復元 (sessionStorage に page/project/scrollTop 保存)
- /Users/oogushiyuuki/株式会社SCALE/scale-lead/calllist.js
- 架電報告 FMT 刷新 + 絵文字削減
- 本日の架電履歴フィルタ + 担当者自動上書き + ロールバック
- today_called 除外条件 + 誤タップ防止
- ~9:00 時間帯追加
- 上部集計再描画
- ホイール挙動修正
- ゴミ箱グループ化 (showCallTrash 大幅書き換え + _clTrashRestoreSelected/_clTrashPurgeSelected/_clTrashRestoreGroup/_clTrashPurgeGroup 新設)
- 容量整理/D1復元 ボタン
- 地域(prefecture) 列追加
- /Users/oogushiyuuki/株式会社SCALE/scale-lead/list_pool.js
- List Pool MVP 全実装 (CSV取込/フィルタ/均等抽出/分配/使用状況可視化)
- SALESNOW_HEADER_MAP 参照に切替え
- 並び替え機能
- 列順を架電リスト並びに統一
- 「→ 架電リスト」ボタン明示化
- データ連携完全化 (分配時補完更新) + 従業員/売上正規化
- 取込バッチ管理 (importBatchId + importLabel + フィルタ)
- _lpFlushToD1 (3回リトライ D1 PUT)
- 大型データ D1 のみ運用
- 容量整理/D1復元 ボタン
- /Users/oogushiyuuki/株式会社SCALE/scale-lead/pages.js
- _slackPostCallReportToThread FMT刷新 (タイトル「架電報告」復活 + 絵文字削減)
- _collectTodayStats 会社単位最新ステータス基準
- リロード後スクロール位置復元
- /Users/oogushiyuuki/株式会社SCALE/scale-lead/service.js
- COCREATE_VERSIONS v9.198〜v9.218 全エントリ追加
デプロイ・バックアップ
- 本日のデプロイ回数: 21回 (v9.198〜v9.218)
- 最終デプロイ: 2026-05-14 09:39 (v9.218)
- 本番URL: https://crm.scale-group.co.jp/
- 最新バックアップ:
~/scale-lead-backups/scale-lead-2026-05-14-0939-post-deploy.tar.gz
試したこと・学び(重要)
ListPool 容量問題の長期戦
- v9.215 → 第3段クリーンアップ追加 + D1 強制PUT → でも8000件は物理的に localStorage(5-10MB) に入らない
- v9.217 → 緊急救済ボタン追加 → でも容量整理では8000件は無理
- v9.218 で根本解決: 大型データ(>4MB)は localStorage を諦めて D1 のみで運用 / _cache (メモリ) + D1 で動作 / リロード時 _initSupabase で D1 から復元
ステータス保存消失調査
- v9.208 で全経路保険+検証トレース投入 → 後日 v9.210 で「実は会社単位集計のバグ」と判明 → 修正
- 上部集計のロジック (call1〜call5 全部加算 → 会社単位最新ステータス基準) に変更で根治
自動リロード機能の進化
- v9.206 (クリックで更新) → v9.207 (5秒カウントダウン自動リロード) → v9.209 (v9.147 誤拾い修正) → v9.210 (リロード後ページ/スクロール復元)
ユーザーFB(重要なやつ全部)
架電報告 FMT
- 「アポ報告くらい濃く」「使ったトーク/切り返し」自由記述化 → v9.198
- 「タイトルに架電報告が入ってない / 項目絵文字いらない」 → v9.202
集計バグ
- 「7件もかけてない・通電してないのに集計が変」「担当不在は通電に含めないで」 → v9.196 (前日) + v9.210 上部集計バグ根治
- 「アポ獲得→コールのみに戻したのに数値が古いまま」 → v9.210 全体再描画
誤タップ防止
- 「ステータス変更してないのに担当者が変わる」 → v9.204 newVal!==oldVal 判定
- 「ステータス取り消すボタン押したらまっさらに」 → v9.201 無条件クリア
日付
- 「朝7時で14日なのに13日になる」 → v9.203 today() ローカルタイム化
- 「9時より前の架電時間帯選択肢ほしい」 → v9.205 ~9:00 追加
自動更新
- 「パートナーも自動で最新版になるように」 → v9.206-207 自動検知+カウントダウン自動リロード
- 「v9.147 とか表示されてる」 → v9.209 service.js から取得
ListPool
- 「機能少なすぎ」 → v9.210 CSV/列/フィルタ/均等抽出/分配セグメント 大幅拡張
- 「電話番号・HP・SalesNowリンクが反映されない」 → v9.211 SALESNOW_HEADER_MAP 参照 + v9.213 補完更新
- 「並び替え機能ほしい / 取込順デフォルト」 → v9.212
- 「従業員規模が「19」とか数値で入ってる」 → v9.213 自動正規化
- 「今入れたものだけ抽出したい」 → v9.213 取込バッチフィルタ
- 「リストプール+架電リスト リロードで消える」 → v9.215-218 段階対応 → 最終 v9.218 で D1 のみ運用に切替
- 「8000件入れたら容量不足表示」 → v9.218 大型データ判定
ゴミ箱
- 「300件まとめて削除/復元したい・削除日時・担当者・セグメントで判別」 → v9.216 バッチグループ化
その他
- 「最下端でホイール下→右に勝手スクロール」 → v9.214 廃止
- 「架電リストの売上規模の左に地域も」 → v9.211 prefecture 列追加
注意ポイント・退化リスク
- 大型データの localStorage 保存禁止: list_pool_companies / proj_*_call_list で 4MB 超は localStorage に書かない (v9.218 で実装)
- 保護キーリスト: sb_list_pool_companies / sb_proj_call_list / sb_members / sb_projects / sb_projslack / sb__deletelog_ / sb__cl_just_deleted_until は絶対に削除しない
- today() を toISOString().split('T')[0] に戻すと UTC基準で前日扱い: v9.203 修正前のバグ再発
- CONNECTED_ST に「担当不在」を再追加禁止: 担当者通電率の定義に反する
- PM担当セレクト・Slack招待で大串/細川 fallback の再追加禁止: メンバー編集の値だけを真実とする
- getMembers() merge順序:
{...dm,...stored[idx]}必須 (stored優先) - _safeSetItem の保護キーチェックを削除禁止: 大型データ消失リスク
- 自動更新バナーは入力中はリロードしない設計を維持: ユーザー作業を守る
- v9.218 で localStorage への list_pool 保存を諦めた決定: D1 が真実のソース・_cache はメモリ作業用
次のセッションで取り得る選択肢
- ユーザー検証FB待ち — v9.218 で 8000件入れて動くか確認
- 架電リスト本体も大型データ対応 — v9.218 と同じロジックを call_list 保存にも適用 (現状一部しか効いてない)
- ListPool 列順カスタマイズ機能 — v9.212 の宿題 (ドラッグ&ドロップ or 設定画面)
- 自動正規化の精度向上 — 範囲表記の網羅性確認 (例: 「100名以下」のような特殊表記対応)
- トレースクリーンアップ — v9.208 [STATUS-SAVE-VERIFY] / [BC-v9.208] / [LP-FLUSH-D1] 等の常時ログ → 真因確定後の整理
引き継ぎファイル
/tmp/handoff_20260514_094154.txt
累積効果まとめ(v9.198〜v9.218)
架電報告: 内容濃化(アポ報告レベル)・絵文字整理・「架電報告」タイトル復活
集計: 担当不在を通電から除外・会社単位最新ステータス基準・ステータス変更後即時再計算
日付: ローカルタイム基準で朝早くも当日扱い・架電時間帯9時前追加
誤タップ: 同じ値選択時は担当者そのまま・ロールバックで完全復元
ゴミ箱: 削除バッチごとグループ化・一括復元/削除・チェックボックス選択
ListPool MVP+大幅拡張: CSV50項目対応・並び替え・均等抽出複数キー・取込バッチ管理・分配補完更新・自動正規化
大型データ: localStorage諦め D1のみ運用 (>4MB) で 8000件超 OK
自動更新: 5分ごと検知・5秒カウントダウン自動リロード・入力中保護
リロード復元: ページ/案件/スクロール位置を sessionStorage 保存・復元
ホイール: 最下端で勝手に横スクロール挙動廃止
緊急救済: 🧹容量整理 + 🔄D1復元 ボタン
→ SCALE CRM が「8000件超の大量データを扱える + パートナーも自動で最新版 + 削除/復元の自由度高い + 朝早くも当日集計OK」状態に到達。