TL;DR
- CI にフル E2E を組み込み、1 分以内で “ユニット → モック E2E” を完走
- main/Release タグは常にグリーン。v1.0.0 を無事リリース
- 次フェーズは「実 API 24h 監視」「可視化ダッシュボード」「アルゴ v0.2」へ
1. 背景と狙い — 「利益よりも、まずは安全停止」
1-1. なぜ“安全停止”が最優先なのか
暗号資産のマーケットメイクは 24 時間 × 365 日。
– 過剰レバレッジ
– アップデート直後の想定外挙動
– 取引所 API 停止
こうしたイベントは深夜でも一瞬で証拠金を吹き飛ばします。
MMBot では――
- ドローダウン (DD) が所定の閾値に達したら自動クローズ
- Slack へ即通知して人間が再確認
 を“収益ロジックよりも前”に実装しました。
1-2. 自動テストを「保険」から「必須条件」へ
手動 QA だけでは、
- “たまたま” エラーを踏まない
- “深夜リリース” でカバレッジが低下
 というリスクが残ります。
 そこで今回、「テストが落ちた PR は絶対マージできない」 仕組みを導入。
| 昔の流れ | 今回から | 
|---|---|
| 開発 → 手動テスト → うっかりマージ → 本番でバグ | 開発 → Push → CI (ユニット → モック E2E) → Green ならレビュー → Merge | 
| バグ調査に最長半日 | テスト失敗時点で即検知:修正→再 Push のみ | 
1-3. 狙った効果
- 安全性: main / Release が常にグリーン → “いつ壊れたか” を即特定。
- 速度 : モック E2E により 1 分以内 でフィードバック → PDCA 短縮。
- スケール: 新機能を足しても「テスト追加 → Green」で品質担保が可能に。
2. 達成したこと
| 軸 | 具体的な成果 | インパクト | 
|---|---|---|
| コア安定化 | CLI → Execution → Guard → Notify の本番/テストネット運用がワンコマンド | 想定外の DD や通信エラーでも Slack に即報告 & 自動クローズ | 
| テスト体制 | ユニット 84 件(カバレッジ 96 %) GitHub Actions 上で E2E(Testnet→Real) 自動実行 | 仕様追加しても“壊れたら即検知” | 
| 高速 E2E | MOCK_STREAM=1で WS/HTTP を完全モック化 → CI 内 1 分 で A–H フェーズ完走 | PR レビュー前に結果が返ってくるので PDCA が加速 | 
| CI/CD | ci.yml(ユニット)→e2e.yml→e2e-real.yml連鎖実行/PR が赤ならマージ禁止 | 品質ゲートが常に動く | 
| ドキュメント | ARCHITECTURE.mdにシステム図+テストフロー図PROGRESS.mdに時系列ログ | 新メンバーが 10 分で全体像を把握 | 
| リリース管理 | v1.0.0タグを GitHub Releases へ公開 | “いつでも戻せる” 安定版を確保 | 
| 開発スピード | ChatGPT(o4-mini) をリファクタ & CI 相談相手に活用 | 作業時間を体感 30 % 削減 | 
補足解説
- コア安定化
- run_loop()に DD ガードと safe_exit を標準装備。
- Slack 送信が 404 を返しても BOT が落ちずにリトライ可能。
 
- テスト体制
- pytest マークで unit/integrationを分離。
- E2E は Testnet-WS を実際に叩いた後、Real-REST へフェイルオーバ。
 
- pytest マークで 
- 高速 E2E
- モック板を固定値 + 簡易スプレッド変化でエッジケースを再現。
- 全 8 フェーズ (DD, Skip, API error, Slack 404 …) を 55 秒 で網羅。
 
- CI/CD 連鎖
- ジョブ依存 (needs:) で “ユニット OK → モック E2E → 実 E2E” を段階式に。
- main もリリースタグも 常にグリーン を実現。
 
