{
  "ok": true,
  "generatedAt": "2026-07-05T09:44:23.299747+00:00",
  "db": "/home/molt/linehero-balance-command-center/data/balance_command_center.sqlite3",
  "gameRoot": "/home/molt/LineHeroOnline",
  "snapshots": [
    {
      "source": "stat_report",
      "source_path": "/home/molt/LineHeroOnline-balance-lab/docs/generated/stat-no-cap-report.csv",
      "imported_at": "2026-07-05T06:11:11.297952+00:00",
      "row_count": 420,
      "checksum": "adf5ab22afaf4574",
      "payload": {
        "source": "stat_report",
        "count": 420,
        "columns": [
          "mode",
          "classId",
          "level",
          "build",
          "pointPool",
          "rawStr",
          "rawAgi",
          "rawVit",
          "rawInt",
          "rawDex",
          "rawLuk",
          "effStr",
          "effAgi",
          "effVit",
          "effInt",
          "effDex",
          "effLuk",
          "maxHp",
          "maxMp",
          "atkMean",
          "matkMean",
          "def",
          "mdef",
          "hit",
          "flee",
          "aspdMs",
          "cri",
          "criDmg",
          "magicCri",
          "magicCriDmg",
          "castRdc",
          "healPow",
          "moveSpd",
          "dropRate"
        ]
      }
    },
    {
      "source": "vendors",
      "source_path": "/home/molt/LineHeroOnline/backend/data/catalog/vendors.json",
      "imported_at": "2026-07-05T06:11:11.286716+00:00",
      "row_count": 7,
      "checksum": "fe79b700de24e544",
      "payload": {
        "source": "vendors",
        "count": 7,
        "sampleKeys": [
          "bindOnPurchase",
          "enabled",
          "id",
          "items",
          "metaJson",
          "sortOrder",
          "title"
        ]
      }
    },
    {
      "source": "regions",
      "source_path": "/home/molt/LineHeroOnline/backend/data/catalog/regions.json",
      "imported_at": "2026-07-05T06:11:11.285809+00:00",
      "row_count": 192,
      "checksum": "fed79286a6d4b3bf",
      "payload": {
        "source": "regions",
        "count": 192,
        "sampleKeys": [
          "backgroundJson",
          "bgFrom",
          "bgTo",
          "biome",
          "createdAt",
          "displayName",
          "height",
          "id",
          "isVillage",
          "mapVersion",
          "metaJson",
          "minLv",
          "mobAggression",
          "name",
          "parentRegionId",
          "regionId",
          "safeZone",
          "spawnX",
          "spawnY",
          "tier"
        ]
      }
    },
    {
      "source": "items",
      "source_path": "/home/molt/LineHeroOnline/backend/data/catalog/items.json",
      "imported_at": "2026-07-05T06:11:11.230664+00:00",
      "row_count": 2894,
      "checksum": "d1cb3ebc16510461",
      "payload": {
        "source": "items",
        "count": 2894,
        "byType": {
          "equipment": 1852,
          "material": 288,
          "consumable": 195,
          "card": 502,
          "currency": 2,
          "token": 3,
          "tool": 52
        },
        "byRarity": {
          "legend": 762,
          "epic": 517,
          "rare": 997,
          "common": 618
        }
      }
    },
    {
      "source": "enemies",
      "source_path": "/home/molt/LineHeroOnline/backend/data/catalog/enemies.json",
      "imported_at": "2026-07-05T06:11:11.056349+00:00",
      "row_count": 1165,
      "checksum": "4fd9631b46f87d3b",
      "payload": {
        "source": "enemies",
        "count": 1165,
        "minLevel": 1,
        "maxLevel": 350,
        "byKind": {
          "normal": 1029,
          "boss": 18,
          "monster": 2,
          "elite": 98,
          "dummy": 14,
          "dummy_ally": 4
        }
      }
    },
    {
      "source": "skills",
      "source_path": "/home/molt/LineHeroOnline/backend/data/catalog/skills.json",
      "imported_at": "2026-07-05T06:11:10.845683+00:00",
      "row_count": 289,
      "checksum": "f090f34bf5f78244",
      "payload": {
        "source": "skills",
        "count": 289,
        "byClass": {
          "unknown": 2,
          "mage": 74,
          "swordsman": 71,
          "thief": 70,
          "priest": 72
        },
        "byType": {
          "damage": 92,
          "buff": 90,
          "aoe": 97,
          "heal": 10
        }
      }
    }
  ],
  "parameterSets": [
    {
      "id": "param-93d3ba5b",
      "name": "未命名測試設定",
      "category": "stats",
      "status": "draft",
      "notes": "",
      "updated_at": "2026-07-05T06:41:02.890736+00:00",
      "values": {
        "statCap": null,
        "formulaMode": "current"
      }
    },
    {
      "id": "baseline-current",
      "name": "現行正式數值 baseline",
      "category": "global",
      "status": "active",
      "notes": "從目前 catalog / common formula 匯入後作為對照基準。",
      "updated_at": "2026-07-05T05:45:17.595900+00:00",
      "values": {
        "statCap": 130,
        "mode": "current-cap"
      }
    },
    {
      "id": "stat-soft-nocap-dedup",
      "name": "能力值 soft no-cap / 去重候選",
      "category": "stats",
      "status": "draft",
      "notes": "用於未來跑 AFK / TTK / 生存對照，不直接套正式服。",
      "updated_at": "2026-07-05T05:45:17.595900+00:00",
      "values": {
        "statCap": null,
        "effectiveStatCurve": "soft",
        "dedupe": [
          "INT_castRdc_to_DEX"
        ]
      }
    },
    {
      "id": "afk-water-normalized",
      "name": "掛機測試：統一補水與消耗紀錄",
      "category": "afk",
      "status": "draft",
      "notes": "讓測試角色都有水，並記錄 HP/MP 水消耗與淨收益。",
      "updated_at": "2026-07-05T05:45:17.595900+00:00",
      "values": {
        "provideHpPotion": true,
        "provideMpPotion": true,
        "recordPotionUse": true,
        "mapRemap": "reasonable-region-by-level"
      }
    }
  ],
  "experiments": [
    {
      "id": "exp-a08497c129",
      "name": "找適合練功地圖｜Lv180 楓紅祕境・緋楓深境",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:48:56.537591+00:00",
      "config": {
        "durationSec": 300,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r14_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "map-matrix",
        "matrixGroupId": "matrix-9f158675"
      },
      "result": {
        "finishedAt": "2026-07-05T08:48:56.537572+00:00",
        "durationSec": 300.8,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-a08497c129-token-file.json",
          "--duration",
          "300",
          "--channel",
          "balance-exp-a08497c129",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r14_4",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=12 state=/home/molt/linehero-balance-command-center/data/runs/exp-a08497c129/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-a08497c129-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-a08497c129-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-a08497c129-token-file.json"
      }
    },
    {
      "id": "exp-2822aa9e80",
      "name": "比較四職業差距｜Lv340 雷霆荒原・風暴核心",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:15:40.853283+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 5,
        "mapPolicy": "manual-region",
        "manualRegion": "r27_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "class-gap",
        "matrixGroupId": "matrix-5a79f2f0"
      },
      "result": {
        "finishedAt": "2026-07-05T08:15:40.853234+00:00",
        "durationSec": 601.5,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-2822aa9e80-token-file.json",
          "--duration",
          "600",
          "--channel",
          "balance-exp-2822aa9e80",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r27_4",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=20 state=/home/molt/linehero-balance-command-center/data/runs/exp-2822aa9e80/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-2822aa9e80-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-2822aa9e80-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-2822aa9e80-token-file.json"
      }
    },
    {
      "id": "exp-15cb001f6a",
      "name": "比較四職業差距｜Lv295 烈焰火山・烈火祭壇",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:15:40.836072+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 5,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "class-gap",
        "matrixGroupId": "matrix-5a79f2f0"
      },
      "result": {
        "finishedAt": "2026-07-05T08:15:40.836047+00:00",
        "durationSec": 601.6,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-15cb001f6a-token-file.json",
          "--duration",
          "600",
          "--channel",
          "balance-exp-15cb001f6a",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r26_4",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=20 state=/home/molt/linehero-balance-command-center/data/runs/exp-15cb001f6a/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-15cb001f6a-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-15cb001f6a-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-15cb001f6a-token-file.json"
      }
    },
    {
      "id": "exp-4003dd72b5",
      "name": "比較四職業差距｜Lv350 雷霆荒原・裂痕 II",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:15:40.826756+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 5,
        "mapPolicy": "manual-region",
        "manualRegion": "r27_rift2",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "class-gap",
        "matrixGroupId": "matrix-5a79f2f0"
      },
      "result": {
        "finishedAt": "2026-07-05T08:15:40.826721+00:00",
        "durationSec": 601.5,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-4003dd72b5-token-file.json",
          "--duration",
          "600",
          "--channel",
          "balance-exp-4003dd72b5",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r27_rift2",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=20 state=/home/molt/linehero-balance-command-center/data/runs/exp-4003dd72b5/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-4003dd72b5-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-4003dd72b5-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-4003dd72b5-token-file.json"
      }
    },
    {
      "id": "exp-6879f75fcd",
      "name": "比較四職業差距｜Lv220 暗影深淵・暗影緣界",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:05:38.261828+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 5,
        "mapPolicy": "manual-region",
        "manualRegion": "r22_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "class-gap",
        "matrixGroupId": "matrix-5a79f2f0"
      },
      "result": {
        "finishedAt": "2026-07-05T08:05:38.261814+00:00",
        "durationSec": 601.5,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-6879f75fcd-token-file.json",
          "--duration",
          "600",
          "--channel",
          "balance-exp-6879f75fcd",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r22_1",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=20 state=/home/molt/linehero-balance-command-center/data/runs/exp-6879f75fcd/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-6879f75fcd-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-6879f75fcd-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-6879f75fcd-token-file.json"
      }
    },
    {
      "id": "exp-c617d5c1ad",
      "name": "比較四職業差距｜Lv260 烈焰火山・熔岩山麓",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:05:38.250385+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 5,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "class-gap",
        "matrixGroupId": "matrix-5a79f2f0"
      },
      "result": {
        "finishedAt": "2026-07-05T08:05:38.250371+00:00",
        "durationSec": 601.5,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-c617d5c1ad-token-file.json",
          "--duration",
          "600",
          "--channel",
          "balance-exp-c617d5c1ad",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r26_1",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=20 state=/home/molt/linehero-balance-command-center/data/runs/exp-c617d5c1ad/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-c617d5c1ad-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-c617d5c1ad-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-c617d5c1ad-token-file.json"
      }
    },
    {
      "id": "exp-b90adf78e8",
      "name": "比較四職業差距｜Lv180 楓紅祕境・緋楓深境",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T08:05:38.232497+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 5,
        "mapPolicy": "manual-region",
        "manualRegion": "r14_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "class-gap",
        "matrixGroupId": "matrix-5a79f2f0"
      },
      "result": {
        "finishedAt": "2026-07-05T08:05:38.232474+00:00",
        "durationSec": 601.6,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-b90adf78e8-token-file.json",
          "--duration",
          "600",
          "--channel",
          "balance-exp-b90adf78e8",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r14_4",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=20 state=/home/molt/linehero-balance-command-center/data/runs/exp-b90adf78e8/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-b90adf78e8-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-b90adf78e8-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-b90adf78e8-token-file.json"
      }
    },
    {
      "id": "exp-47e4994b7a",
      "name": "驗證：r26_1 真實引擎非零結果",
      "status": "done",
      "source": "manual",
      "updated_at": "2026-07-05T07:11:13.333900+00:00",
      "config": {
        "durationSec": 45,
        "classes": [
          "swordsman"
        ],
        "perClass": 1,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "waterPolicy": "provide-and-record",
        "lowHpStop": 0.1
      },
      "result": {
        "finishedAt": "2026-07-05T07:11:13.333845+00:00",
        "durationSec": 45.5,
        "command": [
          "node",
          "scripts/auto-balance-live-runner.mjs",
          "--api",
          "http://127.0.0.1:4401",
          "--world",
          "http://127.0.0.1:4402",
          "--token-file",
          "/home/molt/linehero-balance-command-center/data/runs/exp-47e4994b7a-token-file.json",
          "--duration",
          "45",
          "--channel",
          "balance-exp-47e4994b7a",
          "--low-hp-stop",
          "0.1",
          "--region",
          "r26_1",
          "--hp-potion",
          "honey",
          "--mp-potion",
          "ether_s"
        ],
        "exitCode": 0,
        "stdout": "[auto-balance] live runner started bots=1 state=/home/molt/linehero-balance-command-center/data/runs/exp-47e4994b7a/state.json\n",
        "stderr": "",
        "archive": {
          "results.csv": "/home/molt/linehero-balance-command-center/data/runs/exp-47e4994b7a-results.csv",
          "state.json": "/home/molt/linehero-balance-command-center/data/runs/exp-47e4994b7a-state.json"
        },
        "tokenFile": "/home/molt/linehero-balance-command-center/data/runs/exp-47e4994b7a-token-file.json"
      }
    },
    {
      "id": "exp-bc0d11c0be",
      "name": "四職業統一補水掛機測試｜Lv340 雷霆荒原・風暴核心",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05T07:00:34.095270+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r27_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "matrixGroupId": "matrix-42e17f23"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "exp-bb8231d4c7",
      "name": "四職業統一補水掛機測試｜Lv295 烈焰火山・烈火祭壇",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05T07:00:34.075520+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "matrixGroupId": "matrix-42e17f23"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "exp-bc94ec79ac",
      "name": "四職業統一補水掛機測試｜Lv350 雷霆荒原・裂痕 II",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05T07:00:34.071520+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r27_rift2",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "matrixGroupId": "matrix-42e17f23"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "exp-db65577910",
      "name": "四職業統一補水掛機測試｜Lv260 烈焰火山・熔岩山麓",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05T06:51:25.364827+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "matrixGroupId": "matrix-42e17f23"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "exp-8a9b86067d",
      "name": "四職業統一補水掛機測試｜Lv180 楓紅祕境・緋楓深境",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05T06:51:25.329856+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r14_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "matrixGroupId": "matrix-42e17f23"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "exp-7ff4701a7b",
      "name": "四職業統一補水掛機測試｜Lv220 暗影深淵・暗影緣界",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05T06:51:25.293035+00:00",
      "config": {
        "durationSec": 600,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 3,
        "mapPolicy": "manual-region",
        "manualRegion": "r22_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.1,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "matrixGroupId": "matrix-42e17f23"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "import:afk-results",
      "name": "AFK lab latest imported results",
      "status": "failed",
      "source": "/home/molt/LineHeroOnline-auto-balance-lab/docs/generated/auto-balance-live/results.csv",
      "updated_at": "2026-07-05T06:11:11.286904+00:00",
      "config": {
        "path": "/home/molt/LineHeroOnline-auto-balance-lab/docs/generated/auto-balance-live/results.csv"
      },
      "result": {
        "error": "舊 runner 會在每次 zone.snapshot 重啟 AUTO，結果無效，已作廢"
      }
    },
    {
      "id": "exp-77a1b797cd",
      "name": "找適合練功地圖｜Lv180 楓紅祕境・緋楓深境",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05 07:00:34",
      "config": {
        "durationSec": 300,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 1,
        "mapPolicy": "manual-region",
        "manualRegion": "r14_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.2,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "map-matrix",
        "matrixGroupId": "matrix-73e53bf1"
      },
      "result": {
        "error": "isolated DB auth was broken; cancelled before rerun"
      }
    },
    {
      "id": "exp-c2b1516a34",
      "name": "找適合練功地圖｜Lv220 暗影深淵・暗影緣界",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05 07:00:34",
      "config": {
        "durationSec": 300,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 1,
        "mapPolicy": "manual-region",
        "manualRegion": "r22_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.2,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "map-matrix",
        "matrixGroupId": "matrix-73e53bf1"
      },
      "result": {
        "error": "isolated DB auth was broken; cancelled before rerun"
      }
    },
    {
      "id": "exp-866b547f09",
      "name": "找適合練功地圖｜Lv260 烈焰火山・熔岩山麓",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05 07:00:34",
      "config": {
        "durationSec": 300,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 1,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_1",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.2,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "map-matrix",
        "matrixGroupId": "matrix-73e53bf1"
      },
      "result": {
        "error": "isolated DB auth was broken; cancelled before rerun"
      }
    },
    {
      "id": "exp-3b9d2c73c4",
      "name": "找適合練功地圖｜Lv295 烈焰火山・烈火祭壇",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05 07:00:34",
      "config": {
        "durationSec": 300,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 1,
        "mapPolicy": "manual-region",
        "manualRegion": "r26_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.2,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "map-matrix",
        "matrixGroupId": "matrix-73e53bf1"
      },
      "result": {
        "error": "isolated DB auth was broken; cancelled before rerun"
      }
    },
    {
      "id": "exp-d622db4037",
      "name": "找適合練功地圖｜Lv340 雷霆荒原・風暴核心",
      "status": "failed",
      "source": "manual",
      "updated_at": "2026-07-05 07:00:34",
      "config": {
        "durationSec": 300,
        "classes": [
          "swordsman",
          "thief",
          "mage",
          "priest"
        ],
        "perClass": 1,
        "mapPolicy": "manual-region",
        "manualRegion": "r27_4",
        "hpPotionPolicy": "provide-and-record",
        "mpPotionPolicy": "provide-and-record",
        "lowHpStop": 0.2,
        "notes": "",
        "waterPolicy": "provide-and-record",
        "scenario": "map-matrix",
        "matrixGroupId": "matrix-73e53bf1"
      },
      "result": {
        "error": "isolated DB auth was broken; cancelled before rerun"
      }
    }
  ],
  "metricCount": 1330,
  "afkByClass": [
    {
      "class_id": "mage",
      "metric_key": "expMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "hpPct",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "hpPotionUsed",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "kills",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "kpm",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "mpPct",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "mpPotionUsed",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "netSilverMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "potionSilverCost",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "mage",
      "metric_key": "silverMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "expMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "hpPct",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "hpPotionUsed",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "kills",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "kpm",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "mpPct",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "mpPotionUsed",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "netSilverMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "potionSilverCost",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "priest",
      "metric_key": "silverMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "swordsman",
      "metric_key": "expMin",
      "avg_value": 1749.265,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "hpPct",
      "avg_value": 2.941,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "hpPotionUsed",
      "avg_value": 0.0,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "kills",
      "avg_value": 0.088,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "kpm",
      "avg_value": 0.118,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "mpPct",
      "avg_value": 2.941,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "mpPotionUsed",
      "avg_value": 0.0,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "netSilverMin",
      "avg_value": 59.294,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "potionSilverCost",
      "avg_value": 0.0,
      "count": 34
    },
    {
      "class_id": "swordsman",
      "metric_key": "silverMin",
      "avg_value": 59.294,
      "count": 34
    },
    {
      "class_id": "thief",
      "metric_key": "expMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "hpPct",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "hpPotionUsed",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "kills",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "kpm",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "mpPct",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "mpPotionUsed",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "netSilverMin",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "potionSilverCost",
      "avg_value": 0.0,
      "count": 33
    },
    {
      "class_id": "thief",
      "metric_key": "silverMin",
      "avg_value": 0.0,
      "count": 33
    }
  ]
}