)]}'
{
  "log": [
    {
      "commit": "62a929040398b6815dac219affabbac6bcfd28ff",
      "tree": "e7e938e5b16fce0263e4eb247e7d99054026577b",
      "parents": [
        "afe7a30f57545e9da99f3741757861767274f3df"
      ],
      "author": {
        "name": "Nicolò Mazzucato",
        "email": "nicomazz@google.com",
        "time": "Mon May 04 10:59:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 10:59:31 2026"
      },
      "message": "Fix blocking call table after latest refactor to consider also the render thread ones (#5709)"
    },
    {
      "commit": "afe7a30f57545e9da99f3741757861767274f3df",
      "tree": "6031969affb21a8ff470c5f6cf7e3412f02219fc",
      "parents": [
        "0a16dd19631bdc4815d4ee4a444ffefbd173e917"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Sat May 02 11:19:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 11:19:45 2026"
      },
      "message": "tp: collapse critical-path walk to one pass (#5707)\n\nThe kernel/userspace + merge pipeline existed to bound a chain walker\nthat could run away. With a window-bounded walker the split isn\u0027t\nneeded; a single walk produces the layered output and one\n`_intervals_flatten` collapses it. Removes the merge machinery, a\ntest-only graph utility, and a now-redundant id rewrite."
    },
    {
      "commit": "0a16dd19631bdc4815d4ee4a444ffefbd173e917",
      "tree": "541b061f4696b0576ec4a39619b588d9d3899760",
      "parents": [
        "0a47f21e97615e0259dcb8589190aa0912c47bbe"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Fri May 01 23:55:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 23:55:31 2026"
      },
      "message": "tp: bounded-window walk for critical path; drop slice_name from join (#5704)\n\nThe prior `_critical_path_intervals!()` pipeline iterated wakeup-graph\nedges with a `lead(ts)` flatten that only bounded frames by the root\u0027s\nwindow. On chains where a waker\u0027s run was shorter than the root\u0027s wait,\nthe uncovered tail was either dropped or attributed to a thread that was\nitself sleeping during the window. On monitor-contention traces this\nshowed up as runaway depth.\n\nReplace it with `__intrinsic_critical_path_walk`, a C++ intrinsic that\nperforms a per-root recursive walk. Each frame is clipped to `[ts -\nidle_dur, ts + dur]`; the idle portion chains via `waker_id` (or\n`prev_id` on userspace IRQ self-wakes); and the time before a frame\u0027s\nown idle started recurses into `prev_id` at the same depth. Termination\nis structural - each step strictly reduces the window\u0027s upper bound -\nwith a per-root iteration cap as a safety belt.\n\nExposed via `_critical_path_userspace_by_roots!` and\n`_critical_path_kernel_by_roots!`. `_critical_path_by_roots` dispatches\nthrough them. IRQ self-wake and kernel chain semantics are preserved.\n\nSeparately, drop `slice_name` from the materialized\n`_critical_path_thread_state_slice` and `_self_view`. Join `slice` on id\nat the leaves of `_critical_path_stack` instead. The TEXT was duplicated\nacross every row of the blocker x slice cross product on large traces.\n\nThree critical-path diff-test expectations updated to drop rows that the\nlead-flatten attributed to idle frames."
    },
    {
      "commit": "0a47f21e97615e0259dcb8589190aa0912c47bbe",
      "tree": "e1df7c1daac5f93e1fd10ecedce2d81216256cf8",
      "parents": [
        "2020e3501d39c34c98702409242d6d311c4e348c"
      ],
      "author": {
        "name": "Siva Mahadevan",
        "email": "me@svmhdvn.name",
        "time": "Fri May 01 20:07:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 20:07:11 2026"
      },
      "message": "tracebox: allow building on freebsd (#5705)"
    },
    {
      "commit": "2020e3501d39c34c98702409242d6d311c4e348c",
      "tree": "89501f634d3c72af35e59aeb732ceeaa7bf35674",
      "parents": [
        "797c7d251eb998baef1cb04e92d0b3f4dfd7cc4a"
      ],
      "author": {
        "name": "Siva Mahadevan",
        "email": "me@svmhdvn.name",
        "time": "Fri May 01 20:01:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 20:01:12 2026"
      },
      "message": "profiling: guard end_to_end_tests inside enable_perfetto_integration_tests (#5703)\n\nThis fixes the build with enable_perfetto_integration_tests\u003dfalse and\nenable_perfetto_heapprofd\u003dtrue."
    },
    {
      "commit": "797c7d251eb998baef1cb04e92d0b3f4dfd7cc4a",
      "tree": "4e8648231dc7c4af842eb3584c4429432ed594b1",
      "parents": [
        "5978acaaf6771688021c0cd24339af83b71a9708"
      ],
      "author": {
        "name": "Ryan Zuklie",
        "email": "rzuklie@google.com",
        "time": "Fri May 01 19:28:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 19:28:09 2026"
      },
      "message": "Add standard library wrapper around package_lookup (#5393)\n\nThis is the first of three parts to make the c++ package_lookup function\nan __intrinsic.\n1. Add a standard library module to expose android_package_lookup.\n2. Migrate users (including those outside Perfetto codebase).\n3. Rename package_lookup -\u003e __intrinsic_package_lookup."
    },
    {
      "commit": "5978acaaf6771688021c0cd24339af83b71a9708",
      "tree": "abf5c410dd900005b8e529db5452ec9c90a6cfe9",
      "parents": [
        "1db980425b12cfc3ce304ebb9a82f83efc14f969"
      ],
      "author": {
        "name": "Mayzner",
        "email": "mayzner@google.com",
        "time": "Fri May 01 19:12:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 19:12:48 2026"
      },
      "message": "docs: Improve Data Explorer docs (#5699)"
    },
    {
      "commit": "1db980425b12cfc3ce304ebb9a82f83efc14f969",
      "tree": "5ca21a02401ab3ca97413cb84855a9d998bfe974",
      "parents": [
        "705fa5dc13ad478bf86910419c92e27dbab20ffc"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri May 01 18:26:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 18:26:48 2026"
      },
      "message": "bazel: one more attempt to fix blaze build (#5702)"
    },
    {
      "commit": "705fa5dc13ad478bf86910419c92e27dbab20ffc",
      "tree": "9492d59fcd6d767cc7b7ba48822346d3f81b1825",
      "parents": [
        "79bddc29a96ee6afc9a010d031d3612ea95f0883"
      ],
      "author": {
        "name": "Victor Vianna",
        "email": "victor.vianna10@gmail.com",
        "time": "Fri May 01 17:24:39 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 17:24:39 2026"
      },
      "message": "Fix perfetto build in chromium (#5701)\n\nFix IWYU for uint32_t."
    },
    {
      "commit": "79bddc29a96ee6afc9a010d031d3612ea95f0883",
      "tree": "7051ea7c6ec214f213e44b737bed2bca4977f438",
      "parents": [
        "9a4b878df391c076163165f4f110847dd76477db"
      ],
      "author": {
        "name": "Siva Mahadevan",
        "email": "me@svmhdvn.name",
        "time": "Fri May 01 16:44:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 16:44:18 2026"
      },
      "message": "tests: guard remaining integrationtests inside enable_perfetto_integration_tests (#5697)\n\nThis fixes the standalone build with\nenable_perfetto_integration_tests\u003dfalse due to test_helper."
    },
    {
      "commit": "9a4b878df391c076163165f4f110847dd76477db",
      "tree": "5e17c4f9e7a535424fca2311516a8d11f03c7026",
      "parents": [
        "7883f34982775ae960eb9370f79860aa1390464a"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Fri May 01 15:29:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 15:29:47 2026"
      },
      "message": "docs: Add Rust SDK getting started guide (#5678)\n\nAdd docs/getting-started/rust-sdk.md with a step-by-step guide covering\nSDK setup, category definition, track event macros, in-process trace\ncollection, the tracing crate integration via tracing-perfetto-sdk,\ntrace visualization, SQL queries, and combined in-app + system tracing."
    },
    {
      "commit": "7883f34982775ae960eb9370f79860aa1390464a",
      "tree": "14070e6a5b3161ed6e33789176c8e229dad2ccae",
      "parents": [
        "5f9d63e0d645bd83d8def96befe1c995b7a91a08"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri May 01 14:14:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 14:14:31 2026"
      },
      "message": "tp: import Firefox profiler markers as slices (#5686)\n\nParse the `markers` table from preprocessed Gecko/Firefox profiler\nprofiles and emit them as slices in trace_processor:\n\n- Pull `meta.categories` once at the profile level so marker `category`\n  indices resolve to readable names.\n- Capture each per-thread\n`markers.{name,startTime,endTime,phase,category,\n  data}` array; the `data` payload is captured as raw JSON via a new\n  `Iterator::CollectCurrentScope` helper on the JSON parser and\n  flattened into `data.*` args at parse time using\n  `AddJsonValueToArgs`.\n- Phase 0 (Instant) becomes dur\u003d0 slices; phase 1 (Interval) uses\n  `endTime - startTime`; phase 2/3 (IntervalStart/End) are LIFO-matched\n  per (utid, name) via a cookie stack.\n- Markers route through `TrackCompressor` with a blueprint dimensioned\n  by `(utid, marker_name)` so each marker name on each thread gets its\n  own track (matching the Firefox Profiler\u0027s marker chart layout) and\n  same-name overlaps fan out across compressed lanes instead of being\n  dropped.\n- Fix a pre-existing importer bug exposed while developing: when the\n  top-level `shared` block carries only the string table (no shared\n  frames), per-thread frames/stacks were silently dropped. Threading\n  the strings through `Process{Legacy,Preprocessed}FramesAndStacks`\n  fixes this.\n- Refactor `gecko_trace_tokenizer.cc` parsing into single-purpose\n  helpers (`ParseFrameTable`, `ParseFuncTable`, `ParseStackTable`,\n  `ParseSamplesTable`, `ParseMarkersTable`, `ParseMeta`,\n  `ParseMetaCategories`, `ParseThreads`, `ParseMarkerDataArray`) so\n  `ParseThread` and `ParseGeckoProfile` become a flat dispatch.\n- Add a dedicated `dev.perfetto.FirefoxProfilerMarkers` UI plugin\n  (enabled by default) that lays out `firefox_marker` tracks under\n  each thread, sub-grouped by category when a thread spans multiple\n  categories. A single SQL query computes per-(utid, name) track\n  groups with their dominant category and the depth needed for\n  intra-name overlap.\n- Add diff tests covering all four phases, payload flattening, and\n  same-name overlap fanning out across lanes.\n- Update other-formats.md to reflect markers being supported, and add\n  generation instructions for samply and Python\u0027s `profiling.sampling\n  --gecko` (3.15+)."
    },
    {
      "commit": "5f9d63e0d645bd83d8def96befe1c995b7a91a08",
      "tree": "49c0ce89e4287e24a93fe47a1fb20ac5a7919a80",
      "parents": [
        "a5e538337e590432cc92cdbd6fb8fae354177789"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Fri May 01 12:13:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 12:13:51 2026"
      },
      "message": "rust-sdk: Add tracing-perfetto-sdk crate (#5671)"
    },
    {
      "commit": "a5e538337e590432cc92cdbd6fb8fae354177789",
      "tree": "35f6ddee6dca6e85c33e73e7a7748fdde8a76fe4",
      "parents": [
        "884c89dd0d9e6db1f938bf732b434dd7ddc0bc91"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri May 01 11:29:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 11:29:11 2026"
      },
      "message": "ui: Fix theme colors for time-based line and sankey charts (#5693)\n\nTheme colors were previously not being applied properly for the\nfollowing charts:\n- Line chart using time as the x-axis (hack, but requirement for multi\nseries line charts).\n- Sankey charts.\n\nThis patch fixes this by wiring up the themes properly."
    },
    {
      "commit": "884c89dd0d9e6db1f938bf732b434dd7ddc0bc91",
      "tree": "c467098d186f68b0598a50bdcb605c8fe2604c6f",
      "parents": [
        "eb4b616efc8145eab1b5bef7c8ded64e84a8b046"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri May 01 11:23:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 11:23:27 2026"
      },
      "message": "ui: Disable chart tooltip transitions (#5692)\n\nEchart\u0027s tooltip transitions (the feature where the tooltip lags behind\nthe mouse cursor when mousing over charts) appear to make echart\u0027s\nseries level highlight feature rather flakey. This patch simply disables\nall transitions. Tooltips appear immediately and stay directly under the\nmouse cursor."
    },
    {
      "commit": "eb4b616efc8145eab1b5bef7c8ded64e84a8b046",
      "tree": "ea7479375ccd25252a51fc5f8f896b4da1308f99",
      "parents": [
        "cb95906dc212b7ca90d2a1b381225f148883bd4b"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri May 01 11:21:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 11:21:11 2026"
      },
      "message": "ui: Charts: Add bottom aligned legends (#5691)\n\n- Add option to show the legent at the bottom of the chart, in addition\nto the top or right.\n- Adjust chart margin when right or bottom legend mode is used to avoid\noverlapping the chart content.\n\n\u003cimg width\u003d\"581\" height\u003d\"277\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/62292a39-4a15-4266-876a-b7acd321268c\"\n/\u003e"
    },
    {
      "commit": "cb95906dc212b7ca90d2a1b381225f148883bd4b",
      "tree": "39b962a1e6f6a14659e0f3c7c67940c524f2c9c9",
      "parents": [
        "85dbfccb11cc082dc695e8668ff94245338186fc"
      ],
      "author": {
        "name": "Mayzner",
        "email": "mayzner@google.com",
        "time": "Fri May 01 10:20:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 10:20:06 2026"
      },
      "message": "docs: Data Explorer docs stub (#5689)\n\nA test only first draft of Data Explorer docs - next step is adding some\ngifs/videos and cutting things that might be not stated clearily"
    },
    {
      "commit": "85dbfccb11cc082dc695e8668ff94245338186fc",
      "tree": "63546c525b9bb3a9359281ae9637c0551da085bb",
      "parents": [
        "6e80d80ce34e00e072df6576d9afd176a50330bc"
      ],
      "author": {
        "name": "Mayzner",
        "email": "mayzner@google.com",
        "time": "Fri May 01 10:16:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 10:16:27 2026"
      },
      "message": "tp: Add tables with stdlib documentation data (#5555)"
    },
    {
      "commit": "6e80d80ce34e00e072df6576d9afd176a50330bc",
      "tree": "184e6fafc7376abf41aac5d1dabd6361f499630b",
      "parents": [
        "c40a2c8d9084cf582adf6e5b96b56e3645cfda1b"
      ],
      "author": {
        "name": "Mayzner",
        "email": "mayzner@google.com",
        "time": "Fri May 01 10:09:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 10:09:08 2026"
      },
      "message": "Add mayzneranna to external contributors (#5688)"
    },
    {
      "commit": "c40a2c8d9084cf582adf6e5b96b56e3645cfda1b",
      "tree": "28d14f6df0e2ac3c3f60f6c3acb4da63899543b7",
      "parents": [
        "17c458e71090fd41e00f634eecc482da987d491c"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri May 01 09:12:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 09:12:38 2026"
      },
      "message": "ui: Fix macos build (#5687)\n\nUse the right bin dir in buildtools to run `emcc`."
    },
    {
      "commit": "17c458e71090fd41e00f634eecc482da987d491c",
      "tree": "94f4fbdb4c59939c0dd666f6ab2400cd461e06f3",
      "parents": [
        "ac0380784ddeaf48469b1b9041a43f6bf33af3c8"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri May 01 09:12:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 09:12:12 2026"
      },
      "message": "bazel: fix remaining layering_check violations (#5685)\n\nBuilds cleanly under `tools/bazel build --features\u003dlayering_check\n//:all` (732 targets). Companion to #5684.\n\nHeader source_sets: query_result_serializer, trace_processor_shell,\nand traceconv had no public_deps but their headers include perfetto\nbase/trace_processor headers; layering_check rejects this. Add the\nmissing public_deps so gen_bazel emits direct cc_library deps.\n\ntables_python consumers: ten BUILD.gn files depended directly on\n//src/trace_processor/tables:tables_python (a tp_tables custom action\nthat emits only *_py.h). The generated *_py.h files include\nmacros_internal.h, which lives in the source_set wrapper\n//src/trace_processor/tables:tables (with public_deps on tables_python).\nSwitch the deps to the wrapper so layering_check sees a direct dep on\nthe target owning macros_internal.h.\n\nGenerated proto/IPC libraries: perfetto_cc_protocpp_library and\nperfetto_cc_ipc_library only declared :protozero / :perfetto_ipc as\ndeps, but the generated .gen.cc/.ipc.cc files include directly from\nperfetto/{base,protozero,ext/ipc}/*.h. Add the corresponding\ninclude_perfetto_* targets as direct deps in the macros.\n\nStandalone protobuf split: upstream protobuf doesn\u0027t expose\ncompiler/parser.h, io/tokenizer.h, io/printer.h, etc. through the\n:protoc_lib alias (which only re-exports main.cc\u0027s deps). Expand\nPERFETTO_CONFIG.deps.protoc_lib to bundle the per-subdir targets that\nown those headers (compiler:{code_generator,importer,plugin},\nio:{io,printer,tokenizer}).\n\nMissing GN deps: trace_processor_shell_lib, shell:shell, and the four\nprotoc plugins all #include from \u003cgoogle/protobuf/...\u003e sub-namespaces\nbut were missing the corresponding gn:protoc_lib / gn:protobuf_full\ndeps. Add them. multifile_error_collector likewise needed protoc_lib."
    },
    {
      "commit": "ac0380784ddeaf48469b1b9041a43f6bf33af3c8",
      "tree": "0d7f0b0094af7a518a57ce730be5c66ec271cac6",
      "parents": [
        "270160aaa0da59467d98e89a2f90d55111a00098"
      ],
      "author": {
        "name": "Primiano Tucci",
        "email": "primiano@google.com",
        "time": "Fri May 01 09:10:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 09:10:00 2026"
      },
      "message": "perfetto: tbv2: fix bytes_overwritten over-counting consumed chunks (#5676)\n\nTraceBufferV2\u0027s bytes_overwritten / chunks_overwritten were incremented\nunconditionally for every non-padding chunk encountered in\nDeleteNextChunksFor. The intent was that fully-consumed chunks would\nhave already been turned into padding by ChunkSeqReader::\nEraseCurrentChunk before any overwrite reached them, but that\ninvariant doesn\u0027t hold:\n\n- ConsumeFragment decrements payload_avail to 0 on the last fragment\n  of a chunk and returns true to the caller. EraseCurrentChunk only\n  runs lazily on the next ReadNextPacketInSeqOrder iteration when\n  NextFragmentInChunk returns nullopt. Between those two points the\n  chunk has payload_avail \u003d\u003d 0 and is_padding() \u003d\u003d false.\n- For reassembled fragmented packets, ConsumeFragment runs on every\n  chunk in the chain (kFragBegin, kFragContinue, kFragEnd) but only\n  the kFragBegin chunk is on seq_iter_; the rest are stranded in the\n  same consumed-but-not-padded state until the consumer\u0027s iterator\n  walks over each one in subsequent reads.\n- BeginRead resets chunk_seq_reader_, so these chunks survive across\n  IPC task boundaries (ReadBuffersIntoConsumer yields every ~32KB)\n  until the next buffer-order walk reaches them.\n\nA producer wrap during any of these gaps walked the chunk in\nDeleteNextChunksFor and credited bytes_overwritten with the full outer\nsize, even though no data was lost. With ~8-25 active sequences the\nphantom over-count lands in the 30-100KB range, matching the symptom\nthat surfaced in production.\n\nMove the counter increment into ConsumeFragment, gated on mode_ \u003d\u003d\nkEraseMode, mirroring how bytes_read / chunks_read already work in\nkReadMode. The counter now fires from the canonical \"the last byte of\nthis chunk\u0027s payload was just consumed (or evicted)\" point. Chunks\nthat enter DeleteNextChunksFor with payload_avail already at 0 are\nwalked, erased, and not credited — matching V1\u0027s \"had unread\nfragments\" semantics.\n\nReassembleFragmentedPacket previously skipped its consumption loop on\nkNotEnoughData, which produced a symmetrical under-count for\nkFragBegin chunks pending a patch that never arrives: the chunk had\nunread data but ConsumeFragment never ran, so neither V1- nor old-V2-\nequivalent accounting fired. Treat kEraseMode + kNotEnoughData like\nkDataLoss for consumption purposes (the chain is about to be evicted\neither way), and restructure the early-return on kChunkNeedsPatch on\nthe initial chunk so it falls through to the consumption loop."
    },
    {
      "commit": "270160aaa0da59467d98e89a2f90d55111a00098",
      "tree": "7da5b53eda54c2a5e5f78f42c59202f3bed354ac",
      "parents": [
        "de81fe953a9d66412ad7415923e8bc4eff0ee594"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri May 01 08:22:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 08:22:59 2026"
      },
      "message": "ui: Overhaul SegmentedButtons widget (#5672)\n\n- Make usage more natural and by making use of compound components and\ncreateContext. This is the classic React-style compound components\npattern (see https://www.epicreact.dev/soul-crushing-components).\n- Update usage in all call-sites.\n- Don\u0027t depend on `Button` any more - avoids bugs when button styles\nchange.\n- Add intent for coloring the active button.\n\nThe new API look like this:\n\n```ts\nm(SegmentedButtons, {\n  selectedId: this.view,\n  onOptionSelected: (value) \u003d\u003e (this.view \u003d value),\n}, [\n  m(SegmentedButton, {value: \u0027day\u0027}, \u0027Day\u0027),\n  m(SegmentedButton, {value: \u0027week\u0027}, \u0027Week\u0027),\n  m(SegmentedButton, {value: \u0027month\u0027}, \u0027Month\u0027),\n]);\n```\n\nExample of the \u0027primary\u0027 intent applied.\n\n\u003cimg width\u003d\"186\" height\u003d\"61\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/7510b4e4-8618-4aaa-b787-4479f1a51b7c\"\n/\u003e"
    },
    {
      "commit": "de81fe953a9d66412ad7415923e8bc4eff0ee594",
      "tree": "f29dad959306e1b6f2838466bcbe9e5801491a36",
      "parents": [
        "a063d46d82bed7cc933ce47bdefbc6d6eaa343c6"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri May 01 08:12:44 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 08:12:44 2026"
      },
      "message": "ui: Add optional actions buttons to grid cells (#5669)\n\nAdds an optional \u0027actions\u0027 slot for injecting buttons and other such\nentities into grid cells in both the Grid and DataGrid widgets.\n\nFor example - a primary rounded button:\n\u003cimg width\u003d\"417\" height\u003d\"144\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/508ee30e-ce25-4176-88da-c82f2a2349f9\"\n/\u003e"
    },
    {
      "commit": "a063d46d82bed7cc933ce47bdefbc6d6eaa343c6",
      "tree": "0aefeab65d64968f0fd21d1986a76b3a1a8fdfdf",
      "parents": [
        "68532725d3c6e120924b5d9816cb37e4d9abe2d7"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 23:08:02 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:08:02 2026"
      },
      "message": "bazel: attempt to fix include violations on blaze (#5684)"
    },
    {
      "commit": "68532725d3c6e120924b5d9816cb37e4d9abe2d7",
      "tree": "335610779de6b8b87f62a847848e9bd03e0e2593",
      "parents": [
        "4725cd793bdb7ca1224424e42d29f3d978fbb45f"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Thu Apr 30 22:30:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 22:30:57 2026"
      },
      "message": "ui: Add Debug Track button to DistributionPanel header (#5681)\n\nPins the panel\u0027s source query (dataset + filter) as a debug slice track\non the timeline, named after the panel."
    },
    {
      "commit": "4725cd793bdb7ca1224424e42d29f3d978fbb45f",
      "tree": "80d8fec0166dd582be9f19ee1b31a8858c593f51",
      "parents": [
        "35758566959e1646ff475c7cc36ef9407d0713bb"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Thu Apr 30 19:50:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 19:50:22 2026"
      },
      "message": "ui: Encapsulate plugin state in HeapDumpExplorerSession (#5679)\n\nThe plugin\u0027s mutable state was scattered across module-level let/const\nvariables, static fields on HeapDumpPage, and the\ndumps/activeDump/bitmap-cache globals in queries.ts, with implicit reset\nsemantics.\n\nConcentrate it on a session class constructed per onTraceLoad: the\nsession owns nav, dumps, tabs, and the cached overview, and is\nregistered with the page via ctx.pages.registerPage so it\u0027s captured by\nclosure and disposed with the trace."
    },
    {
      "commit": "35758566959e1646ff475c7cc36ef9407d0713bb",
      "tree": "16b3c193c97245db484af7c4d424a269bd511e52",
      "parents": [
        "e024c8c8faa2f9ebdc256459bba0dc8c1e6d7d2f"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 18:52:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 18:52:15 2026"
      },
      "message": "tp: emit cc_library for source_sets in gen_bazel (#5664)\n\nMap GN source_sets to perfetto_cc_library instead of perfetto_filegroup,\nso each one is its own bazel target with its own srcs, hdrs and deps,\nand Bazel resolves the graph transitively. This drops the awkward\n\"inline transitive_source_set_deps as srcs\" model that gen_bazel used\nto work around the lack of source_set in Bazel.\n\nTrack the direct GN deps (before bubbling up from source_sets/groups)\nin `immediate_deps` and use them when emitting cc_library deps, so the\ngenerated BUILD only lists each target\u0027s actual immediate dependencies.\n\nDrop the gen_bazel ODRChecker call: it was guarding against same-file\nduplication caused by inlining a source_set into multiple linker units,\nwhich can\u0027t happen now that each source_set is its own cc_library.\n\nThe previous force_alwayslink propagation in gen_bazel becomes a no-op:\n`alwayslink \u003d True` lands directly on the source_set\u0027s cc_library and\nBazel propagates it to dependents."
    },
    {
      "commit": "e024c8c8faa2f9ebdc256459bba0dc8c1e6d7d2f",
      "tree": "ad6df0c485a45e6a05934af9866ba20e2cb830d6",
      "parents": [
        "695aa7c2bc43b4eb8248dd3a0e2652e1e88129e7"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 18:41:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 18:41:11 2026"
      },
      "message": "perfetto: fix false data_loss on re-admit in TraceBufferV2 (#5644)\n\nChunkSeqReader\u0027s ctor checks iter_-\u003echunk_id against\nlast_chunk_consumed.chunk_id + 1 to detect a gap in the sequence. But\nwhen a previously-evicted incomplete chunk is re-admitted via the\nre-admit path in CopyChunkUntrusted (same chunk_id, was_incomplete\u003dtrue,\nstrictly more payload), the new iter_ lands on the same chunk_id as\nlast_consumed — so the +1 check fires spuriously and seq.data_loss is\nset even though the re-admit recovered the deferred fragments without\nlosing any data.\n\nThe next packet delivered for that sequence then carries\nprevious_packet_dropped\u003dtrue, which trace_processor surfaces as\ntraced_buf_sequence_packet_loss. This bites real traces with heavy\nscraping/recommit traffic (chunks_rewritten dominated) and can show up\nas nonzero packet loss even on under-utilized buffers with no\ntrace_writer_packet_loss and no overwrites.\n\nMirror the re-admit acceptance condition in the gap check: skip data\nloss when iter_-\u003echunk_id \u003d\u003d last.chunk_id and last.was_incomplete.\nThis is the symmetric counterpart of the re-admit path; any other\nequality case is impossible because CopyChunkUntrusted would have\ndiscarded the chunk before it reached the buffer.\n\nAdds RescrapeAfterEviction_NoFalseDataLoss alongside the existing\nrescrape tests, which exercised the same path but didn\u0027t assert on\nprevious_packet_dropped."
    },
    {
      "commit": "695aa7c2bc43b4eb8248dd3a0e2652e1e88129e7",
      "tree": "c5974da3d2e50d5b5f6d796e6039f5ff0365af1a",
      "parents": [
        "fde1f8d625b51484f7e72777151d4fb624b6976b"
      ],
      "author": {
        "name": "Bryce Arden",
        "email": "arden.bryce@gmail.com",
        "time": "Thu Apr 30 17:57:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 17:57:04 2026"
      },
      "message": "sdk: Add track_event_buf_exhausted_policy to TracingInitArgs (#5409)\n\nAdd a track_event_buffer_exhausted_policy field to TracingInitArgs,\nallowing apps to set the buffer exhausted policy (drop vs stall)\nfor TrackEvent at initialization time.\n\nThe value is stashed in TrackEventInternal static state during\nTracing::Initialize() and read during TrackEvent::Register(),\nfollowing the same pattern as use_monotonic_clock and\ndisallow_merging_with_system_tracks. A protected Register(dsd,\nparams) overload on DataSource allows TrackEventDataSource to\ninject custom DataSourceParams without intermediate storage.\n\nTrackEvent is used in critical system services (e.g.,\nsystem_server) where an accidental kStall policy could cause a\ndevice soft-reboot. Plumbing through TracingInitArgs removes\nordering ambiguity (Initialize always precedes Register) and\navoids redundant state in DataSourceType. See\nhttps://github.com/google/perfetto/pull/1312 and\nb/384007571.\n\nI don\u0027t have a use-case for also allowing track_event_buf_exhaust_policy\nto be configurable.\nFor now, making a hard-choice when we initialize the process is ok.\nIf we need configurabilty, the extension points are natural; we can\nfollow footsteps of this PR.\n\ncc: @dreveman"
    },
    {
      "commit": "fde1f8d625b51484f7e72777151d4fb624b6976b",
      "tree": "ba9b987ca6b84656cf86b995dd3498d9136de549",
      "parents": [
        "aeba83767df5b693ce951028f76ccc1957b2df77"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 17:49:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 17:49:24 2026"
      },
      "message": "ui: add matching-slice action to selection flamegraph (#5667)\n\nBasically the same as what we added for single selection."
    },
    {
      "commit": "aeba83767df5b693ce951028f76ccc1957b2df77",
      "tree": "47abdae7f3691650b5b4753b3af7ae8cd30c7c01",
      "parents": [
        "81c421a6b611e8fe4a28905f3aea0bed271064fb"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 17:48:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 17:48:32 2026"
      },
      "message": "ui: fix histogram SQL when bucketSize is fractional (#5674)\n\nThe fixed-bucketization branch in ChartSource appended \".0\" to\n${size} to force float division, assuming size was always an\ninteger. With a single slice, computeNiceBuckets produces a\nfractional bucketSize (e.g. 0.02), which interpolated as the\nmalformed literal \"0.02.0\" and crashed the slice distribution\npanel with a syntax error.\n\nUse CAST(${size} AS REAL) instead so division stays float\nregardless of the runtime value\u0027s form."
    },
    {
      "commit": "81c421a6b611e8fe4a28905f3aea0bed271064fb",
      "tree": "bcd9d2289d5a0f8f40b1621e979915bca7163b66",
      "parents": [
        "f2d4bb5def6d78e06d2624bee75966df98a4ae7a"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "george.burgess.iv@gmail.com",
        "time": "Thu Apr 30 16:40:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 16:40:59 2026"
      },
      "message": "android_log: add missing include (#5670)\n\nlibcxx\u0027s `_LIBCPP_REMOVE_TRANSITIVE_INCLUDES` flag leads to an error\nhere:\n\n```\nno member named \u0027strtoul\u0027 in namespace \u0027std\u0027; did you mean simply \u0027strtoul\u0027?\n```\n\nBug: 507952997"
    },
    {
      "commit": "f2d4bb5def6d78e06d2624bee75966df98a4ae7a",
      "tree": "cd04463026cc3951310ee96be9d8e4bcb633967a",
      "parents": [
        "95454ef4fe980334e44eb723090c54c6d17c0cb2"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 16:40:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 16:40:11 2026"
      },
      "message": "perfetto: temporarily mark some things as component to fix blaze (#5675)\n\nAlso +x gen_wattson_curves to fix Android"
    },
    {
      "commit": "95454ef4fe980334e44eb723090c54c6d17c0cb2",
      "tree": "e9c6daa172a607ebde65105e5824630a5f0f123f",
      "parents": [
        "9f20283e1939f5e15afa9d76ce7a9fcb67fc1cc7"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Thu Apr 30 13:35:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 13:35:12 2026"
      },
      "message": "tp: stdlib: Fix lock_name in android_monitor_contention (#5656)\n\nPreviously, `monitor contention*` events with a child `Lock contention*`\nslice were not properly showing a `lock_name` in\n`android_monitor_contention` as the query uses lag and lead to look for\n`*_lock_acquire` and `*_lock_held` slices respectively. This meant that\nthe leading slice would be seen to be the child `Lock contention*` as\nopposed to the adjacent `*_lock_held`.\n\nThis PR changes the logic to fetch both the next two slice names with an\nextra LEAD() statement, and uses CASE to account for both scenarios.\n\nBug: 507922080"
    },
    {
      "commit": "9f20283e1939f5e15afa9d76ce7a9fcb67fc1cc7",
      "tree": "c19f85ffe5bda53e109752671b650f6c0976105e",
      "parents": [
        "be16f77f16352b4b0bc26838a7c1118fc1cae99b"
      ],
      "author": {
        "name": "Primiano Tucci",
        "email": "primiano@google.com",
        "time": "Thu Apr 30 11:49:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 11:49:12 2026"
      },
      "message": "Increase traced_perf delay from 50ms to 250ms (#5668)\n\nMitigation for b/500743345 \u0026 ag/39664453\nTurns out 50ms has become too tight, increasing\nto 250. Otherwise with ag/39664453 bionic will\njust ignore the signal and we\u0027ll ignore the process forever.\nThis is a short-stop gap in light of the sigfree\nwork.\n\nBug: b/500743345"
    },
    {
      "commit": "be16f77f16352b4b0bc26838a7c1118fc1cae99b",
      "tree": "4b829e035247a6da218e7aa4c637207680284ebc",
      "parents": [
        "a6f1f88a6fece1def730a709c0145db5db9e7771"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 11:03:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 11:03:43 2026"
      },
      "message": "ui: add slice duration histogram when single selecting (#5659)\n\nAdds a reusable distribution panel and shows a duration histogram for\nmatching slices from the single-slice details panel.\n\nThe inline details view defaults to the selected slice track, supports\nswitching to whole-trace scope, and links out to a full matching-slices\ntab."
    },
    {
      "commit": "a6f1f88a6fece1def730a709c0145db5db9e7771",
      "tree": "a30a0bc42dca5bb0edcf5d8a28f480a86f975edb",
      "parents": [
        "a8f27c9e309b79b9b9565e47f4057805f4699fa3"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 11:02:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 11:02:45 2026"
      },
      "message": "ui: search and highlight chip text in omnibox commands (#5649)\n\nThe command omnibox shows a \"source\" chip (e.g. plugin name) on the\nleft of each result but neither searched nor highlighted it. Index\nboth name + source so users can filter by either, compute fuzzy\nhighlight segments for the chip, and invert chip colours on the\nhighlighted row so the primary-intent chip stays visible against the\nprimary-coloured selection background.\n\nFuzzyFinder grows an optional displayLookup so a caller can index\ncombined fields while restricting highlight segments to one of them."
    },
    {
      "commit": "a8f27c9e309b79b9b9565e47f4057805f4699fa3",
      "tree": "0fafee70d70372fe4bf3fb1dba6fa94457683e7d",
      "parents": [
        "6f6047abf6923f10037adc651f0f4fe2973f5b04"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Apr 30 10:59:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 10:59:56 2026"
      },
      "message": "ui: Add startDragGesture helper (#5663)\n\nFactors out the pointerdown/move/up/capture/teardown boilerplate that\nseveral minimap components were each reimplementing. Callers pass an\nonDrag (and optionally onDragEnd / onDragFailed); an optional\nonDragStart is available when the gesture needs to capture state at the\nmoment it actually begins.\n\nA configurable deadzone distinguishes clicks from drags - set to 0 (the\ndefault) to start the drag immediately on pointerdown.\n\nAlso handles a Chrome quirk where right-click drags can leave pointer\ncapture stuck if the context menu opens (w3c/pointerevents#408).\n\nBefore:\n\n```ts\nlet lastClientX: number | undefined;\nreturn {\n  view: () \u003d\u003e m(\u0027.handle\u0027, {\n    onpointerdown: (e) \u003d\u003e {\n      e.currentTarget.setPointerCapture(e.pointerId);\n      lastClientX \u003d e.clientX;\n    },\n    onpointerup: (e) \u003d\u003e {\n      e.currentTarget.releasePointerCapture(e.pointerId);\n      lastClientX \u003d undefined;\n    },\n    onpointermove: (e) \u003d\u003e {\n      if (lastClientX \u003d\u003d\u003d undefined) return;\n      attrs.onDrag(e.clientX - lastClientX);\n      lastClientX \u003d e.clientX;\n    },\n  }),\n};\n```\n\nAfter:\n\n```ts\nview: () \u003d\u003e m(\u0027.handle\u0027, {\n  onpointerdown: (e) \u003d\u003e {\n    let lastClientX \u003d e.clientX;\n    startDragGesture({\n      e,\n      onDrag: (ev) \u003d\u003e {\n        attrs.onDrag(ev.clientX - lastClientX);\n        lastClientX \u003d ev.clientX;\n      },\n    });\n  },\n}),\n```"
    },
    {
      "commit": "6f6047abf6923f10037adc651f0f4fe2973f5b04",
      "tree": "3a25fd6de483fcabd782075c8ed3cc5d39039f7e",
      "parents": [
        "d4f990a2238adec71b63a2b40bc9b280e1cd179d"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Apr 30 10:51:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 10:51:18 2026"
      },
      "message": "ui: Add QueryPage SQL formatting via syntaqlite (#5662)\n\n- Add syntaqlite as an npm dependency and copy the wasm bundle to the\nout dir on build.\n- Build the syntaqlite perfetto dialect and place in out dir.\n- Add a format button to the query page.\n- Lazily load the formatter engine and dialect when the user presses the\nformat button.\n- Add Alt/Opt+Shift+F keybind in codemirror to trigger the formatting."
    },
    {
      "commit": "d4f990a2238adec71b63a2b40bc9b280e1cd179d",
      "tree": "82c4a0e3b5fd05c38501df2acdf91f14d5102aae",
      "parents": [
        "e0e5e4c362dd0f7d656dd8a711a5785011cb0d1a"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Thu Apr 30 10:46:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 10:46:54 2026"
      },
      "message": "ui: Fix pinning manager to account for manually pinned tracks (#5652)\n\nPreviously TrackPinningManager did not account for manually pinned\ntracks, causing them to be overwritten when the manager is loaded, or\nwhen tracks are unpinned. This PR adds the tracking of \"managed\" pinned\ntracks which ensures manually pinned tracks are unaffected by pinning\nchanges by TrackPinningManager.\n\nBug: 506137383"
    },
    {
      "commit": "e0e5e4c362dd0f7d656dd8a711a5785011cb0d1a",
      "tree": "43e2d269e680a787df85a366aa0c3218c7a5174c",
      "parents": [
        "6f2f2e5e869e41fedd8a47e98eb3d72532797c1c"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Apr 30 10:16:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 10:16:51 2026"
      },
      "message": "tp: fix blaze and android.bp builds (#5657)"
    },
    {
      "commit": "6f2f2e5e869e41fedd8a47e98eb3d72532797c1c",
      "tree": "8fb8b13c8e72178beeafe74aa3ce73692bf52216",
      "parents": [
        "306a4ef8c83f66701ae0071929e42e2c27785f66"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Apr 30 09:19:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 09:19:00 2026"
      },
      "message": "ui: Add dependencies and dependants to plugins page (#5661)\n\n- Add list of dependencies (requires) to each plugin.\n- Add list of dependants (required by) to each plugin.\n- Each plugin in the list is a clickable link to that plugin.\n- If a plugin is disabled but transitively enabled by another plugin it\nnow has a badge indicating this.\n- Each plugin link is colored green or gray dependeing on whether it\u0027s\nenabled or disabled, allowing the user to easily see which plugin is\nkeeping this plugin enabled through a transititive dependency.\n\n\u003cimg width\u003d\"939\" height\u003d\"613\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/ad351713-dcb5-48a3-bff7-7493349a0214\"\n/\u003e"
    },
    {
      "commit": "306a4ef8c83f66701ae0071929e42e2c27785f66",
      "tree": "882b43902600ce0422ab48c54449e7e73d2e8a1f",
      "parents": [
        "af628da20b9b4ccc509b96e199a1c4e6453a5121"
      ],
      "author": {
        "name": "Nicolò Mazzucato",
        "email": "nicomazz@google.com",
        "time": "Thu Apr 30 09:16:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 09:16:57 2026"
      },
      "message": "Monitor Render Thread blocking calls during Android CUJs (#5645)\n\nUntil now the blocking calls were only considering what was happening in\nthe ui thread associated with the CUJ. After this change, we\u0027re also\nconsidering the render thread of the process reporting the CUJ.\n\nThe render thread is a single one for each process, and is identified\nwith the thread name.\n\nCUJ boundaries considered are left unchanged."
    },
    {
      "commit": "af628da20b9b4ccc509b96e199a1c4e6453a5121",
      "tree": "3c55d7c36bfa8cb4cc774bd6306a039ac6c7c911",
      "parents": [
        "f3bc3ed96c3e2070dcd9997b75b971823276be36"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Thu Apr 30 07:40:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 07:40:36 2026"
      },
      "message": "Sync generated proto files (#5660)\n\nThis PR automatically synchronizes generated proto files with their\n`.proto` definitions.\n\n## Generated files updated\n- `.gen.cc` and `.gen.h` files\n- `.pcz.h` files\n- Binary descriptors\n- Python proto bindings\n\nThis is an automated PR generated by the `sync-protos` workflow.\n\nCo-authored-by: perfetto-automation[bot] \u003cperfetto-automation-github-app@google.com\u003e"
    },
    {
      "commit": "f3bc3ed96c3e2070dcd9997b75b971823276be36",
      "tree": "6c13b40cea06dc83c228c1d52ee8069f2b98e5cc",
      "parents": [
        "0debe7dc68067fe188b762f40abe43256bdb3d60"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Thu Apr 30 00:36:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 00:36:47 2026"
      },
      "message": "gpu: Add GenericGpuFrequencyEvent and move GpuMemTotalEvent (#5654)\n\nAdd GenericGpuFrequencyEvent proto in generic_kernel/ following the\nsame pattern as GenericKernelCpuFrequencyEvent. This provides a\nstable public API for non-ftrace data sources to emit GPU frequency\ndata. The trace processor reuses kGpuFrequencyBlueprint so the\nresulting tracks are identical to ftrace gpu_frequency events and\nthe UI discovers them automatically.\n\nMove GpuMemTotalEvent from android/ to gpu/ alongside the other\nGPU event protos.\n\nReorganize the TracePacket oneof into three sections: stable\nTrackEvent API, stable generic kernel events, and unstable\ncontext-specific fields.\n\nGenerate Rust SDK bindings for both protos and add them to the\nTracePacket extension in perfetto-protos-gpu."
    },
    {
      "commit": "0debe7dc68067fe188b762f40abe43256bdb3d60",
      "tree": "7ececaa4ef1565503b2b17080d4d31a628cd8112",
      "parents": [
        "6fdadc46ae0b271071fd5789fe1d5db7d71ef8fb"
      ],
      "author": {
        "name": "Samuel Wu",
        "email": "wusamuel@google.com",
        "time": "Wed Apr 29 20:20:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 20:20:50 2026"
      },
      "message": "ui: Wattson: Reduce work in onActivate() (#5651)\n\nWattson was doing unnecessary work on trace load, so simplify the\ncomputation needed to check for support.\n\nMain savings comes from checking for cpu_idle counters with the prelude\ntables rather than including the Wattson cpu_idle tables.\n\nAlso add some micro-optimizations: Use Promise.all to send all support\nchecks at once, use EXISTS() instead of COUNT() in checking support\ntables, and combine support checks in a single SQL query instead of\nmultiple.\n\nBug: 507808925\nTest: Manually test plugin load time in UI\n\nSigned-off-by: Samuel Wu \u003cwusamuel@google.com\u003e"
    },
    {
      "commit": "6fdadc46ae0b271071fd5789fe1d5db7d71ef8fb",
      "tree": "779ebd68a46d4c50dd014ed44dbdccadfd178a5e",
      "parents": [
        "96f54d3941b657ce41b3f22865a3ae12b4281d11"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Wed Apr 29 20:11:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 20:11:41 2026"
      },
      "message": "rust-sdk: add track_descriptor and sequence fields to TracePacket (#5653)\n\nAdd TrackDescriptor, trusted_packet_sequence_id, and\nfirst_packet_on_sequence fields to the Rust SDK\u0027s TracePacket proto\nbindings. These are essential for emitting track-scoped events and\nproperly identifying packet sequences. All three use types already\ndefined in the SDK so no new bindings are needed."
    },
    {
      "commit": "96f54d3941b657ce41b3f22865a3ae12b4281d11",
      "tree": "d0b1c8c32f71d94301cf1834497299af2928a2e3",
      "parents": [
        "7732dddef16b4aee06920417036794d067ce642f"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Wed Apr 29 17:51:23 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 17:51:23 2026"
      },
      "message": "tools: make cpp_blob_emitter executable (#5650)"
    },
    {
      "commit": "7732dddef16b4aee06920417036794d067ce642f",
      "tree": "11e46ca46a169be89529da3f400acad679e88bce",
      "parents": [
        "3578f390dfe86fda2feff18b6bf97eb81b7980d1"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Apr 29 17:32:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 17:32:45 2026"
      },
      "message": "tp: add syntaqlite-driven macro expansion behind a flag (#5615)\n\n**Stack:**\n\n1. #5614 — `tp: prep PerfettoSqlParser for a second backend`\n2. **#5615 — `tp: add syntaqlite-driven macro expansion behind a flag`**\n← you are here\n3. #5525 — `tp: replace sqlfluff formatter with syntaqlite` (parallel;\nbased on #5615)\n4. #5616 — `tp: route PerfettoSqlParser through syntaqlite macro\nexpansion`\n5. #5472 — `tp: delete the legacy PerfettoSqlPreprocessor`\n\n---\n\nAdds a second PerfettoSqlParser backend that delegates macro expansion\nand statement splitting to the vendored syntaqlite library, behind a\ncompile-time `PerfettoSqlParser::kUsesSyntaqliteMacros` constant\n(default: false). Both implementations live side by side; flipping the\nconstant is a one-line change.\n\n * Bumps the vendored syntaqlite drop (`syntaqlite_perfetto.{c,h}` and\n   the `--macro-style rust` regen flag) to expose the macro-lookup\n   callback and rewrite-introspection APIs the new path needs. The\n   bump tokenizes `!` as TK_BANG (188) instead of TK_ILLEGAL, so the\n   existing preprocessor\u0027s macro detection and the SqliteTokenizer\u0027s\n   re-exported token table are taught about kBang to keep the legacy\n   path green.\n * Adds `IntrinsicMacroExpander` for the `__intrinsic_*` shims\n   (stringify, token_apply, …) and a `MacroRewriteBuilder` that\n   walks syntaqlite\u0027s flat rewrite list to rebuild a SqlSource with\n   the same nesting as the authored macro calls (so SQLite-side\n   error tracebacks resolve back to the call site).\n * Adds `SqlSource::FromMacroExpansion` for tagging rewrite nodes\n   with their macro of origin.\n * Drops `SyntaqliteMacroImpl` next to `LegacyImpl` in\n   `parser.cc`; the wrapper holds both as `std::optional\u003c\u003e` and\n   the public methods dispatch via `if constexpr`.\n * Brings the new parser unittests for macro expansion. The single\n   intrinsic-token-apply test that depends on the new path\u0027s exact\n   whitespace is gated with `if constexpr (kUsesSyntaqliteMacros)`.\n\nNo production behaviour change: the constant defaults to false so\ntrace_processor still routes through the handwritten preprocessor.\nSanity-flipped locally and verified parser/preprocessor unittests\nplus the PerfettoSQL diff tests pass on both paths."
    },
    {
      "commit": "3578f390dfe86fda2feff18b6bf97eb81b7980d1",
      "tree": "704bdd632f01aff0b10210897746f8cf099201b6",
      "parents": [
        "75fc7f81ead60d4db95beacb3ff76a315f00fccf"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Apr 29 16:58:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 16:58:53 2026"
      },
      "message": "tp: extract IncrementalState to fix CustomState UAF (#5593)\n\nFixes the use-after-free flagged in\n`PacketSequenceStateGeneration::CustomState`.\n\n## The bug\n\nPreviously, each `CustomState` held a raw `generation_` back-pointer\nthat was re-pointed every time a new generation was created via\n`OnNewTracePacketDefaults` (the `set_generation(this)` loop in the\nmulti-arg ctor). The `TraceSorter` can hold a `RefPtr` to an older\nGeneration `G1` while a newer `G2` — to which `G1`\u0027s shared CustomState\nhad been re-pointed — is dropped after `SEQ_INCREMENTAL_STATE_CLEARED`.\n`G1` stays alive (and so does the CustomState), but its `generation_`\nthen dangles to freed memory; any subsequent lookup through the\nCustomState dereferences the freed `G2`.\n\n## The fix\n\nRefactor the generation/CustomState relationship so that lifetime is\ncorrect **by construction**:\n\n- New `IncrementalState : RefCounted`. Owns the\nper-incremental-state-interval data: `interned_data_`, the array of\n`CustomState`s (now `unique_ptr` rather than `RefPtr`), and the\npersistent thread descriptor. A new `IncrementalState` is constructed\nonly on `SEQ_INCREMENTAL_STATE_CLEARED`.\n\n- `PacketSequenceStateGeneration` becomes a thin\nper-`trace_packet_defaults` snapshot: holds `RefPtr\u003cIncrementalState\u003e`\n(shared with sibling generations within the same interval), the defaults\nblob, and the validity flag. All interned-data / custom-state /\nthread-descriptor accessors are forwarders to the `IncrementalState`.\n\n- `CustomState` is no longer `RefCounted` (it\u0027s owned uniquely by its\n`IncrementalState`). Its back-pointer is `IncrementalState*` and is set\nexactly once at lazy-allocation time inside\n`IncrementalState::GetCustomState\u003cT\u003e`. Because the `IncrementalState`\nowns the `CustomState`, the pointer is stable for the entire life of the\nCustomState — UAF impossible.\n\n- `OnNewTracePacketDefaults` no longer copies the `InternedFieldMap` or\nre-points CustomStates; it constructs a new Generation that shares the\nsame `RefPtr\u003cIncrementalState\u003e`. This removes a per-defaults-change copy\nthat could be O(map-size) in the hot path.\n\n- `OnPacketLoss` walks the IncrementalState\u0027s CustomState array and\nclears any slot whose `ClearOnPacketLoss()` opted in (TES today), then\nreturns a new Generation referencing the same `IncrementalState` with\nthe validity bit cleared.\n\n---\n\n**Stack:**\n- #5588 — tp: stop mutating PacketSequenceStateGeneration on packet loss\n- #5590 — tp: split TrackEventSequenceState into descriptor + delta\nstate\n- **#5593 — tp: extract IncrementalState to fix CustomState UAF** (this\nPR)"
    },
    {
      "commit": "75fc7f81ead60d4db95beacb3ff76a315f00fccf",
      "tree": "110a3a470f1de2f4804bbb093d18e90cc448a266",
      "parents": [
        "0b8d48cafb69cf96e94e91196c891706142f6c49"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Apr 29 16:27:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 16:27:16 2026"
      },
      "message": "ui: signifcantly improve performance for incomplete slice fetch (#5637)\n\nDoing a window function is highly inefficient as you pay the cost\nfor O(n) slices instead of O(m) incomplete slices with a nested\nsubquery fetching the next entry instead.\n\nCuts the time taken on large traces without incomplete events from\n~2s to 8ms"
    },
    {
      "commit": "0b8d48cafb69cf96e94e91196c891706142f6c49",
      "tree": "4b4bba8a4d09eb323370c1545ec38773a92eeefb",
      "parents": [
        "c44bc4b4f46d8c39f13470105e69dc8bd2280f4f"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Apr 29 16:11:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 16:11:40 2026"
      },
      "message": "ui: make legacy macro loading flow direct you to extension servers (#5636)\n\nThis makes team specific splitting possible and allows this flow to be\nsustainable."
    },
    {
      "commit": "c44bc4b4f46d8c39f13470105e69dc8bd2280f4f",
      "tree": "1b36e1ad287394cd5b16324eda2bc0c53f7dca4e",
      "parents": [
        "613a9e064de526f3c272287d790f5a38882ffb3b"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Apr 29 15:36:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 15:36:41 2026"
      },
      "message": "tp: add wattson plugin for compressed curve data (#5611)\n\nReplaces ~315 KB of stdlib SQL `VALUES` rows with a new plugin under\n`src/trace_processor/plugins/wattson/` that ships per-(device,\ncurve_type) data as 5 zlib-compressed C++ blobs (~35 KB total). The five\n`wattson.curves.*` stdlib modules become one-line wrappers over new\n`_wattson_curves_*()` table functions registered by the plugin.\n\nAlso adds `AdhocDataframeBuilderOptions::emit_auto_id` so callers that\nsupply their own primary key (like `StaticTableFunctionModule`\u0027s\nsynthetic `_auto_id`) can opt out of the implicit column.\n\nAll 21 `Wattson*` diff tests pass.\n\n## Stack\n- #5610 — `perfetto: add perfetto_cpp_blob_header codegen primitive`\n- **#5611 — this PR**"
    },
    {
      "commit": "613a9e064de526f3c272287d790f5a38882ffb3b",
      "tree": "5698efd1a818f1f0a596f6b1d5d13b5a0d782be8",
      "parents": [
        "22d19262a1f45ec1d2ebce5ed52c44cc694de667"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Apr 29 15:26:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 15:26:25 2026"
      },
      "message": "ui: fix modules stepping one each other in extension servers (#5648)\n\nAllows for multiple modules inside a single server to contibute sql\nwithout\noverwriting each other."
    },
    {
      "commit": "22d19262a1f45ec1d2ebce5ed52c44cc694de667",
      "tree": "a6d039267643e9ecb9787394cd90ad39eef7c784",
      "parents": [
        "d121dc8f7161bae373d046963a9f0fb059bd961a"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Wed Apr 29 14:32:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 14:32:11 2026"
      },
      "message": "rust-sdk: fix codegen for cross-crate proto extensions (#5646)"
    },
    {
      "commit": "d121dc8f7161bae373d046963a9f0fb059bd961a",
      "tree": "f03b58e08ffc80bc39df7052596a0398dcadfb68",
      "parents": [
        "de30af93767c817d8027bf79a18393187a1e880a"
      ],
      "author": {
        "name": "Mayzner",
        "email": "mayzner@google.com",
        "time": "Wed Apr 29 14:30:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 14:30:22 2026"
      },
      "message": "de: Improve testing utils (#5647)\n\nMigrate test files to testing utils, meaningfully improving the tests\nredability and making the test infra more cohesive."
    },
    {
      "commit": "de30af93767c817d8027bf79a18393187a1e880a",
      "tree": "d0e8ceab697c8f75fc60242ddf35debde2d9e355",
      "parents": [
        "74b90423478e6ff31ecc990532eeb093bc6c3ee0"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Wed Apr 29 12:26:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 12:26:36 2026"
      },
      "message": "docs: Document subcommand-based trace_processor CLI (#5632)"
    },
    {
      "commit": "74b90423478e6ff31ecc990532eeb093bc6c3ee0",
      "tree": "2a8f9aa197307329526e95d1f88e2aa0fe4fc813",
      "parents": [
        "72cba8d0a743ced2b29eab873279da9290258f91"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Wed Apr 29 11:36:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 11:36:40 2026"
      },
      "message": "ui: Refactor sidebar (#5606)\n\nRefactored sidebar by extracting a number of components into their own\nclasses, and also moved the timeline menu item out into the timeline\nplugin.\n\nThis patch is a pure refactor - no functional changes."
    },
    {
      "commit": "72cba8d0a743ced2b29eab873279da9290258f91",
      "tree": "cc1014d282fab2bda91ea91ee913f34fef57e46f",
      "parents": [
        "4085100d9e3d1e13d5a3971fd319f4e466af6b18"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Wed Apr 29 10:54:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 10:54:30 2026"
      },
      "message": "ui: Switch active heap dump on \u0027Open in Heapdump Explorer\u0027 (#5641)\n\nWhen clicking \"Open in Heapdump Explorer\" on a flamegraph node in a\nmulti-dump trace, the Heapdump Explorer now switches its active dump to\nmatch the flamegraph node.\n\nSmall fix for limiting field name queries to specific dump"
    },
    {
      "commit": "4085100d9e3d1e13d5a3971fd319f4e466af6b18",
      "tree": "190c53b3849e69cbc8f183b8102888ec604a75f0",
      "parents": [
        "7ea3ba65b1465a704b6583f93e2d77a160c84ab7"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Wed Apr 29 10:52:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 10:52:42 2026"
      },
      "message": "perfetto: bump CHANGELOG for v55.0 release (#5623)"
    },
    {
      "commit": "7ea3ba65b1465a704b6583f93e2d77a160c84ab7",
      "tree": "4b079fc9699974cbc20485e4d6141c7f902b6453",
      "parents": [
        "a7916566042c0b08c2ef2a2b1170f7d7649d70fa"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Wed Apr 29 10:52:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 10:52:17 2026"
      },
      "message": "docs: Update links (#5640)"
    },
    {
      "commit": "a7916566042c0b08c2ef2a2b1170f7d7649d70fa",
      "tree": "231b0736d150f5bc4814ad600951c4aba618d267",
      "parents": [
        "02ff62f583ea6b31fc121ce73c41ebc3b0eae3b1"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Wed Apr 29 10:39:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 10:39:56 2026"
      },
      "message": "ui: Fix SQL syntax error for dotted launch arg names (#5638)"
    },
    {
      "commit": "02ff62f583ea6b31fc121ce73c41ebc3b0eae3b1",
      "tree": "8dd0d8053d283beaa97d462d42885d9d90d17ff1",
      "parents": [
        "530ca4c2de23b9724c87008acf695d91a5b2bb0e"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Wed Apr 29 08:24:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 08:24:25 2026"
      },
      "message": "Sync generated proto files (#5639)\n\nThis PR automatically synchronizes generated proto files with their\n`.proto` definitions.\n\n## Generated files updated\n- `.gen.cc` and `.gen.h` files\n- `.pcz.h` files\n- Binary descriptors\n- Python proto bindings\n\nThis is an automated PR generated by the `sync-protos` workflow.\n\nCo-authored-by: perfetto-automation[bot] \u003cperfetto-automation-github-app@google.com\u003e"
    },
    {
      "commit": "530ca4c2de23b9724c87008acf695d91a5b2bb0e",
      "tree": "29e71e8342db3797a7b072796490a18e7498fd5d",
      "parents": [
        "0eda0b0475d434c68362dce0d0eb01d8b7d882c0"
      ],
      "author": {
        "name": "Shin-Yu Wang",
        "email": "shinyuw@google.com",
        "time": "Wed Apr 29 01:01:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 01:01:04 2026"
      },
      "message": "Add disp_frame_start/done_missing ftrace (#5617)\n\nBug: 504786113\nTest: can use gfx to record, show event on ui correctly"
    },
    {
      "commit": "0eda0b0475d434c68362dce0d0eb01d8b7d882c0",
      "tree": "5d38684a35bfbdd6c4130c9d8d1b2c21392be56e",
      "parents": [
        "366214d98d1be641584d0d77f699fc47fa81838c"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 22:37:44 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 22:37:44 2026"
      },
      "message": "tp: fix compile in G3 (#5635)"
    },
    {
      "commit": "366214d98d1be641584d0d77f699fc47fa81838c",
      "tree": "43f1e34db3f8aa418adb4220668ca8e4c02975fc",
      "parents": [
        "ce10864e6ea60ce92cf86b6a9103a94cedafa14a"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 21:28:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 21:28:59 2026"
      },
      "message": "tp: declare nested classes first, before any usage (#5628)"
    },
    {
      "commit": "ce10864e6ea60ce92cf86b6a9103a94cedafa14a",
      "tree": "6b696933961ded6a27d42946ff6381b9eeebf177",
      "parents": [
        "f8417de9cc45b606bf520a2e252b4b182a0cc75e"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Tue Apr 28 20:56:13 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 20:56:13 2026"
      },
      "message": "rust-sdk: generate new proto bindings and bump crate versions (#5633)"
    },
    {
      "commit": "f8417de9cc45b606bf520a2e252b4b182a0cc75e",
      "tree": "8b97f3b70761b292c366d43b31d17fbce2262a85",
      "parents": [
        "c888d5155f4e69892ca972a80cc7e49ce205f201"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Tue Apr 28 20:31:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 20:31:43 2026"
      },
      "message": "build: re-run gen_android_bp and gen_bazel (#5634)"
    },
    {
      "commit": "c888d5155f4e69892ca972a80cc7e49ce205f201",
      "tree": "cd97950f995d159f4e5f364e480817421577b2ff",
      "parents": [
        "95328907aab03a6d18b7ccc56d4c4b8421f6b650"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Tue Apr 28 18:43:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 18:43:17 2026"
      },
      "message": "gpu: Add structured compute kernel encoding and launch parameters (#5596)\n\nAdd structured protobuf encoding for GPU compute kernel identity and\nlaunch parameters, replacing the flat\nstring-based ExtraData key/value pairs with typed fields. This improves\nencoding efficiency, enables interning\nfor repeated values, and provides a standard schema for GPGPU compute\nprofiling across CUDA, HIP, OpenCL, and\nother APIs.\n\nProto changes\n\n- InternedComputeKernel — new interned message for kernel identity\n(name, demangled name, architecture),\nreferenced by kernel_iid on GpuRenderStageEvent\n- ComputeKernelLaunch — structured grid/workgroup dimensions via Dim3,\nplus extensible typed args\n- ExtraComputeArg — typed key/value arguments (int, uint, double,\nstring) with interning support for both keys\n(InternedComputeArgName) and string values\n- name_iid on GpuRenderStageEvent — interned event name via EventName,\ngrouped into oneof name_field with the\nexisting name string field\n- InternedComputeArgName — dedicated interned type for compute arg\nnames, with its own compute_arg_names field\n(49) in InternedData\n\nTrace processor changes\n\n- Parse InternedComputeKernel fields into kernel_name,\nkernel_demangled_name, arch args\n- Parse ComputeKernelLaunch grid/workgroup dimensions into structured\nargs (launch.grid_size.x,\nlaunch.workgroup_size.x, etc.)\n- Parse ExtraComputeArg from both kernel and launch into typed slice\nargs\n- Resolve name_iid via interned EventName lookup\n\nUI changes\n\n- Update GpuCompute plugin to use new structured arg names\n(launch.grid_size.x instead of launch__grid_size_x,\nworkgroup_size instead of block_size)"
    },
    {
      "commit": "95328907aab03a6d18b7ccc56d4c4b8421f6b650",
      "tree": "72f7d7187eabafa95be8bd63d1358c5df47fc1d8",
      "parents": [
        "b1fa9a6e1f969110f5e520dc5840813c5d7b67a1"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Tue Apr 28 17:21:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 17:21:48 2026"
      },
      "message": "heap_profile: docs for android/host split + glibc preload fix (#5630)\n\nDocumentation:\nUpdates docs to reflect the recent split of `tools/heap_profile` into\n`android` (default, profile via adb) and `host` (local Linux via\nLD_PRELOAD) subcommands.\n\nPreload library fix:\nRemoves the `extern void __libc_free_sized(...)` /\n`__libc_free_aligned_sized(...)` declarations from the glibc preload\ninterceptor. These symbols were added in #5418 but glibc has never\nexported `__libc_*`-prefixed versions of the C23 size-aware free\nfunctions (verified against glibc 2.43 malloc/Versions and malloc.c via\nBootlin\u0027s Elixir cross-referencer). The result was that\n`libheapprofd_glibc_preload.so` failed to load with \"undefined symbol:\n__libc_free_sized\" against every released glibc.\n\nThe fix mirrors upstream glibc\u0027s own free_sized implementation\n(elixir.bootlin.com/glibc/glibc-2.43/source/malloc/malloc.c#L3550):\nforward to `free()`, ignoring the size hint per the C23 spec."
    },
    {
      "commit": "b1fa9a6e1f969110f5e520dc5840813c5d7b67a1",
      "tree": "cb7be7c61345bda05fc7c3bcd287cf6ea33f4f9d",
      "parents": [
        "6bc7690056962644b14111f14469ae36aff2690b"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Tue Apr 28 17:09:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 17:09:11 2026"
      },
      "message": "ui: Disambiguate multi-dump traces in the Heap Dump Explorer (#5631)\n\nAdd a dump selector so traces with multiple heap dumps filter all views\nto a single (upid, ts) pair instead of silently summing across dumps."
    },
    {
      "commit": "6bc7690056962644b14111f14469ae36aff2690b",
      "tree": "0d273dcc3081938828271942e019a38389605462",
      "parents": [
        "2935670e50e1df18807466d5fa90fab699e3d858"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 15:46:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 15:46:41 2026"
      },
      "message": "tp: split TrackEventSequenceState into descriptor + delta state (#5590)\n\nRefactor the per-sequence track-event state in two pieces with distinct\nlifetimes:\n\n- `TrackEventThreadDescriptor`: persistent pid/tid established by a\nThreadDescriptor packet. Held as a direct member of\n`PacketSequenceStateGeneration` so it survives every transition,\nincluding `SEQ_INCREMENTAL_STATE_CLEARED`. Real-world traces don\u0027t\nalways re-emit ThreadDescriptor after an incremental-state clear, so the\npreviously-known pid/tid must persist.\n\n- `TrackEventSequenceState`: ephemeral delta state (running reference\ntimestamps + incremental counter values). Now a `CustomState`, so it is\nshared across `trace_packet_defaults` transitions instead of being reset\non every defaults change. This is more permissive: a producer that emits\na thread descriptor, then changes defaults without changing the\ntimestamp clock, now gets correct delta calculations rather than a\n`timestamps_valid_\u003dfalse` skip.\n\nAll forwarder methods on `PacketSequenceStateGeneration`\n(`IncrementAndGet*`, `track_event_timestamps_valid`,\n`SetThreadDescriptor`) are removed. Callers now go through\n`GetCustomState\u003c\u003e()` and `state.thread_descriptor()` directly, shrinking\nthe public surface of Generation. The `CustomState` base loses its leaky\npid/tid helpers in favour of a `thread_descriptor()` forwarder.\n\n`CustomState` gains a virtual `ClearOnPacketLoss()` hook (default\nfalse). `TrackEventSequenceState` overrides to return true so its\ndelta-encoded state is cleared on packet loss. The dependency from\ngeneric generation code to specific CustomState subclasses is replaced\nby this generic per-CustomState policy.\n\nThis is preparation for the upcoming `IncrementalState` extraction\n(#5593) that fixes the `CustomState` back-pointer UAF.\n\n---\n\n**Stack:**\n- #5588 — tp: stop mutating PacketSequenceStateGeneration on packet loss\n- **#5590 — tp: split TrackEventSequenceState into descriptor + delta\nstate** (this PR)\n- #5593 — tp: extract IncrementalState to fix CustomState UAF"
    },
    {
      "commit": "2935670e50e1df18807466d5fa90fab699e3d858",
      "tree": "10dc2a67f8d9d298484767307dbd820f2eb2b8df",
      "parents": [
        "b196cf744daf5dc8404a7df8b7cedb1708ab2609"
      ],
      "author": {
        "name": "copybara-service[bot]",
        "email": "56741989+copybara-service[bot]@users.noreply.github.com",
        "time": "Tue Apr 28 15:10:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 15:10:57 2026"
      },
      "message": "Copybara import from Chromium: proto and stdlib changes (#5629)\n\nCopybara import from Chromium: proto and stdlib changes\n\n- 6c88160823e6028c9e8bc6522e3433f162b67638 Emit\nevent_latency.scroll_begin_arrival_us in traces by Petr Čermák\n\u003cpetrcermak@chromium.org\u003e\n\nCOPYBARA_IMPORT\u003dProject import generated by Copybara.\n\nGitOrigin-RevId: 6c88160823e6028c9e8bc6522e3433f162b67638\n\nCo-authored-by: Perfetto Team \u003ccopybara-servicebot@google.com\u003e"
    },
    {
      "commit": "b196cf744daf5dc8404a7df8b7cedb1708ab2609",
      "tree": "2023351157e70470a0076e76e8d6a98dabc94c87",
      "parents": [
        "56beaaa73e7444b7029b0141bad31223bdd29a9d"
      ],
      "author": {
        "name": "Petr Čermák",
        "email": "petrcermak@users.noreply.github.com",
        "time": "Tue Apr 28 14:37:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 14:37:08 2026"
      },
      "message": "Avoid dangling pointers from SizeProfileComputer::Field to ProtoDescr… (#5627)\n\nThis change fixes a bug where\n`SizeProfileComputer::Field::proto_descriptor` might end up holding a\ndangling pointer to a `ProtoDescriptor` or a `FieldDescriptor`.\n\nBug: https://crbug.com/507066166"
    },
    {
      "commit": "56beaaa73e7444b7029b0141bad31223bdd29a9d",
      "tree": "1437f8e470db5eba6628d2b3b03d8cece5ebbffb",
      "parents": [
        "5ff30c245a9511a324235dbd697be399434f067e"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 13:20:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 13:20:21 2026"
      },
      "message": "tp: fix compile in C++20 (#5626)"
    },
    {
      "commit": "5ff30c245a9511a324235dbd697be399434f067e",
      "tree": "9fd96e7da916f769d42a4975dd8a898a92a58256",
      "parents": [
        "05e154afa316953e6962f0a44cf7ffea8e0f3be6"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 13:06:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 13:06:34 2026"
      },
      "message": "tp: amalgamated SQL via cpp_blob_header primitive (#5613)\n\nMigrate `perfetto_amalgamated_sql_header` to the generic\n`perfetto_cpp_blob_header` build primitive. The amalgamated SQL header\nis now a single `constexpr std::array\u003cuint8_t, N\u003e` blob in the SqlBundle\nwire format (u32 count + per-entry varint-prefixed path/sql), parsed at\nruntime by `src/trace_processor/util/sql_bundle.h`.\n\nThis removes the SQL-specific translator handlers + Bazel rule, with\nonly a small chrome-glob exception in the Soong sql_source_set handler\n(mirroring the precedent of `target_overrides` in tools/gen_bazel; the\nchrome stdlib BUILD.gn is autorolled from Chromium so the glob can\u0027t\nlive there).\n\nBuild wiring changes:\n- gen_amalgamated_sql.py: rewritten to pack the bundle and hand off to\n  `cpp_blob_emitter.emit_array`. CLI now matches the cpp_blob_header\n  convention (`--output`, `--gen-dir`, positional inputs).\n- perfetto_cpp_blob_header.gni: new `extra_inputs` invoker arg for\n  scripts that import other Python modules (threaded into Soong\n  `tool_files`; excluded from Bazel genrule srcs since Bazel wires\n  Python imports via py_binary deps).\n- gen_sql_source_set (Bazel): filegroups now include dep filegroups so\n  Bazel resolves the SQL set transitively.\n- gen_android_bp: new `create_sql_source_set_module` emits a Soong\n  filegroup per sql_source_set (chrome glob hardcoded as a known\n  exception).\n- Deleted: `gen_cc_amalgamated_sql` (gen_bazel),\n  `create_amalgamated_sql_module` (gen_android_bp),\n  `perfetto_cc_amalgamated_sql` (bazel/rules.bzl)."
    },
    {
      "commit": "05e154afa316953e6962f0a44cf7ffea8e0f3be6",
      "tree": "4035282c2b90833e32f996cb90eede7a3d5d35e1",
      "parents": [
        "9583bda954b5a51a9c8b1372e77a93870a52291e"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Tue Apr 28 12:23:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:23:53 2026"
      },
      "message": "ui: Add shortest-path option to heap dump explorer bitmap tab (#5620)\n\nReplaced the \u0027Show Paths\u0027 button (dominator-only) in the bitmap tab with\na Path dropdown (None / Shortest / Dominator) so shortest-path overlays\nare also available.\n\nAlso collapsed the single-id path fetchers into thin wrappers around the\nbatch versions."
    },
    {
      "commit": "9583bda954b5a51a9c8b1372e77a93870a52291e",
      "tree": "1e0fb022b1850c47098e9400544ed49a419f5264",
      "parents": [
        "bcf0763afe8aec5128e9e851d3dca27b056ad237"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Apr 28 12:08:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:08:03 2026"
      },
      "message": "bigtrace-ui: Fix usage of commands (#5624)\n\nCommandManager public API changed in another PR. This patch updates the\nbigtrace-ui to use the new API."
    },
    {
      "commit": "bcf0763afe8aec5128e9e851d3dca27b056ad237",
      "tree": "4cd2bdf3fd51634192462c73e7d1bdacefd689a6",
      "parents": [
        "3fe26859bfa08ad4f1df9c87c6a2d17f3ddde0f9"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 12:02:19 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:02:19 2026"
      },
      "message": "tp: prep PerfettoSqlParser for a second backend (#5614)\n\n**Stack:**\n\n1. **#5614 — `tp: prep PerfettoSqlParser for a second backend`** ← you\nare here\n2. #5615 — `tp: add syntaqlite-driven macro expansion behind a flag`\n3. #5525 — `tp: replace sqlfluff formatter with syntaqlite` (parallel;\nbased on #5615)\n4. #5616 — `tp: route PerfettoSqlParser through syntaqlite macro\nexpansion`\n5. #5472 — `tp: delete the legacy PerfettoSqlPreprocessor`\n\n---\n\nPure refactor in preparation for adding a syntaqlite-driven macro\nexpansion path next to the existing handwritten preprocessor.\n\n * Extract the body of `PerfettoSqlParser::Impl` into a self-contained\n   `LegacyImpl` struct in the anonymous namespace of parser.cc; the\n   wrapper now holds it as `std::optional\u003cLegacyImpl\u003e` so a second\n   implementation can be added next to it without disturbing the\n   wrapper or the public `PerfettoSqlParser` surface.\n * Add `using Macro \u003d PerfettoSqlPreprocessor::Macro;` on\n   `PerfettoSqlParser` and switch `PerfettoSqlEngine` to spell the\n   alias, so the engine no longer reaches into the preprocessor\n   namespace. Drop the (now unused) preprocessor.h include + GN dep\n   from the engine.\n\nNo behaviour change."
    },
    {
      "commit": "3fe26859bfa08ad4f1df9c87c6a2d17f3ddde0f9",
      "tree": "bee38d9f5f2943afd350df26c3e96114c57a4bf3",
      "parents": [
        "318e63a11ff092f2c579d3180ec39780919c55c0"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Apr 28 12:00:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:00:33 2026"
      },
      "message": "ui: Update material icons (#5622)\n\nBump the material icons asset to the latest version."
    },
    {
      "commit": "318e63a11ff092f2c579d3180ec39780919c55c0",
      "tree": "ca0300ad4ee8f6ed657cc9dd34befa9d807608ab",
      "parents": [
        "5021672fae05b5690189372730ff605bc6fa52dd"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 11:41:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:41:51 2026"
      },
      "message": "ui: dedupe regex track matches under headless containers (#5621)\n\nCopyTracksToWorkspaceByRegex (and the sibling regex-based commands)\nduplicated tracks when multiple sibling tracks lived under a headless\ncontainer that itself shared the same fullPath. A headless node has no\nheader in the rendered tree, so its fullPath is identical to its\nchildren\u0027s; the previous flatTracks.filter(...) returned the headless\nnode and each of its children, and deep-cloning each match copied the\ndescendants once via the parent\u0027s deep clone and again via their own\nmatch — yielding the duplicates reported in #5618.\n\nReplace the flat filter with a single-pass DFS that records a match\nand, when that match is headless, prunes its subtree. Same behaviour\nfor non-headless nodes; headless nodes are now treated as a single\nmatch whose deep clone subsumes their descendants.\n\nFixes: https://github.com/google/perfetto/issues/5618"
    },
    {
      "commit": "5021672fae05b5690189372730ff605bc6fa52dd",
      "tree": "c30ad84799b93ffb857c877dc14274f4e5a33520",
      "parents": [
        "bc85fca2dc58812180967e99cf345a7901eb150c"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Apr 28 11:40:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:40:20 2026"
      },
      "message": "ui: Animate Accordion widget expand/collapse (#5572)\n\nAnimate Accordion widget section collapse / expand.\n\n\nhttps://github.com/user-attachments/assets/29cda5ac-59a5-4829-a7c4-01ba176a9a2e"
    },
    {
      "commit": "bc85fca2dc58812180967e99cf345a7901eb150c",
      "tree": "9cb36d3df473e385fed41db8537429da16a4efd4",
      "parents": [
        "c18ed932b0e899ab51e3ead3498196d46f76d2c9"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Apr 28 11:40:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:40:06 2026"
      },
      "message": "ui: Improve TableList performance (#5619)\n\n- Improve Accordion performance by making use of the Gate component to\navoid re-rendering collapsed accordion sections.\n- Move TableList accordion section content inside a component to take\nadvantage of this optimization."
    },
    {
      "commit": "c18ed932b0e899ab51e3ead3498196d46f76d2c9",
      "tree": "db307d87204b8bb7fd6320efac526d3f951965b5",
      "parents": [
        "9aa665aa9987716975d6be345cfab6a00bc871d3"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Apr 28 11:30:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:30:16 2026"
      },
      "message": "ui: Click Grid column title to sort (#5608)\n\nCurrently users must click the little arrow to toggle sorting on a given\ncolumn in the Grid/DataGrid widgets, but the customary UX is to allow\nclicking anywhere in the header to toggle sorting instead.\n\nThis patch fixes this, allowing the user to click the title to toggle\nsorting."
    },
    {
      "commit": "9aa665aa9987716975d6be345cfab6a00bc871d3",
      "tree": "28cddf034017d7286867265bd00f6c9f2f688ddd",
      "parents": [
        "98f1a7253763fd977c10a591f5295800e98c8675"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 11:18:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:18:52 2026"
      },
      "message": "perfetto: add perfetto_cpp_blob_header codegen primitive (#5610)\n\nAdds a generic build-time primitive for codegens that emit a C++ header\ncontaining a `constexpr std::array\u003cuint8_t, N\u003e` blob:\n\n- `python/tools/cpp_blob_emitter.py` — importable utility + CLI;\n`emit_array()` and zlib-compressed variant.\n- `gn/perfetto_cpp_blob_header.gni` — generic GN template tagged for the\nbuild-system translators.\n- `bazel/rules.bzl` + `tools/gen_bazel` + `tools/gen_android_bp` —\ndispatch for the new action type; `extra_args` are threaded through.\n\n`perfetto_cc_proto_descriptor` is collapsed into a thin wrapper around\nthe new primitive, and `gen_cc_proto_descriptor.py` is removed (its\nfilename-based symbol/include-guard derivation moved into\n`cpp_blob_emitter.py` as `--symbol-suffix` + `--gen-dir`). All\ndescriptor headers are byte-identical.\n\n## Stack\n- **#5610 — this PR**\n- #5611 — `tp: add wattson plugin for compressed curve data`"
    },
    {
      "commit": "98f1a7253763fd977c10a591f5295800e98c8675",
      "tree": "c59336953521a9f83a49fcea6586ec0d9583adbd",
      "parents": [
        "2984b76b2414ed39a7ac7444489beb3823e9ccc8"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 11:12:23 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:12:23 2026"
      },
      "message": "tp: stop mutating PacketSequenceStateGeneration on packet loss (#5588)\n\n`PacketSequenceStateGeneration::OnPacketLoss()` previously mutated\n`this` (flipping `is_incremental_state_valid_` and the track-event delta\nstate\u0027s `timestamps_valid_`) and returned `RefPtr(this)`. The\nTraceSorter holds RefPtrs to the same generation for buffered packets\nthat were tokenized while the sequence was valid, so the in-place flip\nwas retroactively visible from those RefPtrs. No current reader observes\nthe mutation through a buffered RefPtr, but that is incidental —\nanything added in the future that consults the generation\u0027s validity\nfrom the parser side would see a stale, retroactively-invalidated view.\n\nMake `OnPacketLoss()` return a new generation instead, sharing the\nper-interval state (interned data, custom states, persistent thread\ndescriptor) with the previous one but with the validity bits cleared and\ndelta-encoded track-event state reset. Buffered packets retain the view\nthey had at tokenization time; the Builder swaps its current generation\nto the new instance so subsequent tokenizations see the cleared state.\n\nTo support this, replace `TrackEventSequenceState::OnPacketLoss()`\n(which mutated `timestamps_valid_` in place) with a value-returning form\nthat produces a fresh successor with persistent state preserved and\ndelta state reset. Incremental counter values and running reference\ntimestamps cannot be carried across the lost run of packets, so they are\ndropped along with `timestamps_valid_`.\n\nThe full PSSG constructor\u0027s `trace_packet_defaults` parameter changes\nfrom `TraceBlobView` to `std::optional\u003cInternedMessageView\u003e` so\nOnPacketLoss can pass the existing defaults through without having to\nreach inside the optional and reconstruct the view.\n\n---\n\n**Stack:**\n- **#5588 — tp: stop mutating PacketSequenceStateGeneration on packet\nloss** (this PR)\n- #5590 — tp: split TrackEventSequenceState into descriptor + delta\nstate\n- #5593 — tp: extract IncrementalState to fix CustomState UAF"
    },
    {
      "commit": "2984b76b2414ed39a7ac7444489beb3823e9ccc8",
      "tree": "67cf3bbc1cf32cdf5ad49284b969d9a66f7ac512",
      "parents": [
        "ab541cfbf6403acd68bd6da117a24e236641ab2c"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Tue Apr 28 11:10:58 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:10:58 2026"
      },
      "message": "Bigtrace UI V0  (#5243)\n\nThis change introduces \"BigTrace UI\", a \nstandalone bigtrace query interface within perfetto UI source code. \nBigTrace provides a focused environment for executing and managing\ncomplex SQL queries\nagainst traces.\n\nKey features and components:\n- Application Shell: A new entry point and lightweight application\nsingleton (BigTraceApp) managing its own command and omnibox instances.\n- Multi-tab SQL Editor: A robust query interface supporting multiple\n  persistent tabs, syntax-highlighted editors, and result limiting.\n- Result Visualization: Integration with DataGrid for high-performance\n  rendering of SQL query results, including support for linkified\n  columns and uuid-based row tracking.\n- Navigation \u0026 Layout: Custom routing (router.ts, routes.ts) and layout\n  components (Sidebar, Topbar, Omnibox) tailored for the BigTrace\n  experience.\n- Persistence: Local storage integration for saving editor tabs, query\n  history, and user preferences across sessions.\n- Settings Management: A dedicated SettingsPage and storage service\n  for configuring Brush-specific parameters, such as backend endpoints\n  and default result limits.\n- Home \u0026 Help: A landing page with \"getting started\" guidance and a\n  help modal detailing available keyboard shortcuts.\n- Styling: Dedicated SCSS for BigTrace to ensure a consistent and\n  modern aesthetic.\n\nNote: we may have duplicated classes/interfaces between Bigtrace UI and\nPerfetto UI, because we wanted to **isolate** the changes and avoid\nexposing classes/interfaces from Perfetto UI. In a follow-up, we will\nexpose the classes/interfaces suitable for reuse."
    },
    {
      "commit": "ab541cfbf6403acd68bd6da117a24e236641ab2c",
      "tree": "861021a246b9702c3fba49c93034a0e071c4efce",
      "parents": [
        "e695d1ffea793c74c07a1272ecb5d8aa9b31ce88"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 11:08:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:08:21 2026"
      },
      "message": "tp: drive DebugAnnotation parsing on the proto-args work stack (#5587)\n\n## Summary\n- Adds `ProtoToArgsParser::ParseDebugAnnotation` and\n`EnableDebugAnnotationParsing()`, building on the work-stack driver from\n#5589.\n- Pushes DebugAnnotation / NestedValue work items onto the same\n`work_stack_` as proto-message items (extends the variant);\nDebugAnnotation -\u003e proto_value -\u003e DebugAnnotation cycles are processed\niteratively, so depth in the input does not grow the C++ stack.\n- `track_event_parser` opts in via `EnableDebugAnnotationParsing()`; the\n`.perfetto.protos.DebugAnnotation` type override is removed.\n- `DebugAnnotationParser` class is deleted; callers use\n`ProtoToArgsParser::ParseDebugAnnotation` directly.\n- Adds a regression test that parses a 1000-deep `DebugAnnotation -\u003e\nproto_value(DebugAnnotation)` cycle.\n\n## Stack\n- #5589 — prep refactor\n- **#5587 — security fix (this PR)**\n\n## Test plan\n- [ ] `perfetto_unittests\n--gtest_filter\u003d\"ProtoToArgsParserTest.*:DebugAnnotationParserTest.*\"`\npasses (23 tests including new regression).\n- [ ] `tools/diff_test_trace_processor.py\n--name-filter\u003d\"TrackEvent.*|DebugAnnotation.*\"` passes."
    },
    {
      "commit": "e695d1ffea793c74c07a1272ecb5d8aa9b31ce88",
      "tree": "9ea6c5b7e89c272f15c45ac8b7a406946795d92a",
      "parents": [
        "24fba12bbd18b22d17ee0efc195fbfd9e980e30c"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Apr 28 08:02:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 08:02:59 2026"
      },
      "message": "ui: surface blocked/failed startup commands in a dialog (#5612)\n\nStartup commands that aren\u0027t on the allowlist were previously dropped\nsilently with only a console.warn. Make CommandManagerImpl.runCommand\nthrow a typed StartupCommandNotAllowedError when blocked, and have the\nload_trace startup loop catch both that error and any other exceptions\nto accumulate per-command results. After the loop, if anything was\nblocked or failed, show a single modal dialog listing the offending\ncommand IDs (and the error text for failures). This replaces the\nTODO about needing a notification UX for startup-command errors."
    },
    {
      "commit": "24fba12bbd18b22d17ee0efc195fbfd9e980e30c",
      "tree": "6e9f9e94415b38ecc11040b056ca76b9b6bd76b5",
      "parents": [
        "797d5e4aab03ea7e030d86f844bf60d762e962ce"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Mon Apr 27 19:06:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 19:06:30 2026"
      },
      "message": "ui: Add shortest path from GC root to heap dump explorer (#5609)\n\nThe existing \"Sample Path from GC Root\" section was walking the\ndominator tree, not actual references. Renamed it to \"Dominator Tree\nPath\" to reflect what it actually shows.\n\nAdded a new \"Shortest Path from GC Root\" section that walks the BFS\nmin-depth reference tree (_heap_graph_object_min_depth_tree) from the\nstdlib, showing the fewest reference hops from a GC root to the selected\nobject.\n\nBoth paths are shown in the object tab: shortest path first (most useful\nfor understanding reachability), dominator tree path second (most useful\nfor understanding retained memory)."
    },
    {
      "commit": "797d5e4aab03ea7e030d86f844bf60d762e962ce",
      "tree": "c886e3b17c571715eb241534135ce1d1cb5e891d",
      "parents": [
        "bc0093d877b46e6f2edcd229da92885627cfef0c"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Apr 27 16:50:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 16:50:40 2026"
      },
      "message": "ui: Tidy up the public CommandManager interface (#5607)\n\n- Add comments.\n- Add `getCommand(id)`.\n- Add `getCommands()` (renamed from just `get commands`).\n- Fix all `getCommands()` callsites.\n\nRefactor only - no functional changes."
    },
    {
      "commit": "bc0093d877b46e6f2edcd229da92885627cfef0c",
      "tree": "8d6d10c561eb1ad29ca63b1b306977d63868ca52",
      "parents": [
        "053e77404c5ea00cd205c58a7801e069617b84a6"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Apr 27 16:22:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 16:22:00 2026"
      },
      "message": "ui: Move command fuzzy out of CommandManager (#5605)\n\nThe function `fuzzyFindCommands()` currently lives on the command\nmanager and pulled fuzzy find interfaces into everything that depends on\ncommands. The command manger should arguably have nothing to do with how\ncommands are projected, and only know how to provide a simple registry\nof commands.\n\nThis patch inlines the command fuzzy finding logic into the omnibox\ncomponent.\n\nThis is a pure refactor - no functional changes."
    },
    {
      "commit": "053e77404c5ea00cd205c58a7801e069617b84a6",
      "tree": "ac1c7c597fd9f2bc68e2938c02327e226a0ea96a",
      "parents": [
        "69eabc36aa8641e9785670ad3eebc712edbd0098"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Mon Apr 27 15:54:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 15:54:20 2026"
      },
      "message": "docs: Heap Dump Explorer user guide (#5603)\n\nAdd docs/visualization/heap-dump-explorer.md covering heap dump vs\nprofile, both capture formats, each tab, and case studies for a\nleaked Activity and duplicate bitmaps."
    },
    {
      "commit": "69eabc36aa8641e9785670ad3eebc712edbd0098",
      "tree": "2dd2b2a02ecee7c55ae6cffce53fc05e679449da",
      "parents": [
        "4dd5207dc0a2ad95b203459bd1660738f875e046"
      ],
      "author": {
        "name": "Mayzner",
        "email": "mayzner@google.com",
        "time": "Mon Apr 27 15:48:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 15:48:17 2026"
      },
      "message": "de: Centralize legacy type migration in the deserialization layer (#5604)\n\nMoves all serialized-format migration logic (string types, legacy field\nnames) out of individual node classes and into a single\n`migrateNodeState()` function in `json_handler.ts`. This runs before\nnode construction, so nodes no longer need to know about or handle\nlegacy formats"
    },
    {
      "commit": "4dd5207dc0a2ad95b203459bd1660738f875e046",
      "tree": "638e06322bc0cedabd3b65e1a770c71abdd0f4d8",
      "parents": [
        "0969ea4d5d2f3e9e97af5de097c182162dce5d9c"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Mon Apr 27 15:08:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 15:08:50 2026"
      },
      "message": "ui: GpuCompute plugin: performance improvements and bug fixes (#5595)"
    },
    {
      "commit": "0969ea4d5d2f3e9e97af5de097c182162dce5d9c",
      "tree": "fd3d6b8f46c031c634b687779e95b8b3a16878c3",
      "parents": [
        "2a03deee26713751fe295581a078bf83450a0645"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Mon Apr 27 12:46:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 12:46:57 2026"
      },
      "message": "tp: Support shared resources in Gecko trace importer (#5050)\n\nRefactor the Gecko tokenizer to handle profiles where\nframes and stacks are in a top-level \"shared\" object\nrather than duplicated per-thread. Extract InternFrame\nas a reusable method and split thread processing into\nseparate frames/stacks and samples phases so shared\ncallsites can be built once and reused across threads."
    },
    {
      "commit": "2a03deee26713751fe295581a078bf83450a0645",
      "tree": "b10c1718009b12af77b6078fc2660e8609087839",
      "parents": [
        "09e78d7af3428dd9302d4821111ab50802d5c1d3"
      ],
      "author": {
        "name": "Victor Vianna",
        "email": "victor.vianna10@gmail.com",
        "time": "Mon Apr 27 11:26:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 11:26:16 2026"
      },
      "message": "Fix perfetto build with C++23 (for Chromium) (#5601)\n\n6fca04fc6689d55094dc11135d322f3ea018db61 broke the Chromium build\nbecause WorkItem needs to be a complete type by the time\nProtoToArgsParser\u0027s constructor and destructor are instantiated."
    },
    {
      "commit": "09e78d7af3428dd9302d4821111ab50802d5c1d3",
      "tree": "a8f28995622e2ae6f7e512864d7c411365aee755",
      "parents": [
        "3de2f297d28c4004bd38c25c811a45470fd53b7c"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Apr 27 11:24:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 11:24:28 2026"
      },
      "message": "ui: Rename OWNERS file to OWNERS.github (#5602)"
    },
    {
      "commit": "3de2f297d28c4004bd38c25c811a45470fd53b7c",
      "tree": "dcfcc75f6da21fd5c25d2e84d883493dfca8d8ee",
      "parents": [
        "6fca04fc6689d55094dc11135d322f3ea018db61"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Mon Apr 27 11:18:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 11:18:35 2026"
      },
      "message": "tracing: fix MSVC LNK2019 in DataSourceHelper::type() (#5591) (#5599)\n\nMove the primary-template definition of `DataSourceHelper::type()` out\nof\nthe class body so it is not implicitly inline.\n\n`DataSourceHelper::type()` was added in 06486b8b6010 (\"Fix component\nbuild\nfor client library on Windows\", 2023-05-05) as a workaround for an MSVC\nC2086 redefinition bug affecting an earlier static-data-member design.\nThat commit defined `type()` inline inside the class body\n([dcl.fct.spec]/4 then makes it implicitly inline). MSVC propagates that\ninline attribute to every explicit specialization of `type()` defined\nout-of-line by `PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS` in a `.cc`,\nemits a C4506 (\"no definition for inline function\"), and silently drops\nthe specialization body. Any TU that does not see the body but calls\n`Helper::type()` -- transitively via `DataSource\u003c...\u003e::Register\u003c\u003e()`,\n`Trace()`, etc. -- is then left with an unresolved external symbol.\n\nThe bug stayed dormant until a5f062d78a60 (\"[API] Single data source for\nall track events\", 2025-06-24, in v52.0+) made `TrackEventDataSource`\na concrete class with a `PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS`\nvisible in the public header, so user TUs that invoke\n`PERFETTO_TRACK_EVENT_STATIC_STORAGE()` started instantiating\n`Register\u003c\u003e` and producing LNK2019:\n\n```\n  example.cc.obj : error LNK2019: unresolved external symbol\n  \"public: static class perfetto::internal::DataSourceType \u0026 __cdecl\n   perfetto::DataSourceHelper\u003cclass perfetto::internal::TrackEventDataSource,\n                              struct perfetto::internal::TrackEventDataSourceTraits\u003e::type(void)\"\n  referenced in function \"perfetto::DataSource\u003c...\u003e::Register\u003c\u003e(...)\".\n```\n\nGCC and Clang are unaffected: they treat the out-of-line explicit\nspecialization as a regular non-inline function and emit it normally.\n\nFix: declare `type()` in the class body and define it out-of-line. The\nprimary template\u0027s member is then a non-inline function template, and\nexplicit specializations are unambiguously non-inline regular functions\non every compiler. No call sites change; the only file touched is\n`include/perfetto/tracing/data_source.h`.\n\nVerified on Windows / MSVC v143 (14.50.35717) for x64 Debug and Release\nbuilds of `examples/sdk` and the v54.0 amalgamated SDK. GCC/Clang\nunaffected because the change is a no-op semantic refactor for them.\n\nBug: #5591"
    }
  ],
  "next": "6fca04fc6689d55094dc11135d322f3ea018db61"
}