- ジョブ依存 (
- ドキュメント
- Mermaid 図で「システム全体」と「テストパイプライン」を可視化。
- 新規参入者が README → ARCHITECTURE → PROGRESS で即キャッチアップ。
 
- リリース管理
- タグ時のみ GitHub Actions がアーティファクトを生成。
- “壊れたら前のタグに roll-back” がワンボタン。
 
- 開発スピード
- ChatGPT へ diff と要件を貼り付け → リファクタ案/テスト雛形を受け取り時短。
- 人はレビューとロジック設計に集中できるサイクルへ移行。
 
3. キーテクニック ――「落ちないテストを 速く 回す仕組み」
3-1. 完全モック E2E ― “本番 API に 1 バイトも投げない”
# tests/e2e/testnet_checks.sh (抜粋) export MOCK_STREAM=1 # WebSocket / REST をすべて stub ./testnet_checks.sh # A–H 8 フェーズ ≒ 55 秒
| 仕掛け | 要点 | 
|---|---|
| 環境変数フラグ | MOCK_STREAM=1のときsrc/mmbot/cli.pyが‒ WebSocket 接続をスキップ ‒ orderbook = {"bid":100,"ask":100}を注入 | 
| フェーズ設計 | A: 手動確認も CI では CI=trueで自動スキップB–H: DD/spread-skip/API error … を一気に網羅 | 
| 効果 | 外部ネットワーク待ちゼロ → CI 1 分以内 で完走 | 
3-2. CI 連鎖 ― “ユニット → モック → 実 E2E” を段階式で
# .github/workflows/e2e-real.yml (概略)
jobs:
  test:          # pytest + coverage
  e2e:
    needs: test  # ユニット GREEN が前提
  e2e-real:
    needs: e2e   # モックE2E GREEN が前提
ポイント
- needs: でジョブ依存を宣言し、失敗したら後続をスキップ。
- 並列より安全性重視:合計時間は伸びても“壊れた場所”が一目で分かる。
- main & tag だけ実 E2E:開発ブランチはモック E2E で高速回転、本番相当はリリース直前に。
3-3. AI 伴走 ― “差分だけ渡す” チャット駆動リファクタ
| シーン | ChatGPT(o4-mini) への投げ方 | 得られたアウトプット | 
|---|---|---|
| 依存の注入 | 「execution.place_limit_order を DI 化したい。 cli.pyのこの diff を見て最小改変案を」 | サンプルコード+副作用を壊さない順序 | 
| テスト生成 | 「 guard.calc_cycle_pnlに境界値テストを足したい。pytest スタイルで書き出して」 | fixture・パラメタライズ済みスケルトン | 
| CI エラー解析 | GitHub Actions のログを貼り付け →「原因と一行パッチ案は?」 | 欠損 import の特定と __init__.py追記案 | 
結果: ループ 1 回あたりの修正時間を 約 30 % 削減。
人間は設計とレビューに集中、機械はパターン作業を担当——が理想形に近づいた。
4. ここからの一歩 ―― “守りを固めたら、攻めに転じる”
| 優先度 | 項目 | 概要 | 
|---|---|---|
| ★★★ | 24 h Live E2E | Testnet 上で BOT を 24 時間ノンストップ稼働させ、Bybit 実 API/ネットワーク変動を継続監視するジョブを追加 | 
| ★★☆ | メトリクス可視化 | Prometheus + Grafana で PnL・DD・レイテンシ・約定率などを可視化し、Slack アラートと連動 | 
| ★★☆ | アルゴ v0.2 | Adaptive Spread Entry、Funding Rate 最適化など次世代ロジックを設計・実装 | 
| ★☆☆ | 設定バリデーション | .envやconfig_*.jsonの必須項目を起動前に一括チェックし、漏れを即時エラーに | 
4-1. 24 h Live E2E(最優先 ★★★)
- 狙い:CI がモックで担保できない「長時間運転 × 実ネットワーク」の不確実性を解消。
- 実装案
- GitHub Actions の定期ワークフロー (schedule:) で 2 時間ごとに起動。
- 実 API のレスポンス遅延・エラー率を収集し、閾値超で Slack 通知。
- 成果物(ログ / PnL)を Artifacts に保存して回帰分析。
 
- GitHub Actions の定期ワークフロー (
4-2. メトリクス可視化(★★☆)
- 狙い:DD が迫った瞬間やレイテンシ劣化を “グラフで一目” に。
- 実装案
- statsd-exporter+- asyncio-middlewareで Execution の各種タイミングを push。
- Grafana にダッシュボードテンプレを用意 → Slack の /grafanaコマンドで即共有。
 
4-3. アルゴ v0.2(★★☆)
- 狙い:スプレッドが狭い相場でも取りこぼさない “賢いエントリー” を実現。
- ロードマップ
- Adaptive Spread Entry:市場ボラに応じて s_entryを動的変更。
- Funding Rate 管理:資金調達コスト込みでポジション時間を最適化。
- テスト:モックに price noise generator を追加し、挙動を自動検証。
 
- Adaptive Spread Entry:市場ボラに応じて 
4-4. 設定バリデーション(★☆☆)
- 狙い:新環境セットアップ時の「env が足りなくて起動エラー」をゼロに。
- 実装案
- 起動直後に pydantic.ValidationErrorで必須キーをチェック。
- チェック結果をカラー表示し、欠損があれば即終了。
- ユニットテストに “env 欠落パターン” を追加して回帰防止。
 
- 起動直後に 
5. まとめ
今回のアップデートで、「壊さず早く回す」 基盤が整いました。
次は実ネットでの 24 時間観測とダッシュボード可視化に挑みます。
今後もアップデートを追っていただけると嬉しいです!
