)]}'
{
  "commit": "1b80424c0dfaaaadf4a2b829b069793cf3975370",
  "tree": "0b0fbeeed6dde699dbb8a2db89d6200edd7c0533",
  "parents": [
    "e87146304c2d39dd471b8cce22d217c22be90987"
  ],
  "author": {
    "name": "Zimuzo Ezeozue",
    "email": "zezeozue@google.com",
    "time": "Wed Apr 29 11:42:33 2026 +0100"
  },
  "committer": {
    "name": "Zimuzo Ezeozue",
    "email": "zezeozue@google.com",
    "time": "Wed May 06 13:49:05 2026 +0100"
  },
  "message": "ui: Heap Dump Explorer — multi-trace baseline diff mode\n\nAdds baseline / current / diff workflow to the Heapdump Explorer plugin.\nThe user can pool one or more reference traces, pick a dump from any\npooled trace as the active baseline, and the Classes / Strings / Arrays\n/ Bitmaps / Dominators / Overview tabs render side-by-side current vs\nbaseline values with classified delta status (NEW / REMOVED / GREW /\nSHRANK / UNCHANGED).\n\nArchitecture:\n* Each pooled baseline trace owns its own WasmEngineProxy (separate\n  Web Worker) — a single sqlite ATTACH across workers is impossible,\n  so each side runs its filter independently and the merge happens\n  in JS (diff/diff_rows.ts). Outer-join over ~20K x 20K rows is\n  cheap (~10ms).\n* In-flight diff fetches snapshot the active primary + baseline refs\n  before they await; if either ref differs after, the merge is\n  skipped. Same check in catch silently abandons fetches whose\n  engine was disposed mid-flight.\n* The Overview cache keys on (engine identity, filter SQL); both\n  primary and baseline engines need their own cached entry, and\n  passing the primary\u0027s dumpFilterSql() to the baseline engine\n  would filter on (upid, ts) values that exist in the primary trace\n  but not the baseline (silent zero-row result).\n* Tabs widget keys on (primary upid+ts, baseline trace+upid+ts);\n  selection changes remount the diff view, the snapshot guard\n  handles the tail of the previous run.\n* Status classification comes from row presence, never from\n  value\u003d\u003d0 (a class with dominated_size\u003d0 in baseline but present\n  in both snapshots must be UNCHANGED, not NEW).\n* Hprof has no real pid (trace_processor reports 0); the header\n  and popup labels render \"Java heap dump\" instead of \"pid 0\" so\n  the selector reads naturally for both pftrace and hprof inputs.\n\nChange-Id: I2f69614c7d87091b3b301ff51e110b70e2738a40\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5247aca463dcc7798705595c4b313a4f7fe538b7",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/baseline/load_action.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7deece374ed1c82d3ee98f5e4f7687d6babd72ba",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/baseline/loader.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ea064485e32257f7b789fb9bd7714793d453bd04",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/baseline/state.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "703c6e9ffe39c80696c223244928b562cbe6be16",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/diff/diff_debug.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "70b0948e7fe9bfbf96474e1eab710c0eef475dbd",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/diff/diff_rows.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "54da413b5761db9ebf6657a2d12008090aba7034",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/diff/diff_rows_unittest.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e92f4fef2dd5680308ed05253b26ca71b662c2fd",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/diff/diff_schemas.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1842ec61e26077be58bd558c7ec987290bb8bb02",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/diff/object_pairing.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c4d4be24252e70d5372ae29c9ba6e39b481295fc",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/header.ts"
    },
    {
      "type": "modify",
      "old_id": "d2cb4b590988dbdefeed918c629e9b4157cbf191",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/com.android.HeapDumpExplorer/heap_dump_page.ts",
      "new_id": "3e30110f9006d25c6c75c8729abb317877dbbdd9",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/heap_dump_page.ts"
    },
    {
      "type": "modify",
      "old_id": "3b9cd00862ce4d2336dc286021f12fdef6bddd3a",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/com.android.HeapDumpExplorer/index.ts",
      "new_id": "d7f5f3c53c5603c5dee5913374b4f8a8b6e6ca8d",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/index.ts"
    },
    {
      "type": "modify",
      "old_id": "faed9c5072834e52d62ad9c7007ca5f177f3a480",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/com.android.HeapDumpExplorer/queries.ts",
      "new_id": "ee70de86ef256b2fea6315ee96f4270ca4ffdb58",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/queries.ts"
    },
    {
      "type": "modify",
      "old_id": "ae1f1367bd25d4aef910b2046d2f8a65c91d101a",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/com.android.HeapDumpExplorer/session.ts",
      "new_id": "61b3a67612e32fd1439158d481720180090ec150",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/session.ts"
    },
    {
      "type": "modify",
      "old_id": "220f1fe172befc64837a057c587331c7cea41808",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/com.android.HeapDumpExplorer/styles.scss",
      "new_id": "ce06bacfc061f6ad9841aac9f88a3e33a23c3eaf",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/styles.scss"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fadf262aac46c0b2ab10266f0353ec5126312f2f",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/top_bar.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "423c17064a1b5977ab985de019b8ac96fc0fd5a5",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/all_objects_diff_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0bff5c08a04e456b816b89c4cd684d8bb8dc4e43",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/arrays_diff_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "700d43165a56d835b3ef4fdd42e09240cd00a770",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/bitmaps_diff_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dbc0f021adb6f4269b76520b4e51bffcd8c45de0",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/classes_diff_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "113a3d32296d781aee1310fda984442f1fc27c36",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/dominators_diff_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6686d003c1d0adaf8d3d9cbc88c0a2c7ec70d62b",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/object_diff_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "94f0a932ba93400e4dd22758d3428a0b6a4b4504",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/diff/strings_diff_view.ts"
    },
    {
      "type": "modify",
      "old_id": "fbb1c384c88b925989c03eebce406f1be9dd6f04",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/overview_view.ts",
      "new_id": "70617b07ad736111ad398f3c4664d6670a630160",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/com.android.HeapDumpExplorer/views/overview_view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "74685038f0e53637d92b7b1ebc1830d8bbb702fa",
      "new_mode": 33188,
      "new_path": "ui/src/test/heap_dump_diff.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "14ff1b0d71071e4675d16eaa74acd3851ee2edf4",
      "new_mode": 33188,
      "new_path": "ui/src/test/heap_dump_diff_hprof_primary.test.ts"
    }
  ]
}
