)]}'
{
  "log": [
    {
      "commit": "b3fbe3a627ea048ff4c233a4b2252ae5d2878d96",
      "tree": "7d37c13ee3bbdb8756164ce27516f417d2dc101a",
      "parents": [
        "f9aaf6ace81b4a73411b2d6055e4ba2f63e6ca21"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Sat Jul 18 10:59:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 10:59:03 2026"
      },
      "message": "ui: Remove unused packages (#6773)\n\nRemove `puppeteer` and `events` as they are no longer used."
    },
    {
      "commit": "f9aaf6ace81b4a73411b2d6055e4ba2f63e6ca21",
      "tree": "d128a127a360d2f320d36d0c5a7a3554b06b2647",
      "parents": [
        "672a79075b994dfe288125ff91e2693ae1937eaa"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Sat Jul 18 10:49:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 10:49:34 2026"
      },
      "message": "ui: Bump typescript to v7 (#6772)\n\nTypeScript 7 is rewritten from JavaScript to Go, it runs a lot faster -\n6s -\u003e 1s for the frontend code (M5 Macbook) - note, with the\nvite/rolldown updates as welll, a warm build now takes 9 seconds on an\nM5 Macbook - assets + protobufjs, + tsc + bundle.\n\nChanges: \n- Added typescript/native:7.0.2, but keep the typescript 6.0.2 library\nas eslint still depends on it.\n- Update tsconfig.json.\n- Scheduler API (window.scheduler) is now in Typescript\u0027s lib.dom.d.ts,\nso remove the ambient type declaration.\n- Fix some SAB/AB issues, as some types have changed in the lib.dom.d.ts\nagain."
    },
    {
      "commit": "672a79075b994dfe288125ff91e2693ae1937eaa",
      "tree": "ef031a5b411e5fd5a2b5141bb4c81f144fca05b0",
      "parents": [
        "79c009db535b7fba80cd4dfea8c81955fa1b6092"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Sat Jul 18 10:20:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 10:20:34 2026"
      },
      "message": "tools: add trace_video_conv.py to extract display-video to mp4 (#6777)\n\nReads the android.display.video frames from a trace via the\ntrace_processor python API and muxes them into an .mp4 with ffmpeg: list\nthe video streams, convert the whole video, clip to a time range or a\nSQL-selected region, change playback speed, and lay two traces\u0027 videos\nside by side (captioned) to compare them. Documents it in the Screen\nRecording data-source page."
    },
    {
      "commit": "79c009db535b7fba80cd4dfea8c81955fa1b6092",
      "tree": "2ba7e5c67499747bd427e37c47e8187837b7095e",
      "parents": [
        "3acd516c55fb5da836f718ea743f9b06b4578004"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Jul 17 20:28:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 20:28:45 2026"
      },
      "message": "ui: Update to vite 8.1.5 (#6763)\n\nVite v8 switches to rolldown which improves frontend bundling speed from\n7s -\u003e 2s (M5 Mac)"
    },
    {
      "commit": "3acd516c55fb5da836f718ea743f9b06b4578004",
      "tree": "7c3b9b6750c6d137035da4a16435a3387ff6ba08",
      "parents": [
        "a5a3ec8e9e7bcc48115e2ee5ae013875a78ce216"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Jul 17 19:36:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 19:36:53 2026"
      },
      "message": "ui: Bump pnpm to version 10.34.5 (#6764)\n\n- Add a roll_pnpm.py script to grab a pnpm package and upload it,\nsimilar to roll_node and roll_emscripten.\n- Update pnpm to 10.34.5.\n- Recreate both pnpm-lock files due to version upgrade.\n- Sass was updated too which deprecated `@import` - migrate to `@use`\ninstead."
    },
    {
      "commit": "a5a3ec8e9e7bcc48115e2ee5ae013875a78ce216",
      "tree": "0b7f58275443527b2381c170e029162f5b8422ad",
      "parents": [
        "cfa174fad7e8ba7c40d210f0dfa904e83b1bc702"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Fri Jul 17 18:45:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 18:45:35 2026"
      },
      "message": "tp: fix export subcommand writing to in-memory database (#6768)\n\nThe trace processor connection is opened on the in-memory \"memdb\" VFS.\nATTACH DATABASE inherits the connection\u0027s VFS, so the export attached\nits output database in memory as well: every table was materialized in\nRAM and the on-disk file was left empty, while the command still\nreported success. This regressed in #5766, which moved the connection\nonto the memdb VFS; before that the connection used \":memory:\", so the\nplain-path ATTACH resolved to the on-disk VFS and worked.\n\nAttach the export database through a file: URI that selects the\nOS-backed VFS so the tables are streamed to disk instead. This fixes the\nempty output and roughly halves peak RSS, since the tables are no longer\nduplicated in memory. Also disable the rollback journal and fsync on the\nexport database (it is regenerated from the trace on failure) and fix\nthe detach statement never being stepped.\n\nAdd a unit test that exports and verifies the result reads back through\na standalone SQLite connection and reloads into a trace processor."
    },
    {
      "commit": "cfa174fad7e8ba7c40d210f0dfa904e83b1bc702",
      "tree": "38c4a44bf1598d623bf591830e8c19a876f1f2fa",
      "parents": [
        "7c52a2da8b8507d65e8b8c70e7e8fec89b69c480"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Jul 17 18:28:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 18:28:20 2026"
      },
      "message": "ui: Speed up integration tests (#6769)\n\nSwitch to using normal `ui/build --serve` instead of the vite dev server\nwhen running integration tests. The dev server is not required as the\nsources don\u0027t change, and it just adds overhead."
    },
    {
      "commit": "7c52a2da8b8507d65e8b8c70e7e8fec89b69c480",
      "tree": "68f7358691f38f61c82114e9fd97738463bf16b0",
      "parents": [
        "29c572c0ac06cb971558bf8057dc7b7639e172f5"
      ],
      "author": {
        "name": "Edgar Arriaga",
        "email": "edgararriaga@google.com",
        "time": "Fri Jul 17 17:54:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 17:54:28 2026"
      },
      "message": "Report redactor error if no process timeline present (#6732)\n\nProcess timeline data is required for trace redaction, currently\nfinishes redaction and outputs an empty trace when a timeline cannot be\nestablished, this implies that the calling system assumes no error\noccurred and provides this empty trace which is useless, instead, lets\nemit an error when the process life cycle cannot be established as its a\nbasic requirement for redactor which will also allow calling systems to\nreact as needed."
    },
    {
      "commit": "29c572c0ac06cb971558bf8057dc7b7639e172f5",
      "tree": "837af65b5a03f477b4f0d77a5e1e37e30ca2b831",
      "parents": [
        "277268ad52c759c911f6db9853d1ac9ad1c6a77b"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Fri Jul 17 12:52:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 12:52:14 2026"
      },
      "message": "ui: Add PixelInputLifecycle extension (#6670)\n\nRegisters the Pixel input lifecycle extension to support pixel-specific\ntouch stages in the Android Input Lifecycle plugin.\n\nBug: 454761692"
    },
    {
      "commit": "277268ad52c759c911f6db9853d1ac9ad1c6a77b",
      "tree": "c7576a52d1eeff88421981ada525a4614a71a1e3",
      "parents": [
        "85d950f3cf9965d8d9c92ce6b622474999b6f133"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Fri Jul 17 12:32:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 12:32:42 2026"
      },
      "message": "tp: Add pixel.touch stdlib module for touch events (#6664)\n\nIntroduces the pixel.touch module to parse Pixel driver-level touch\nevents (IRQ top-half/bottom-half and Twoshay processing timestamps) from\nthe trace.\n\nBug: 454761692"
    },
    {
      "commit": "85d950f3cf9965d8d9c92ce6b622474999b6f133",
      "tree": "f73ab86c250d445a9806740647a31899f48e8c5c",
      "parents": [
        "3e14df8c1e4d8bbfa9fc25244a8f8f4a57312cd3"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Fri Jul 17 09:55:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 09:55:38 2026"
      },
      "message": "ui: Add extensions framework to Android Input Lifecycle plugin (#6577)\n\nIntroduce the concept of extensions to allow registering custom input\nlifecycle stages. This allows the plugin to dynamically fetch stages and\njoin them to the lifecycle from registered extensions and integrate them\nchronologically into the UI.\n\nBug: 454761692"
    },
    {
      "commit": "3e14df8c1e4d8bbfa9fc25244a8f8f4a57312cd3",
      "tree": "2f5ef28f3e6eb371fdbb7f59b7230c485a65cf61",
      "parents": [
        "7589d97192a909870f79c4a3a05c9c81175ab5bc"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Jul 17 08:03:05 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 08:03:05 2026"
      },
      "message": "ui: guard SharedArrayBuffer check in assertIsArrayBufferView (#6760)\n\nSharedArrayBuffer is only defined in cross-origin isolated contexts, so\nthe bare instanceof check threw a ReferenceError elsewhere. Check the\nglobal exists first - if it doesn\u0027t, the buffer can\u0027t be one anyway.\n\nFixes: b/535630867"
    },
    {
      "commit": "7589d97192a909870f79c4a3a05c9c81175ab5bc",
      "tree": "774dd6e521ab25d06122434138b631eae1833fad",
      "parents": [
        "fcb8135a1819b2b6064397a1fe3e7a13d2a07c5b"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Fri Jul 17 07:40:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 07:40:03 2026"
      },
      "message": "Sync generated proto files (#6762)\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": "fcb8135a1819b2b6064397a1fe3e7a13d2a07c5b",
      "tree": "b7cce9dd6768e9a7c7d0c318cdc0f13fc63515f3",
      "parents": [
        "0621e92721ff5cc329df07ca5bd1b763651d506f"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Thu Jul 16 18:46:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 18:46:49 2026"
      },
      "message": "tp: add (pid)/(tid) field options and annotate frameworks_base (#6756)\n\nAdds two custom field options (in field_options.proto) for integer\nfields that hold OS ids:\n\n- (perfetto.protos.pid): the field is a process id. Alongside the raw\nvalue, trace_processor emits two extra args keyed by replacing the\ntrailing \"pid\": \"\u003cname\u003eupid\" (the trace-unique upid) and\n\"\u003cname\u003eprocess_name\". e.g. caller_pid -\u003e caller_upid +\ncaller_process_name.\n- (perfetto.protos.tid): the same for thread ids, emitting \"\u003cname\u003eutid\"\nand \"\u003cname\u003ethread_name\".\n\nThe upid/utid come from GetProcessOrNull/GetThreadOrNull, which are\nplain lookups: if the pid/tid was never seen, no extra arg is emitted\nand no process/thread is created.\n\nAlso annotates the pid, caller_pid, sender_pid and receiver_pid fields\nin frameworks_base_track_event.proto."
    },
    {
      "commit": "0621e92721ff5cc329df07ca5bd1b763651d506f",
      "tree": "e46daa78399cd08f52d0de553f5d20dd73a4146f",
      "parents": [
        "662a69ea86f6735776b5531f5626ed48f60d418d"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 16 17:42:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:42:48 2026"
      },
      "message": "tp: add follower counters to stack sampling (#6742)\n\nAdd follower counters to StackSample: secondary counters read at the\nsame\nsample point as the primary timebase (e.g. instructions alongside\ncycles).\nfollower_weights is positional with follower_descriptors /\nfollower_descriptor_iids, defaulting from StackSampleDefaults.\n\nGeneralize the timebase table into __intrinsic_stack_sample_counter,\nshared\nby the primary timebase and followers, and add\n__intrinsic_stack_sample_follower\nmapping each sample to its follower counter values."
    },
    {
      "commit": "662a69ea86f6735776b5531f5626ed48f60d418d",
      "tree": "3886ca72c759c430a3e6898636a3614e8d113434",
      "parents": [
        "ae9e647641c0b7af3d62719ede7bd73494eedac0"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 16 16:58:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 16:58:20 2026"
      },
      "message": "ui: extract TrackEvent callstack flamegraph tab (#6754)\n\nMove the TrackEvent callstack flamegraph area-selection implementation\nout of the TrackEvent plugin index and into a dedicated tab class.\n\nThis is a pure refactor with no behavior changes. It prepares the\nimplementation for follow-up support for additional callstack measures."
    },
    {
      "commit": "ae9e647641c0b7af3d62719ede7bd73494eedac0",
      "tree": "daa6db73167fb81595cedffc975a7c74f9f6fc8f",
      "parents": [
        "decbc5f79168de443bdd66666326ba76e4ad1be9"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 16:36:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 16:36:42 2026"
      },
      "message": "ui: Tint track shell when the track is selected (#6753)\n\nTracks that are part of the current selection - whether that\u0027s an area\nselection or a single track/event selection - now get a subtle accent\ntint on their shell, so it\u0027s easier to see at a glance which tracks the\nselection covers.\n\nFixes: https://github.com/google/perfetto/issues/6749\n\nArea selection:\n\n\u003cimg width\u003d\"832\" height\u003d\"467\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/b93452aa-2905-4a14-9521-f22fced2ca22\"\n/\u003e\n\nSingle selection:\n\n\u003cimg width\u003d\"667\" height\u003d\"418\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/524fd745-4d31-4fad-a822-fd3b7cabcde2\"\n/\u003e"
    },
    {
      "commit": "decbc5f79168de443bdd66666326ba76e4ad1be9",
      "tree": "4035bfab0342515a8fc3ded76c55bc9c8bfcfbe4",
      "parents": [
        "e328d0aeaebc129aa11d6e165d171a59f4d6d608"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 16:16:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 16:16:31 2026"
      },
      "message": "ui: Bump vite and vitest (#6673)\n\n- Vite 7.3.6\n- Vitest 4.1.10"
    },
    {
      "commit": "e328d0aeaebc129aa11d6e165d171a59f4d6d608",
      "tree": "3fece7891c3f4dba08c81548ed500f1d6203da4a",
      "parents": [
        "1c174fda200bd37d14e94e64cb77801a13662d57"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 16 16:07:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 16:07:50 2026"
      },
      "message": "ui: switch recording page to detect diff based on config snaps (#6631)\n\nInstead of a manually incremented generation counter, switch to using\nconfig diffing instead making it fully robust\n\nBug: b/532853785"
    },
    {
      "commit": "1c174fda200bd37d14e94e64cb77801a13662d57",
      "tree": "17d403e48d6f2f61d267d7f00a891f5fe45fad08",
      "parents": [
        "0715ba3036737748d84767f91bc69703148c8979"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 16:06:39 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 16:06:39 2026"
      },
      "message": "ui: DataGrid: Style missing cells \u0026 invalidate invalid fields instead of guessing (#6750)\n\n- Style missing data cells with a striped background, similar to errored\ntracks. When a cell value is undefined, render a red diagonal-stripe\npattern with \"no data\" placeholder text instead of leaving the cell\nblank.\n- When a field path ends exactly at a join (no trailing column), treat\nthis as invalid and return undefined instead of returning the primary\nkey. This ensures such cases are caught and displayed as missing data."
    },
    {
      "commit": "0715ba3036737748d84767f91bc69703148c8979",
      "tree": "5b5f5b9ce8517faf12d08d438bb4f67f33440128",
      "parents": [
        "e581200341ca19708a1fdb8a7d90af58e6e928aa"
      ],
      "author": {
        "name": "BogdanLionte",
        "email": "bogdan.lionte1997@gmail.com",
        "time": "Thu Jul 16 15:54:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:54:33 2026"
      },
      "message": "perfetto: fix preventing duplicate comments for deleted elements in proto_merger (#6743)"
    },
    {
      "commit": "e581200341ca19708a1fdb8a7d90af58e6e928aa",
      "tree": "6f18b49774fe364010f3cbe6b3474d4f050ed7db",
      "parents": [
        "be543ad4d84ce2bdcc0c14e49a627ba18e81e4fe"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 15:40:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:40:12 2026"
      },
      "message": "ui: HeapDumpExplorer: Remove dead code (#6748)\n\nRemove some dead, unused code."
    },
    {
      "commit": "be543ad4d84ce2bdcc0c14e49a627ba18e81e4fe",
      "tree": "918d3a8e8a0589b67e4b5c0d6e1fef2b0580bb1b",
      "parents": [
        "673817d488b0f6e5d9d5e862613f4c765af51208"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 15:28:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:28:56 2026"
      },
      "message": "ui: HDE plugin tidyup (#6747)\n\n- Swap default exports for standard named exports.\n- Use `time` instead of `bigint` for timestamps.\n- Reinterpret pointers from signed int64 to unsigned uint64s."
    },
    {
      "commit": "673817d488b0f6e5d9d5e862613f4c765af51208",
      "tree": "88de113032ef64bf687f30a9c0a3dac4efb17c72",
      "parents": [
        "fb2aa5a192eda707f55442359da5107540fd0160"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 14:42:13 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:42:13 2026"
      },
      "message": "ui: Add DataGrid playground as a separate widgets subpage (#6744)\n\nSplit the DataGrid showcase into two pages: the original demo with\ncurated examples, and a new interactive playground where users can edit\nand test custom DataGrid configs live.\n\nAlso add fullWidth support to WidgetsPage for pages that need more\nhorizontal space."
    },
    {
      "commit": "fb2aa5a192eda707f55442359da5107540fd0160",
      "tree": "a46814420f8a463ff3db0f4d0cbb879ef0caca29",
      "parents": [
        "c4002e38fa034f765e86dd8abb7c1ab35baa2e1c"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 13:27:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 13:27:51 2026"
      },
      "message": "ui: Datagrid: Escape dots in field names (#6721)\n\nAdd splitPath/escapePath so column names containing literal dots work\ncorrectly. Rename toAlias() to quoteIdentifier().\n\nField names passed to datagrid (field paths) are dot separated (e.g.\nparent.id, or track.name) when used to reference nested tables as\ndefined by the schema. The trouble is sometimes we provide these field\nnames from unescaped raw values from the user, which can themselves\ncontain dots.\n\nThis patch establishes an escaping format where we dots are treated as\npath delimiters but double dots are escaped.\nE.g.\n  - `foo.bar` -\u003e `[\u0027foo\u0027, \u0027bar\u0027]`\n  - `foo..bar` -\u003e `[\u0027foo.bar\u0027]`\n  - `foo...bar` -\u003e `[\u0027foo.\u0027, \u0027bar\u0027]`"
    },
    {
      "commit": "c4002e38fa034f765e86dd8abb7c1ab35baa2e1c",
      "tree": "8c143f98e17c9a9a7d2717300cca6cf1171463a8",
      "parents": [
        "a1b84ab5db1b2e95010f2c63325e364a56de42ee"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 13:15:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 13:15:14 2026"
      },
      "message": "ui: Simplify DataGrid schema models (#6710)\n\nCurrently the schema is a record of tables keyed by name, like this:\n\n```js\n{\n  slice: {\n    id: {},\n    ts: {},\n    dur: {},\n    track: {ref: \u0027track\u0027, ...}, // Ref to the foreign table\n  },\n  track: {\n    id: {},\n    name: {}\n  },\n  parent: {ref: \u0027slice\u0027, ...}, // Recursive reference\n}\n```\n\nThis works but is messy:\n- Can reference non-existent tables - must check for undefined\neverywhere.\n- The vast majority of schemas in practice are flat (single table) which\nmeans we have to nest every single schema inside a dummy table name when\nits totally redundant.\n- Field paths don\u0027t specify a \u0027root\u0027 table name so we must pass the\n\u0027root\u0027 (default) table name around as a string everywhere.\n\n## The fix\n\nThis patch replaces this nominal structure with a structured definition\nwhich solves all of these problems:\n\nE.g.\n\n```js\nconst sliceSchema \u003d {\n  id: {},\n  ts: {},\n  dur: {},\n  table: {\n    schema: { // \u003c-- Nested table schema\n       id: {},\n       name: {}\n    },\n  },\n  parent: {\n    get schema() { // \u003c-- recursive references can exist - you just have to use a getter.\n      return sliceSchema;\n    }\n  },\n}\n```\n\nNotes:\n- The recursive via getter trick is borrowed from\n[zod](https://zod.dev/api?id\u003drecursive-objects#recursive-objects).\n- The sqlSchema (the separate schema passed to the SQLDataSource has\nbeen restructured in a similar way.\n- This is a big change due to the number of DataGrid call-sites, but\nit\u0027s mainly mechanical. Should be a no-op.\n\nKey changes:\n- SchemaRef.ref (string) → SchemaRef.schema (ColumnSchema), with get\nschema() for self-referential tables\n- SQLTableSchema.table → SQLTableSchema.tableOrSubquery, always wrapped\nin parens in generated SQL\n- DataGridAttrs.schema is now ColumnSchema (was SchemaRegistry),\nrootSchema removed\n- SQLDataSource config extends SQLTableSchema directly (was sqlSchema +\nrootSchemaName)\n- Add getQuery() to SQLDataSource and sub-engines for SQL inspection"
    },
    {
      "commit": "a1b84ab5db1b2e95010f2c63325e364a56de42ee",
      "tree": "e70978a3fb6bbd468b788d170be65b333dd621a6",
      "parents": [
        "a418b2d207ff47334429c0897b446f928c079edb"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 16 12:30:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 12:30:52 2026"
      },
      "message": "ui: rank table search by relevance then importance (#6719)\n\nThe Data Explorer \"Choose a table\" search ordered table-name matches\npurely by table importance, discarding the fuzzy finder\u0027s relevance\norder. A fuzzy but high-importance stdlib match like android_frames then\nfloated above an exact match like androidx_art_metrics, so searching\nandroidx_ surfaced only the stdlib android_* tables and buried the\nextension-server androidx_* tables below them.\n\nRank each match group lexicographically: bucketed fuzzy relevance first,\nimportance second. A clearly better match always wins, and importance\nonly decides the order between matches of comparable relevance. Rounding\nthe fuzzy score into coarse buckets is what lets importance break ties\nbetween similarly-relevant tables.\n\nExpose the match score from FuzzyFinder and extract the search and\nranking out of the Mithril view into pure searchTables and\nsearchAndRankTables functions with unit tests.\n\nBug: #6559"
    },
    {
      "commit": "a418b2d207ff47334429c0897b446f928c079edb",
      "tree": "58cbaea27b4a34a3d44d4bc98d8640ecd481c682",
      "parents": [
        "ee8d7d68bbb93a2c260f93f590d19a3ab09a0ab8"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 11:58:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:58:48 2026"
      },
      "message": "ui: add flag to keep current page when loading a new trace (#6741)\n\nCurrently every time a trace loads we navigate to the timeline page.\nDuring UI development, it\u0027s quite handy to just stay on the same page\nwhile reloading the UI frequently, and this automatic page changing can\nget frustrating.\n\nThis PR adds a \u0027keepCurrentPageOnTraceLoad\u0027 feature flag that, when\nenabled, preserves the current page and subpage instead of navigating to\nthe default landing page (/viewer) when a new trace is loaded. The\nlocal_cache_key is still updated in the URL to maintain the trace link."
    },
    {
      "commit": "ee8d7d68bbb93a2c260f93f590d19a3ab09a0ab8",
      "tree": "093924a63220bc5df0743616d167b5256a7a7336",
      "parents": [
        "0f7fcd3531e2a0d8bb0c92fc8e45f3f65859d01b"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Thu Jul 16 11:51:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:51:16 2026"
      },
      "message": "perfetto: make the SDK implementation define sufficient for export (#6731)\n\nRe-lands #6706 (reverted in #6722), plus a fix for the breakage that\ncaused\nthe revert. Kept as two commits on purpose: the original change as\nreviewed,\nand the fix on top.\n\n**What broke (b/535183253)**\n\nThe Android emulator builds a Windows DLL that wraps the Bazel\nlibperfetto_c as a static dep and re-exports the perfetto C ABI from it.\nThe original change required both PERFETTO_SDK_SHLIB and\nPERFETTO_SDK_SHLIB_IMPLEMENTATION to export symbols and Bazel has no way\nto pass a define from the DLL target down into libperfetto_c\u0027s\ncompilation,\nso their DLL silently stopped exporting and every consumer failed to\nlink.\n\n**The fix (second commit)**\n\n* PERFETTO_SDK_SHLIB_IMPLEMENTATION alone now exports. Define it when\n  building the SDK into a shared library — including wrapping it in one.\n* PERFETTO_SDK_SHLIB alone imports. Define it when consuming the SDK as\na\n  shared library.\n* Neither defined \u003d static linking \u003d no annotations. Still the default.\n* The generated Bazel BUILD sets the implementation define on\nlibperfetto_c\nagain, so wrapper DLLs like gfxstream\u0027s work with no changes on their\nside.\n* The amalgamated .cc only marks itself as the implementation in shared\n  library mode, so plain static builds stay annotation-free.\n\n**Verified**\n\n* No-macro builds produce zero export/import annotations (headers, GN,\n  amalgamation).\n* Amalgamated SDK builds as a shared library with -DPERFETTO_SDK_SHLIB\non\nboth sides; consumers link and run, including the exported data symbols.\n* Objects built with only the implementation define (the gfxstream case)\n  export the full ABI.\n* libperfetto_c.so exports are unchanged; shared_lib integration tests\npass."
    },
    {
      "commit": "0f7fcd3531e2a0d8bb0c92fc8e45f3f65859d01b",
      "tree": "708fbcd3712a8776e56876fe059dd35eb92161b1",
      "parents": [
        "46e6b5b7b6d345972dbe2831568218a393c74613"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 16 11:37:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:37:27 2026"
      },
      "message": "ui: passthrough missing filename from postMessage (#6740)\n\nFixes: https://github.com/google/perfetto/issues/6736"
    },
    {
      "commit": "46e6b5b7b6d345972dbe2831568218a393c74613",
      "tree": "9a680f65da2c413ad43809569c7fc18050ad457c",
      "parents": [
        "a58e6eaba3a6dd650b58c68e5100867c796f24e9"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 11:12:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:12:48 2026"
      },
      "message": "ui: Fix bigtrace build (#6720)\n\nBump to es2022 which adds Error.cause allowing the override to override\nsomething and keep typescript happy."
    },
    {
      "commit": "a58e6eaba3a6dd650b58c68e5100867c796f24e9",
      "tree": "1285957ba0b4c99ffff4d3705f28cef5c6c40040",
      "parents": [
        "0e26c4745eeb5c4f35843c5817fc322f8083fd83"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Jul 16 10:45:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:45:24 2026"
      },
      "message": "ui: prefer readonly T[] syntax over ReadonlyArray\u003cT\u003e in style guide (#6734)\n\nUpdate the AGENTS-ui.md style guide to recommend the modern TypeScript\nreadonly modifier syntax (readonly T[]) instead of the older\nReadonlyArray\u003cT\u003e generic. The modifier syntax is more idiomatic and\nconsistent with TypeScript\u0027s evolving style recommendations."
    },
    {
      "commit": "0e26c4745eeb5c4f35843c5817fc322f8083fd83",
      "tree": "74ef02079cb4c82a405ccbb33c5520d35efe3169",
      "parents": [
        "bd9e306eccea2ecaddc4e4d2d5de476e772c1a33"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 16 10:43:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:43:56 2026"
      },
      "message": "tp: improve performance of jank_cuj metric (#6650)"
    },
    {
      "commit": "bd9e306eccea2ecaddc4e4d2d5de476e772c1a33",
      "tree": "f292c7a578cb03179b78e746b57fe81bef926a93",
      "parents": [
        "09d113473237cc0325eb38db766a166c5c3e774c"
      ],
      "author": {
        "name": "Yi Kong",
        "email": "kongyi521@gmail.com",
        "time": "Thu Jul 16 09:52:58 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 09:52:58 2026"
      },
      "message": "Fix build with the latest libc++ (#6733)\n\nThe latest libc++ no longer transitively include cstdlib, causing a\nbuild failure.\n\nIn file included from\nexternal/perfetto/src/profiling/common/profiler_guardrails.cc:17: In\nfile included from\nexternal/perfetto/src/profiling/common/profiler_guardrails.h:29:\nexternal/perfetto/src/profiling/common/proc_utils.h:50:20: error: use of\nundeclared identifier \u0027strtol\u0027\n   50 |     long int pid \u003d strtol(entry-\u003ed_name, \u0026end, 10);\n      |"
    },
    {
      "commit": "09d113473237cc0325eb38db766a166c5c3e774c",
      "tree": "54a0aac21a5e864a666226e3d53e27d53d48a7e0",
      "parents": [
        "54ba92b115453c27c57e6c43af4f761c94fde1d1"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Thu Jul 16 09:21:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 09:21:11 2026"
      },
      "message": "Sync generated proto files (#6735)\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": "54ba92b115453c27c57e6c43af4f761c94fde1d1",
      "tree": "aa68532594440726e9c05abc2e3e7fee8edf7382",
      "parents": [
        "e819e34a0a48ea4cb7364aabd507adccc54545a4"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Wed Jul 15 18:11:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 18:11:35 2026"
      },
      "message": "tp,ui,docs: Surface the display-video user-build sysprop in docs, record page and trace doctor (#6717)\n\nScreen recording (`android.display.video`) is now capturable on `user`\n(production) builds, not just `userdebug`. On user builds it must be\nunlocked\n  first, over ADB, until the next reboot:                              \n \nadb shell setprop debug.tracing_video_allowed true\n                                                                       \nThe property is cleared on reboot, so it has to be re-set after each\nrestart\nbefore display video can be captured. Once set, capture works through\nany of the\nexisting methods (the on-device toggle, the record page, or a raw\nconfig).\n                                                                       \nThis makes that requirement discoverable in three places:\n**Docs** (`docs/data-sources/video-frames.md`)\n- Drop the \"userdebug devices only\" statement.\n- Add a \"Prerequisite on `user` builds\" section documenting the\nproperty, the\ncommand, and its reset-on-reboot behaviour; point the intro/TOC at it.\n  **Record page** (`Display video frames` probe)                       \n- The probe description now spells out the user-build requirement and\nshows the\n`setprop` command as a code snippet, and links to the data-source doc.\n                                                                       \n  **Trace doctor** (new `display_video_not_enabled` diagnostic)        \n- Fires when a trace requested `android.display.video` but captured no\nframes,\non a `user` build, with no producer error stats — the usual cause being\nthe\n    property was not set. \n- The video-frames table is owned by the `video_frame_importer` plugin\nand isn\u0027t\nreachable from the common diagnostics framework, so the plugin now bumps\na new\n`android_video_frames_emitted` stat per inserted frame; the rule reads\nemptiness through that stat, alongside the existing `android_video_*`\nerror\n    stats."
    },
    {
      "commit": "e819e34a0a48ea4cb7364aabd507adccc54545a4",
      "tree": "4e98e53b728385498d2bc3a8ee210e54ab24d386",
      "parents": [
        "1fa919469831e61d531e3983fe55f4b34bdf737f"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Jul 15 18:08:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 18:08:37 2026"
      },
      "message": "tp: workaround SQLite bug with LEFT JOINs (#6723)\n\nThere\u0027s a missing optimization with left joins which I believe is an\nSQLite bug. Reported upstream but in the meantime workaround it.\n\nFixes: b/535068603"
    },
    {
      "commit": "1fa919469831e61d531e3983fe55f4b34bdf737f",
      "tree": "dae07251932ce1d79f0addbc0f6c0b3e53f19013",
      "parents": [
        "a8dd0bc7db016c900a2ea13f48a0eb13cee50a0b"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Wed Jul 15 18:01:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 18:01:10 2026"
      },
      "message": "Revert \"perfetto: rework C SDK shared library export macros (#6706)\" (#6722)\n\nThis reverts commit c3585c0a57aa99f7b3cfdd724398a0a368ad945b.\n\nRevert temporarily until issue is resolved\n\nBug: 535183253"
    },
    {
      "commit": "a8dd0bc7db016c900a2ea13f48a0eb13cee50a0b",
      "tree": "51eac8b48b43f20c352ecee096f1e25bffe3e18b",
      "parents": [
        "858eaf366bebff3889b3e0e3a70cf2d35c677dc7"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Jul 15 16:51:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 16:51:46 2026"
      },
      "message": "tp: add transport-neutral stack sampling protos and parsing (#6679)\n\nAdd StackSample: a callstack captured for a thread, process, or cpu,\nmeasured against a primary counter timebase, emitted as\nTracePacket.stack_sample. Contexts and the primary descriptor can be\ninline or interned; interned context hangs off InternedData through the\nStackSampleInternedData extension.\n\nParse into __intrinsic_stack_sample plus deduplicated task_context,\nexecution_context, and timebase tables; each sample references its\ncontexts by id. No tracks are minted.\n\nFrame in profile_common.proto gains a frame-kind field, parsed into a\nnullable stack_profile_frame.type column."
    },
    {
      "commit": "858eaf366bebff3889b3e0e3a70cf2d35c677dc7",
      "tree": "8286b91ea13bc90be9caa55f97d9ca918b84cc95",
      "parents": [
        "160d10499fe38f5117607fdf775d253e461d6812"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Wed Jul 15 15:30:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 15:30:52 2026"
      },
      "message": "sdk: Add PerfettoDsGetTimestamp to data source ABI (#6707)\n\nTrack event C API has PerfettoTeGetTimestamp() which hides the\npreferred trace clock selection. The data source C API lacked an\nequivalent, so users had to duplicate the selection logic.\n\nAdd PerfettoDsGetTimestamp() and PerfettoDsGetDefaultClockId() to\ndata_source_abi.h. Make PerfettoTeTimestampType values reuse\nPerfettoDsClockId and have TeGetTimestamp() reuse DsGetTimestamp().\nDeprecate PERFETTO_I_CLOCK_INCREMENTAL_UNDERNEATH and update internal\nC++ code to use the new function. Avoid platform ifdefs in public\nheaders by determining the default clock at runtime.\n\nExpose DataSourceTimestamp::now() in the Rust SDK and update the\ngpu_counters example. Bump perfetto-sdk-sys 1.2.0-\u003e1.3.0 and\nperfetto-sdk 1.0.3-\u003e1.1.0."
    },
    {
      "commit": "160d10499fe38f5117607fdf775d253e461d6812",
      "tree": "0293eec3c14c2cbe9491887b4d41415508b9d17f",
      "parents": [
        "37912985e07bec6d1dba2e422e89b761ed034fb7"
      ],
      "author": {
        "name": "copybara-service[bot]",
        "email": "56741989+copybara-service[bot]@users.noreply.github.com",
        "time": "Wed Jul 15 12:42:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:42:36 2026"
      },
      "message": "Copybara import from Chromium: proto and stdlib changes (#6716)\n\nCopybara import from Chromium: proto and stdlib changes\n\n- f51f8af1d46e28769dc3d11ab0b0a0197fd71a63 Remove code for deriving\nVSync interval from frame timeli... by Petr Čermák\n\u003cpetrcermak@chromium.org\u003e\n\nCOPYBARA_IMPORT\u003dProject import generated by Copybara.\n\nGitOrigin-RevId: f51f8af1d46e28769dc3d11ab0b0a0197fd71a63\n\nCo-authored-by: Perfetto Team \u003ccopybara-servicebot@google.com\u003e"
    },
    {
      "commit": "37912985e07bec6d1dba2e422e89b761ed034fb7",
      "tree": "cfc205de29b4c6bf05af2d9b5fbd520f8f966aa0",
      "parents": [
        "190839adfe31ea9b2888ca320320128e530bd70e"
      ],
      "author": {
        "name": "Ryan",
        "email": "rsavitski@google.com",
        "time": "Wed Jul 15 11:48:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:48:18 2026"
      },
      "message": "pb: choose a more unique extension id for FieldOptions (#6715)\n\nThe chosen id has a conflict in google3. Try a different one in the\n50000-99999 range. Checked via g3 presubmit.\n\nFixes: #6472."
    },
    {
      "commit": "190839adfe31ea9b2888ca320320128e530bd70e",
      "tree": "8c75941b99da86857c05db8a432b894f40918b63",
      "parents": [
        "c1fee312297a788447b7694f881e3e6a336c0928"
      ],
      "author": {
        "name": "Nicolò Mazzucato",
        "email": "nicomazz@google.com",
        "time": "Wed Jul 15 00:51:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 00:51:04 2026"
      },
      "message": "tp: Migrate CUJ SF boundaries to stdlib (#6713)\n\nMoving the sf boundaries to the stdlib, keeping the original tables\nunchanged to avoid breaking pipelines that rely on them for now"
    },
    {
      "commit": "c1fee312297a788447b7694f881e3e6a336c0928",
      "tree": "c02b32d23c1f1afeae948a69ebf1a74d57e9540d",
      "parents": [
        "6461b975008370c203983b786305d948ce67841b"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Tue Jul 14 22:00:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 22:00:08 2026"
      },
      "message": "proto: Add and annotate foreground_service_type with flags_enum (#6712)\n\nSee ag/40970320"
    },
    {
      "commit": "6461b975008370c203983b786305d948ce67841b",
      "tree": "7e670b93cf2d0008374382092b628e432ad0227b",
      "parents": [
        "c3585c0a57aa99f7b3cfdd724398a0a368ad945b"
      ],
      "author": {
        "name": "Sharjeel Khan",
        "email": "sharjeelkhan@google.com",
        "time": "Tue Jul 14 21:15:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 21:15:47 2026"
      },
      "message": "Add algorithm header for std::transform (#6711)\n\nLibc++ have started removing more transitive includes so we need the\nalgorithm header in this file for std::transform."
    },
    {
      "commit": "c3585c0a57aa99f7b3cfdd724398a0a368ad945b",
      "tree": "3fb3d30886902606d98edc19edea6647b9d552dd",
      "parents": [
        "a119ea6c59dc5149a03e6b368aa45d2fd82bd44c"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Tue Jul 14 19:15:13 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 19:15:13 2026"
      },
      "message": "perfetto: rework C SDK shared library export macros (#6706)\n\nReplace the negative-logic PERFETTO_SDK_DISABLE_SHLIB_EXPORT with a\npositive-logic gate, in the same shape as PERFETTO_EXPORT_COMPONENT:\n\n* PERFETTO_SDK_SHLIB: defined when the SDK is built as a shared library,\nin both the library and its consumers.\n* PERFETTO_SDK_SHLIB_IMPLEMENTATION (renamed from\nPERFETTO_SHLIB_SDK_IMPLEMENTATION): additionally defined when compiling\nthe library itself.\n\nThis is a known follow-up from aosp/2132115, which introduced these\nmacros: the negative logic was chosen so that copied headers work\nagainst the shared library out of the box, with the note that once the\nheaders joined the amalgamated build a dedicated build flag would be\nneeded. PERFETTO_SDK_SHLIB is that flag.\n\nBenefits:\n* Static linking, the default, needs no macros at all.\n* The amalgamated C SDK can be built as a shared library by defining\nPERFETTO_SDK_SHLIB. Previously the generated header unconditionally\ndisabled export annotations with no way to override: a Windows DLL build\ngot no dllexport and its consumers no dllimport, so exported data\nsymbols (e.g. perfetto_te_any_categories) failed to link.\n* Checked-in headers and the amalgamated SDK now behave identically.\n* GN owns the linkage macros: they are defined only in configurations\nthat build libperfetto_c as a shared library, so gen_amalgamated\nharvests the build description verbatim; the generated .cc declares\nitself as the implementation.\n\nBreaking changes:\n* Windows consumers of a prebuilt libperfetto_c.dll relying on bare\nheaders defaulting to dllimport must define PERFETTO_SDK_SHLIB.\n* Out-of-tree builds defining PERFETTO_SHLIB_SDK_IMPLEMENTATION must\nswitch to the new name.\n* Defining PERFETTO_SDK_DISABLE_SHLIB_EXPORT is now a no-op with the\nsame effect (annotations disabled by default)."
    },
    {
      "commit": "a119ea6c59dc5149a03e6b368aa45d2fd82bd44c",
      "tree": "660463b4eb91556610d85b60f2e25f970e695acc",
      "parents": [
        "b41b5b83bfe63420609830fd17a6a2d5d6b545a0"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Tue Jul 14 19:03:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 19:03:25 2026"
      },
      "message": "tp: annotate frameworks_base flag fields with flags_enum (#6709)\n\nMark the bitmask int fields in frameworks_base_track_event.proto with\nthe flags_enum field option so trace_processor expands each mask into\none arg per set flag."
    },
    {
      "commit": "b41b5b83bfe63420609830fd17a6a2d5d6b545a0",
      "tree": "8e6d78372ce81f0c54b0fa123447c4e2df1c06c0",
      "parents": [
        "b517f99d2a5b614f7f64e6d83b953aec9957fae5"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Tue Jul 14 18:26:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 18:26:46 2026"
      },
      "message": "docs: speed up docs-site search (#6702)\n\nThe client-side search downloaded a ~1.5MB uncompressed\nsearch_index.json and rebuilt the whole BM25 index on the main thread on\nfirst use, which froze the search box for seconds on the first keystroke\n(#6654). Fixed on the build/client side:\n\n1. Precompute the inverted index (gen_search_index.js, script.js): build\nthe postings at build time and ship them, so the browser rebuilds the\nmap from flat arrays (~10ms) instead of re-tokenizing ~1.2MB of body\ntext.\n\n2. Ship the index gzipped (gen_search_index.js, BUILD.gn, mime_util,\nscript.js): the docs-site proxy serves this file uncompressed, so gzip\nit at build time (search_index.json.gz) and inflate it in the browser\nwith DecompressionStream. The download is ~540KB even though\nprecomputing grows the index to ~1.8MB uncompressed.\n\n3. Warm and show progress (script.js, style.scss): load the index at\nidle so it\u0027s usually ready before the first search, and show a loading\nrow if the user types before it arrives, instead of a frozen box."
    },
    {
      "commit": "b517f99d2a5b614f7f64e6d83b953aec9957fae5",
      "tree": "f137927f31c8aa64959dbc1f2cb61b75711428b2",
      "parents": [
        "21ae3bc81c0374a9572ea2819636ee29b54666f5"
      ],
      "author": {
        "name": "zezeozue",
        "email": "zezeozue@google.com",
        "time": "Tue Jul 14 18:09:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 18:09:30 2026"
      },
      "message": "tp: expand (flags_enum)-annotated fields into per-flag args (#6472)\n\nAdds DescriptorPool::FlagSetToViews, which expands a flag bitmask into\nthe names of its set flags, appended as string_views into the pool\u0027s\nenum-name storage. Composite (multi-bit) values are skipped; the set\nbits with no single-bit name are returned to the caller.\n\nA proto int field can carry a (flags_enum) FieldOptions annotation\nnaming its flags enum. proto_to_args_parser reads it and emits one\nstring arg per set flag via FlagSetToViews, instead of the raw int.\nLiving in the args funnel, it covers base fields and both extension\nsurfaces with no per-parser code. The annotation is surfaced on\nFieldDescriptor, extracted from the field options during descriptor\nfinalization."
    },
    {
      "commit": "21ae3bc81c0374a9572ea2819636ee29b54666f5",
      "tree": "2aefa279b3f0c606604f388a0cdfc8ec5925f94b",
      "parents": [
        "7b9a30e2f628d07a72df32f3d0edfbbdc97c87e2"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Jul 14 17:25:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 17:25:45 2026"
      },
      "message": "tp: improve query planning for multiple-selective constraints (#6694)\n\nAfter the changes to estimate distinct count, we didn\u0027t think about how\nthis works in the face of multiple \u003d/IN constraints. Unfortunately, we\nfound it would tend to *underestimate* the value of these quite a bit.\n\nDeal with this by instead of repeatedly pulling the count down for every\nconstraint, picking the *most* selective constraint and estimating based\non that instead. This should strike a good balance between being too\nhigh or too low."
    },
    {
      "commit": "7b9a30e2f628d07a72df32f3d0edfbbdc97c87e2",
      "tree": "88aebffc733b7d088de2425d0cc97ac23b439f2f",
      "parents": [
        "c1499d5a52ec02cb3b9d3c53c6ee228ff4c40b34"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Jul 14 16:47:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 16:47:37 2026"
      },
      "message": "ui: Add ability to pivot on arg values (#4976)\n\nThis patch allows users to add group by argument values in the slice\nselection aggregation view.\n\nIn order to get this working, we needed to provide much more\nconfigurability from the aggregators so this patch also reconfigures the\noutput of the aggregators to be closer to that of the datagrid, giving\nthem more control. All aggregators needed to be updated accordingly to\nfit the new interface.\n\nThe only aggregator which has actually changed is the slice selection\naggregator, which adds `arg_set_id` to the underlying table, and adds a\nnew parameterised `Args` column.\n\nTesting: \n\n- Make an area selection over one or more slice tracks\n- Wait for the table to load\n- Click the triple dot dropdown in one of the group header cells -\u003e\nclick `Add group by`\n- Select an argument (or fuzzy search) to add the column\n\n\u003cimg width\u003d\"959\" height\u003d\"378\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/fb8252a0-5695-4dcb-824b-acc203322940\"\n/\u003e\n\n\u003cimg width\u003d\"781\" height\u003d\"146\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/18fe506c-7a89-49cb-a7a4-f9b53c94d17f\"\n/\u003e"
    },
    {
      "commit": "c1499d5a52ec02cb3b9d3c53c6ee228ff4c40b34",
      "tree": "30565023ee6555ce193c6e87c78dc6773866cb5b",
      "parents": [
        "e7bee45938390ce4dc20928d3b1f8750b18d2f9d"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Jul 14 16:20:58 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 16:20:58 2026"
      },
      "message": "ui: don\u0027t crash query page when duplicate table names (#6704)\n\nBug: b/534699963"
    },
    {
      "commit": "e7bee45938390ce4dc20928d3b1f8750b18d2f9d",
      "tree": "8bebae12c0c73b470342e5b761ff73603a1c86a8",
      "parents": [
        "d05a68aed78127f80aea5ebb7931f745cb82adac"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Jul 14 16:01:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 16:01:49 2026"
      },
      "message": "ui: tp: speed up trace load performance (#6705)"
    },
    {
      "commit": "d05a68aed78127f80aea5ebb7931f745cb82adac",
      "tree": "a3988a4a0b4596dcea08f5182a8f4b23b92caf21",
      "parents": [
        "6ee0455fc0833b1b8b84961103405878efd80be2"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Jul 14 15:43:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 15:43:29 2026"
      },
      "message": "ui: make regex opt-in instead of happening by default (#6691)\n\nToo many edge cases with automatic regex so require the user to wrap it\nwith /../ to use regex syntax.\n\nBug: b/534157859"
    },
    {
      "commit": "6ee0455fc0833b1b8b84961103405878efd80be2",
      "tree": "ccd924d732f0f9a927929994ec2330dde455317d",
      "parents": [
        "1b2dd99b554e0a352a771b996871130e891d4523"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Jul 14 15:41:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 15:41:17 2026"
      },
      "message": "infra: set cache control private header (#6703)"
    },
    {
      "commit": "1b2dd99b554e0a352a771b996871130e891d4523",
      "tree": "9849f76fb97b798765a66f03b1ef718394836605",
      "parents": [
        "48b6cb961393cb67759ec9530b63b2c8847222e5"
      ],
      "author": {
        "name": "Nublo",
        "email": "varyvonchyk.anatol@gmail.com",
        "time": "Tue Jul 14 15:10:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 15:10:01 2026"
      },
      "message": "ui: pin relevant tracks for dma memory regression (#6701)\n\nPin global `mem.dma_heap` and `mem.dma_buffer` when facing regression\n\nWhenever we detect that metric contained a global dma memory regression\nWe pin global (`mem.dma_heap` and `mem.dma_buffer`) tracks\nto simplify investigation.\n\n---------\n\nCo-authored-by: anatolv \u003canatolv@google.com\u003e"
    },
    {
      "commit": "48b6cb961393cb67759ec9530b63b2c8847222e5",
      "tree": "2f824ebf3b02ad889dc621fd2d7541c6b44b9a7b",
      "parents": [
        "ec531cdffe8396bd463b5350f5cac46bf41efc08"
      ],
      "author": {
        "name": "Nublo",
        "email": "varyvonchyk.anatol@gmail.com",
        "time": "Tue Jul 14 13:26:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 13:26:59 2026"
      },
      "message": "ui: Pin tracks for memory regressions investigations (#6685)\n\nui: Extended PinAndroidPerfMetrics handlers\n\nIntroduced `SimpleProcessMetricHandler` to reduce boilerplate for\nhandlers that match a process name in a metric URL and pin its tracks. This base\nclass uses a list of regexes for matching and prefix-matches track names\nby default.\n\nImplemented handlers for Heap Size, Bitmap, Dirty Memory,\nGPU Memory, Leak (Activity/Binder), and Hardware Buffer memory regressions.\n\n---------\n\nCo-authored-by: anatolv \u003canatolv@google.com\u003e"
    },
    {
      "commit": "ec531cdffe8396bd463b5350f5cac46bf41efc08",
      "tree": "a1ff8dd33116ba0acee2522f05874453838ab319",
      "parents": [
        "ae22f029e081968281a37cf7b147509a539cd0c2"
      ],
      "author": {
        "name": "Ryan Zuklie",
        "email": "rzuklie@google.com",
        "time": "Tue Jul 14 13:17:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 13:17:43 2026"
      },
      "message": "Collapse isolated UIDs into one CPU per UID track (#6644)\n\nThere can be many thousand isolated UIDs in a trace which is not\nparticularly helpful to a user and is expensive for queries. This change\ntreats isolated UIDs and shared UIDs similar to the totals tracks, where\nthe delta is accumulated and written at the end of packet handling.\n\nOne subtle point: the last_value_ and delta_ms calculation is moved out\nof ComputeTotals, since we\u0027re now passing the canonicalized UID in which\nwould break the delta calculation. This also puts the incremental and\nglobal last_value calculation in one function and tries to explain why\nthey both exist."
    },
    {
      "commit": "ae22f029e081968281a37cf7b147509a539cd0c2",
      "tree": "44e71b1c33f8458d0cd2a8f84d9bc448a268eefc",
      "parents": [
        "a327b80b5249e0d9ae351c78a7703be59f6eb22e"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Jul 14 12:30:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:30:47 2026"
      },
      "message": "ui: Update changelog (#6700)"
    },
    {
      "commit": "a327b80b5249e0d9ae351c78a7703be59f6eb22e",
      "tree": "e45f2df00f8dd8377b9848f7a3405a58fb921639",
      "parents": [
        "421b7baef5f22275ad83330d5f285731b1014ce9"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Tue Jul 14 12:14:44 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:14:44 2026"
      },
      "message": "tp: set android_aflags_errors as kError (#6688)\n\nag/40948436 removes the flag aflags_list_proto so going onwards safe to\nset it back as kError"
    },
    {
      "commit": "421b7baef5f22275ad83330d5f285731b1014ce9",
      "tree": "d514bac89e2dbc2139eca2ba340980cc4fb59a59",
      "parents": [
        "b06c04280290cf6f15b94ae6317da771d1ce19e7"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:38:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:38:11 2026"
      },
      "message": "Sync generated proto files (#6699)\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": "b06c04280290cf6f15b94ae6317da771d1ce19e7",
      "tree": "02d71188dc54492169df3902b7f11907f55dc840",
      "parents": [
        "96c76d5ad9a352a216577082de11fed9fa68e561"
      ],
      "author": {
        "name": "Nicolò Mazzucato",
        "email": "nicomazz@google.com",
        "time": "Tue Jul 14 08:37:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 08:37:15 2026"
      },
      "message": "Migrate CUJ render thread boundaries to stdlib (#6596)\n\nPart of the stdlib jank tables migration: old tables are maintained so\nno pipeline that relies on them break"
    },
    {
      "commit": "96c76d5ad9a352a216577082de11fed9fa68e561",
      "tree": "0d126404f32631c66cccf4915b6d1a002cecae11",
      "parents": [
        "4de268918fb07ffcbdad58660a9f5ae6fdcd1363"
      ],
      "author": {
        "name": "Ryan Zuklie",
        "email": "rzuklie@google.com",
        "time": "Mon Jul 13 20:04:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 20:04:31 2026"
      },
      "message": "Use SparseCounterTracker in CPU per UID module (#6696)\n\nThis moves the bulk of the work to tokenization which allows the\nSparseCounterTracker to emit events for sorting. This removes\nunnecessary points to reduce trace memory and speed up queries."
    },
    {
      "commit": "4de268918fb07ffcbdad58660a9f5ae6fdcd1363",
      "tree": "c944e56988bc49b1a959b5273c22103c94498df1",
      "parents": [
        "0b6612cc36d6378ae277996165fc17d48c9ef48d"
      ],
      "author": {
        "name": "Ryan",
        "email": "rsavitski@google.com",
        "time": "Mon Jul 13 17:31:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 17:31:36 2026"
      },
      "message": "perfetto_cmd: add --txt-lossy that skips unknown fields (#4043)\n\nProtobufs are a good choice for configuration due to having well-defined\nsemantics for unrecognised fields. However it\u0027s easier for humans to\ndeal with the textproto represenation. We currently offer the --txt flag\nin perfetto_cmd so that it performs the serialisation (instead of having\nthe user figure out how to serialise the protobuf), however that\ndefaults to rejecting any unrecognised field.\n\nThis patch adds --txt-lossy as an alternative, which serialises the\ntextproto while skipping unrecognised fields and enum values. This helps\nrun new configs on older builds of perfetto, since most of our config\nchanges are already shaped to support backwards compatibility.\n\nPre-serialised configs continue to be preferred for\nprogrammatic/production use.\n\nNotes:\n* It\u0027d be nice to still print which fields got skipped, but that\nrequired quite a bit of plumbing back to the original caller. But I can\nbe convinced that the value is worth the boilerplate.\n* I wonder if we should start accepting numerical indices for enums\n(instead of only LABEL_NAME), I believe that\u0027s accepted by proto3\nserialisers."
    },
    {
      "commit": "0b6612cc36d6378ae277996165fc17d48c9ef48d",
      "tree": "ad11cdd6b934e2f513b70614a20819025ee8a1d7",
      "parents": [
        "43924e6e4edbbc6eee0bddeeeb0aa846c1969495"
      ],
      "author": {
        "name": "David Reveman",
        "email": "reveman@meta.com",
        "time": "Mon Jul 13 16:21:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 16:21:22 2026"
      },
      "message": "tp: fix dropped traces when merging same-remote-machine files (#6687)"
    },
    {
      "commit": "43924e6e4edbbc6eee0bddeeeb0aa846c1969495",
      "tree": "44ee7d0daa6cdc62bf00939a3e3313fb5c87a25e",
      "parents": [
        "4f2c163974d699295f4b12ab50139c7a1d69f7f6"
      ],
      "author": {
        "name": "Ryan Zuklie",
        "email": "rzuklie@google.com",
        "time": "Mon Jul 13 16:18:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 16:18:06 2026"
      },
      "message": "Add a tracker to write counters only when changed. (#6675)\n\nSparseCounterTracker helps efficiently write counter events into a trace\nby omitting values not necessary to recreate the same track. Consider\nthis:\n\n```\nA     B     C     D     E\n^-----^-----^-----^-----^\n1     2     2     2     3\n```\n\nIt is possible to fully represent this sequence by ommitting the point\n`C`. While the value is unchanged at point `D`, if we don\u0027t emit the\npoint `D`, then it would appear as though the value increase by 1\nbetween `B` and `E`.\n\nDue to the ordering requirements, this is designed to work during the\ntokenization phase and writes into the sorter to guarantee the events\npushed to the track are pushed in order."
    },
    {
      "commit": "4f2c163974d699295f4b12ab50139c7a1d69f7f6",
      "tree": "f66a28f81c8702858a8249e2961b9ff382b688ac",
      "parents": [
        "b0ada615a411f8bfb01063e18698400a7b943517"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Mon Jul 13 14:52:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:52:28 2026"
      },
      "message": "tp: add experimental_slice_layout benchmark (#6692)"
    },
    {
      "commit": "b0ada615a411f8bfb01063e18698400a7b943517",
      "tree": "2ab5f46ac4785b85a75434e0bc088f748bd2ed07",
      "parents": [
        "7bb60c8e9fb9f5f2f5e57e509a729f56e3485de1"
      ],
      "author": {
        "name": "BogdanLionte",
        "email": "bogdan.lionte1997@gmail.com",
        "time": "Mon Jul 13 14:38:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:38:38 2026"
      },
      "message": "perfetto: add passthrough proto group to gen_bazel (#6693)"
    },
    {
      "commit": "7bb60c8e9fb9f5f2f5e57e509a729f56e3485de1",
      "tree": "68f9f81d3d714e4530c4e39be238e561bef5e6c1",
      "parents": [
        "422547846be85e3b63106dac438e79c302da40de"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Mon Jul 13 13:59:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 13:59:50 2026"
      },
      "message": "tp: pack merged slice layout tallest-first (#6686)\n\nexperimental_slice_layout packs the stalactites of merged tracks into\nrows.\nIt processed groups in start-timestamp order and placed each at the\nlowest non-colliding row. A wide, shallow box that starts before\na deep call tree would grab a low row and wedge the tree, pushing the\nentire subtree down. This is undesirable because it makes the tree\ndeeper than it needs to be.\n\nInstead, place groups tallest first so tall trees claim\nlow rows and wide shallow boxes settle to the outside. When every box\nhas the same height this reduces to start-ts order, so single-depth and\nuniform async tracks are unchanged.\n\nBug: #6656"
    },
    {
      "commit": "422547846be85e3b63106dac438e79c302da40de",
      "tree": "bc633cfd4df15fc23d0fb426fdb7c0a23f17045b",
      "parents": [
        "22d51bdef2891a7e1380254e65c7b4590fed7e28"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Mon Jul 13 13:24:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 13:24:33 2026"
      },
      "message": "tp: Update statsd atoms.descriptor (#6689)\n\nRegenerated via tools/update-statsd-descriptor and\ntools/gen_merged_protos."
    },
    {
      "commit": "22d51bdef2891a7e1380254e65c7b4590fed7e28",
      "tree": "0480253dc4d9b0932dd10106382645de9f6643c3",
      "parents": [
        "3782d68aaaa72282fa7596af1fbb4545bd31b1cc"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Jul 13 13:13:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 13:13:17 2026"
      },
      "message": "ui: Don\u0027t attempt to render the timeline canvas when its size is 0 (#6690)\n\nWhen looking at another page after visiting the timeline page, we get a\nflurry of`GL_INVALID_VALUE : glScissor: width \u003c 0` errors printed to the\nconsole. This might be hiding other errors or causing issues itself.\n\nThis patch adds an early exit from the render function if the canvas\nsize is 0.\n\nFixes: b/534259857"
    },
    {
      "commit": "3782d68aaaa72282fa7596af1fbb4545bd31b1cc",
      "tree": "d4d49aaba7ed153c3293d9b79fafb7a50ed79391",
      "parents": [
        "4cad1fb56bb9217ec9aebc16d0e29239dd681443"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Mon Jul 13 12:41:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 12:41:53 2026"
      },
      "message": "ui: SQL editor syntaqlite Lsp integration  (#6237)\n\nAdds an opt-in dev.perfetto.SqlEditorIntelligence plugin that wires the\nQueryPage editor to syntaqlite\u0027s in-process LSP server\n(wasm_lsp_message)\nthrough the stock @codemirror/lsp-client. The stock extensions provide\ncompletion, diagnostics, hover docs, signature help, go-to-definition,\nreferences, and rename; our side is loading the WASM engine + dialect,\na small in-memory transport, and feeding the stdlib schema via the\nsyntaqlite/setSessionContext extension request.\n\n- The WASM runtime + dialect load once; each trace gets its own WASM\n  session, disposed on trace unload. An LSP server accepts exactly one\n  initialize, so sharing a session would reject the next trace\u0027s client\n  handshake.\n- Editor widget: new generic `extensions` prop, held in a Compartment so\n  late-registering plugins reconfigure already-mounted editors (plugin\n  onTraceLoad can run seconds after the query page first renders).\n- QueryPage: editor intelligence is a per-tab factory - every query tab\n  stays mounted, and the LSP workspace requires one document per view.\n  The factory memoizes per document; a fresh extension identity would\n  close and reopen the server document on every redraw.\n- SqlModules: expose waitForSqlModules() so consumers can await the\n  module catalog instead of polling.\n- @codemirror/autocomplete is version-overridden so basicSetup and the\n  LSP client resolve one shared instance; two copies each render their\n  own completion popup.\n\nKnown gap: unknown_function diagnostics flag every stdlib call (the\nserver\u0027s function catalog is SQLite built-ins only). Left visible\npending upstream support for declaring functions in the session\ncontext."
    },
    {
      "commit": "4cad1fb56bb9217ec9aebc16d0e29239dd681443",
      "tree": "12bc9a71e00cff3dd9ee4a84b5cae3c783dfd05e",
      "parents": [
        "c1ecd10e294c254759bb0af02b4fff330c22be46"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Jul 13 10:46:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 10:46:54 2026"
      },
      "message": "ui: Add status field to allow plugins to be marked experimental (#6684)\n\nAdd a status field to plugins to indicate maturity \u0026 add warning in the\nplugins page. Also apply the experimental status to the memscope and\nintelletto plugins."
    },
    {
      "commit": "c1ecd10e294c254759bb0af02b4fff330c22be46",
      "tree": "e1fb79c1c97b38bafa3d39879d66a8e187d3686b",
      "parents": [
        "d6f33ca80ef5a5597b1a2de0bbef16067e75d7ae"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Jul 13 09:04:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 09:04:53 2026"
      },
      "message": "infra: Update node to latest 22.x version (#6672)\n\n- Add roll_node script to download the official node releases and\noptionally upload to our gs bucket.\n- Update node to latest 22.x version - 22.32 (v22 is what google3 uses).\n\nb/531691563"
    },
    {
      "commit": "d6f33ca80ef5a5597b1a2de0bbef16067e75d7ae",
      "tree": "bf8d27df9a3168de81bfc10cb17d0f293bd5c0d1",
      "parents": [
        "adb8222aaab1ffeaaa4ab48f686003df54dcc5fd"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Sun Jul 12 16:41:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 16:41:38 2026"
      },
      "message": "docs: document trace compression (zstd/deflate) config (#6674)\n\nAdd a \u0027Compressing the trace\u0027 section to the Trace Configuration concept\npage covering the new TraceConfig.compression field: selecting the zstd\nor deflate codec, tuning the zstd level, targeting old and new services\nwith one config, the deprecated compression_type fallback, and reading\ncompressed traces.\n\nCross-link the SDK optional-features table, adding a\nPERFETTO_SDK_ENABLE_ZSTD row and a forward-link to the new section."
    },
    {
      "commit": "adb8222aaab1ffeaaa4ab48f686003df54dcc5fd",
      "tree": "45a78544582de277e8a34f1daaf621054b8efd08",
      "parents": [
        "d8b33f5ecf8ac28f6f0a69d64df0e33c5d583b20"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Sun Jul 12 14:13:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 14:13:48 2026"
      },
      "message": "Sync generated proto files (#6681)\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": "d8b33f5ecf8ac28f6f0a69d64df0e33c5d583b20",
      "tree": "780d0d370478e4b76d0eaea5180799d7952b96a6",
      "parents": [
        "2525ed1a3c9abc0298e91b65f8115ba8b5e8dd3a"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Fri Jul 10 18:33:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 18:33:22 2026"
      },
      "message": "tp+ui: show concurrent tracing sessions as state tracks (#6647)\n\nTurn the ConcurrentSessionEvent packets emitted by traced into one state\ntrack per concurrent session.\n\n- Add ConcurrentSessionsModule: tracks are keyed by session id and named\nby unique_session_name (\"Session \u003cid\u003e\" when unnamed, a \" (clone)\" suffix\nfor cloned sessions). STATE_DISABLED closes the track instead of drawing\nan open-ended state. consumer_uid and num_data_sources become args;\nunknown states are recorded in the trace import logs.\n- UI: register the tracks as state tracks, grouped under System \u003e\nConcurrent tracing sessions.\n- Add TP diff tests."
    },
    {
      "commit": "2525ed1a3c9abc0298e91b65f8115ba8b5e8dd3a",
      "tree": "66974b2262f4870d5ffbcb8b90da06ce42c2c666",
      "parents": [
        "dc76e21e5cfe89353b92ccef3dceeaa895801372"
      ],
      "author": {
        "name": "Primiano Tucci",
        "email": "primiano@google.com",
        "time": "Fri Jul 10 18:25:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 18:25:18 2026"
      },
      "message": "ui: Add TraceDoctor in Overview page and details panel (#6642)\n\n- Add general plumbing of the newly created trace\n  diagnostics feature in the overview page.\n- If there is any high severity diagnostic, also\n  show it in the details panel on trace load.\n\nhttps://screenshot.googleplex.com/4wpVzAUJ9LaGxvZ\nhttps://screenshot.googleplex.com/AymHpZhJCop2Cro\nhttps://screenshot.googleplex.com/8xppDw7eEBJuD9G\nhttps://screenshot.googleplex.com/Bx2CowVuzx6uog3\n\nBug: b/512176619"
    },
    {
      "commit": "dc76e21e5cfe89353b92ccef3dceeaa895801372",
      "tree": "ce24c25e0e481054d3ba11b4cb2e9f8a80aecb1b",
      "parents": [
        "a1d66f2e4e4ea7646ebde41dc4fc9e758c86015b"
      ],
      "author": {
        "name": "Primiano Tucci",
        "email": "primiano@google.com",
        "time": "Fri Jul 10 17:56:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 17:56:27 2026"
      },
      "message": "tp: remove compact_sched rule from TraceDoctor (#6676)"
    },
    {
      "commit": "a1d66f2e4e4ea7646ebde41dc4fc9e758c86015b",
      "tree": "deb4aeb557be1b1f6135bfc013d26f7efb7ea222",
      "parents": [
        "411d1509ac495fa629879994dcc19a7721c13466"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Fri Jul 10 17:45:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 17:45:38 2026"
      },
      "message": "perfetto: list other tracing sessions in trace (#6627)\n\nOptionally record the lifecycle state changes of *other* tracing\nsessions active while a trace is being recorded, to help diagnose\nfield issues caused by unexpected concurrent sessions.\n\n- Add the ConcurrentSessionEvent packet: state (mirrors the service\u0027s\n  session state machine), unique_session_name, service-local session\n  id (deliberately not the trace UUID), consumer uid and number of\n  data sources.\n- Route every session state change through a single SetSessionState()\n  helper. It broadcasts the change into the other opted-in sessions\n  that are still recording (i.e. CONFIGURED, STARTED or\n  DISABLING_WAITING_STOP_ACKS; read-only clones and already-disabled\n  sessions are skipped), appending to a bounded per-session buffer\n  that is drained on ReadBuffers().\n- On creation, a session snapshots the current state of the other\n  active sessions, so its trace records what was already running when\n  it started. Each event is timestamped with when that session entered\n  its current state.\n- Cloned sessions inherit the source\u0027s events and record a terminal\n  DISABLED on teardown.\n- Opt-in via\n  TraceConfig.BuiltinDataSource.enable_concurrent_session_events.\n- Add service unittests."
    },
    {
      "commit": "411d1509ac495fa629879994dcc19a7721c13466",
      "tree": "c7f648720928f5d1a489b4db2b9d195ce6350816",
      "parents": [
        "03b21f72ca8d2a0111aeebad5c3f29abe60a6454"
      ],
      "author": {
        "name": "Safayat Ullah",
        "email": "safayat@google.com",
        "time": "Fri Jul 10 16:31:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 16:31:47 2026"
      },
      "message": "ui: Wrap errors in CommandError for command execution (#6612)\n\nWhen a query crashes in the UI, it can be hard to know who to triage the\nissue to if the query was executed by a plugin or a custom macro.\n\nThis change catches any error thrown during command execution and wraps\nit in a CommandError containing the command\u0027s metadata (ID, name,\nsource) and the original error as its cause.\n\nIf commands are nested (e.g. a macro running a plugin command),\nCommandError instances stack recursively. The toString() implementation\nformats the full execution chain down to the root query crash, revealing\nexactly which macro/plugin triggered the query failure in the crash\nreport.\n\nBug: 504577537"
    },
    {
      "commit": "03b21f72ca8d2a0111aeebad5c3f29abe60a6454",
      "tree": "3866c5d58e77835dee317737cb3538b6274d0138",
      "parents": [
        "9e9bdbb28fea3c7367690de24fdd40e17b228804"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Jul 10 15:08:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 15:08:34 2026"
      },
      "message": "tp: add a Notices severity and surface ftrace setup errors on it (#6658)\n\nIntroduce a kNotice stat severity for conditions that are normal but\nnoteworthy: not a bug, not corruption, and not data loss, but still\nworth showing to the user. It slots between kInfo and kDataLoss.\n\nReclassify to kNotice the stats that fire when packets are skipped\nbecause incremental state is invalid (ftrace setup failures and the\nthread-descriptor / track-event / interned-data skips caused by packet\nloss at the start of a trace). These were previously either invisible\nkInfo counters or, worse, kError counters that made trace_processor\nraise on a normal recording condition.\n\nConvert ftrace_setup_errors from a concatenated metadata blob into\nper-error trace import logs, each carrying the message as an arg, and\ndrop the metadata::ftrace_setup_errors key. This matches how other\nproducer-reported errors are recorded and gives structured, queryable\nrows instead of one string.\n\nOn the UI, add a Notices tab to the trace info page that renders\nseverity\u003d\u0027notice\u0027 categories with their detailed import logs, extracting\nthe shared category+logs rendering out of the Import Errors tab into a\nreusable component so both tabs share it. The topbar error badge counts\nonly error/data_loss stats so notices do not flag as errors, and the\nlogs grid sizes rows to their content so multi-line messages are not\nclipped."
    },
    {
      "commit": "9e9bdbb28fea3c7367690de24fdd40e17b228804",
      "tree": "552b9d9340afe3ffabb2c536deeb47d39258f5bf",
      "parents": [
        "eb272e6d68abe4a7b49646819378049ec510db1f"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Fri Jul 10 14:37:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:37:40 2026"
      },
      "message": "ui: Ensure Core settings are at the top (#6667)\n\nIt seems like currently Core is not ordered at the top, as the sorting\nlogic currently checks for falsy values as opposed to the CORE_PLUGIN_ID\nafter some refactoring. This PR adds back the comparison except to the\nname \u0027Core\u0027 through a new constant CORE_GROUP.\n\nBug: 6666"
    },
    {
      "commit": "eb272e6d68abe4a7b49646819378049ec510db1f",
      "tree": "d8f05a4719dc95c94b63410b7a22935cf948e5fe",
      "parents": [
        "8e5b19ebbe569de8bac2744f0880a01328141008"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Jul 10 14:32:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:32:50 2026"
      },
      "message": "ui: add textarea for arbitrary ftrace events (#6662)\n\nFixes: https://github.com/google/perfetto/issues/5907"
    },
    {
      "commit": "8e5b19ebbe569de8bac2744f0880a01328141008",
      "tree": "a1252a3bd05c94acee058d734e421607b9848f92",
      "parents": [
        "371815d104a790ff415db6ea799f3274675e9e10"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Jul 10 14:09:02 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:09:02 2026"
      },
      "message": "ui: Fail loudly on webgl context loss (#6665)\n\nThrow an error when any of the webgl contexts is lost in any of the\nvirtual overlay canvases.\n\nFixes b/533369431"
    },
    {
      "commit": "371815d104a790ff415db6ea799f3274675e9e10",
      "tree": "5cf858f02029007be69d93c95c9565817447b0db",
      "parents": [
        "9f47fbc06e7e7a54f60f818616c24ee52a5a651a"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Fri Jul 10 13:35:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 13:35:47 2026"
      },
      "message": "docs: merge Android boot \u0026 OOM pages into recording cookbook (#6661)\n\n- Add getting-started/android-trace-recording.md cookbook\n- Cover boot tracing and OutOfMemoryError heap dumps as recipes\n- Remove case-studies/android-boot-tracing.md\n- Remove case-studies/android-outofmemoryerror.md\n- Repoint inbound links to the new page\n- Update toc.md"
    },
    {
      "commit": "9f47fbc06e7e7a54f60f818616c24ee52a5a651a",
      "tree": "3f1f2aead6a310f526d40032a465cd19410ce1a4",
      "parents": [
        "d9fc9582ce5f6263446f88be9a964a13713b381c"
      ],
      "author": {
        "name": "ilkos",
        "email": "ilkos@google.com",
        "time": "Fri Jul 10 13:06:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 13:06:47 2026"
      },
      "message": "Add OOME-related stats to heap_graph_stats (#6663)\n\nChange-Id: I9f199c93a196c7f962fb4ca67e427ca6d240f855"
    },
    {
      "commit": "d9fc9582ce5f6263446f88be9a964a13713b381c",
      "tree": "2cfee125fa7bc4c9541490ca46dac8e5db7741ab",
      "parents": [
        "29532c2a074b0302cb969787c203b9f4a2bb4a18"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Fri Jul 10 12:46:05 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:46:05 2026"
      },
      "message": "perfetto: fully reinitialize getopt state before cmdline parsing (#6660)\n\nParseCmdlineAndMaybeDaemonize reset getopt with optind \u003d 1, which on\nglibc does not reinitialize the parser\u0027s internal state (nextchar and\nthe argv permutation markers); the documented way to rescan is optind \u003d\n0 (NOTES in `man 3 getopt`).\n\nAny earlier getopt user in the same process (the bugreport snapshot\nthread re-parse, or other tests in perfetto_unittests such as\nGetoptCompatTest, which drives the real glibc getopt) leaves state\nbehind that can misparse the next cmdline.\n\n\nReset optind \u003d 0 on glibc and getopt_compat, and optind \u003d 1 plus\noptreset on macOS, following the existing\n\nhttps://crsrc.org/c/third_party/perfetto/src/base/getopt_compat_unittest.cc;l\u003d73-79\nAlso null-terminate the argv built by the test helper, as getopt expects\nargv[argc] \u003d\u003d nullptr."
    },
    {
      "commit": "29532c2a074b0302cb969787c203b9f4a2bb4a18",
      "tree": "7a6dcf4e8c977121ca1ecbe974f487ce2390d765",
      "parents": [
        "1e59e98f7f1c90d8c4094e7b691222582c539cb7"
      ],
      "author": {
        "name": "Ryan",
        "email": "rsavitski@google.com",
        "time": "Fri Jul 10 12:42:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:42:41 2026"
      },
      "message": "tools/record_android_trace: fix reconnects and \"sh\" spam (#6593)\n\nThe script currently spawns a new adb shell every 0.5s, which pollutes\ntraces visually, and adds unnecessary noise to the system itself.\nAdditionally, the script advertises to support reconnects, but bails out\ntoo early to be practical.\n\nAddress both points while working around mksh\u0027s limitations. I didn\u0027t\nwant to change the original perfetto invocation, so the changes are to\nthe waiting adb command. We now use \"read -t\" as a mksh-builtin sleeping\nmechanism, with a pipe forwarded from adbd\u0027s stdin to give something for\nthe read to block on.\n\nTested on newest device and emulator64_x86_64:12/SE2A.230906.003."
    },
    {
      "commit": "1e59e98f7f1c90d8c4094e7b691222582c539cb7",
      "tree": "11db3f2665ea6fb9e0a88daa0ee89dea5df024b4",
      "parents": [
        "24e3cd5b2b64b42d230b9554875549f28d3c64d0"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Fri Jul 10 12:31:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:31:53 2026"
      },
      "message": "perfetto: unify trace attributes across config, packets and manifest (#6651)\n\nTrace attributes (key/value pairs describing a trace) could only be\nwritten as TraceAttributes packets. Unify the other ways of attaching\nthem on the same message and query surface:\n\n* Replace TraceConfig.notes and `perfetto --add-note` with\n  TraceConfig.trace_attributes and `--add-attribute`, embedding the\n  TraceAttributes message in the config. Notes were never parsed by\n  trace_processor so nothing can depend on them; field 46 is reserved.\n* Ingest config attributes through the same path as TraceAttributes\n  packets; both become trace_attribute.\u003ckey\u003e rows of the metadata\n  table.\n* Let perfetto_manifest files annotate an archive (top-level or\n  per-file) with an `attributes` section, stored as\n  manifest_attribute.\u003ckey\u003e rows: a separate namespace because they\n  annotate the archive, not the recorded trace.\n* Make SetDynamicMetadata update duplicate keys in place so \"last\n  value wins\" actually holds. Chrome importers keep their historical\n  insert-always behavior via a new AppendDynamicMetadata.\n* Show both namespaces as sections on the UI\u0027s trace info page;\n  update docs; add unit and diff tests for all paths.\n\nFixes: https://github.com/google/perfetto/issues/3495"
    },
    {
      "commit": "24e3cd5b2b64b42d230b9554875549f28d3c64d0",
      "tree": "3a870d8df502d06155dcee37b62e9518f1466b2d",
      "parents": [
        "b723dbf515dc7efb39b4ecb315b9ef86d1c3744b"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Jul 10 12:26:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:26:29 2026"
      },
      "message": "tracing: fix flaky test (#6659)"
    },
    {
      "commit": "b723dbf515dc7efb39b4ecb315b9ef86d1c3744b",
      "tree": "c32c348de4df2eb4374d65a7e51f729a7386d36c",
      "parents": [
        "a46bc5a9c616bb82bdbf7e54205a722f4994906a"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Jul 10 11:54:58 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 11:54:58 2026"
      },
      "message": "ui: improve overview page for multiple traces and machines (#6649)\n\nAlso add realtime definiition to trace\n\nFixes: https://github.com/google/perfetto/issues/6599"
    },
    {
      "commit": "a46bc5a9c616bb82bdbf7e54205a722f4994906a",
      "tree": "82c2c2bbc24d0595b748ce5bbf2b66e279b0dbb9",
      "parents": [
        "aefaf53824b5572d46bbd5f2156825527d15dc25"
      ],
      "author": {
        "name": "copybara-service[bot]",
        "email": "56741989+copybara-service[bot]@users.noreply.github.com",
        "time": "Fri Jul 10 11:24:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 11:24:21 2026"
      },
      "message": "Copybara import from Chromium: proto and stdlib changes (#6648)\n\nCopybara import from Chromium: proto and stdlib changes\n\n- c63946248183e14b10b4bb56dce2ea98bb4d4f0f Tag WebUI processes in\ntracing by Olivier Li Shing Tat-Dupuis \u003colivierli@google.com\u003e\n- bb15f565a1d03a6775618753f8c648c717a64c36 Clarify difference between\nabs_total_raw_delta_pixels and... by Petr Čermák\n\u003cpetrcermak@chromium.org\u003e\n- 6c6be8d66dfd1c89dfbe36eac8a8a4c1b1a11893 [Scroll jank v4 metric] Track\nsigned total raw delta inst... by Petr Čermák \u003cpetrcermak@chromium.org\u003e\n- d40c7dbce9b721e32f2befa0d8cd8a0811384995 Sync feature protos. by\nGoogler \u003cnoreply@google.com\u003e\n\nCOPYBARA_IMPORT\u003dProject import generated by Copybara.\n\nGitOrigin-RevId: c63946248183e14b10b4bb56dce2ea98bb4d4f0f\n\nCo-authored-by: Perfetto Team \u003ccopybara-servicebot@google.com\u003e"
    },
    {
      "commit": "aefaf53824b5572d46bbd5f2156825527d15dc25",
      "tree": "f300879117a4901a780d2b710934b0aa886e024f",
      "parents": [
        "bbd634dd6df521385e8f1ce6c043902c10468c83"
      ],
      "author": {
        "name": "BogdanLionte",
        "email": "bogdan.lionte1997@gmail.com",
        "time": "Fri Jul 10 11:15:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 11:15:30 2026"
      },
      "message": "proto_merger: allow passthrough fields (#6628)"
    },
    {
      "commit": "bbd634dd6df521385e8f1ce6c043902c10468c83",
      "tree": "ce36d388eb35a979589094d71b2a6cb873532fe1",
      "parents": [
        "40ad5afd4e1f120609ab0851caffd5c98a3b416a"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Jul 10 10:56:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 10:56:36 2026"
      },
      "message": "tp: fix quadratic blowup in android_monitor_contention_chain (#6640)\n\nandroid_monitor_contention_chain joined the two already fanned-out\n_children and _parents tables on a non-unique id and then deduplicated\nthe result with a UNION (temp b-tree). On traces where contention nodes\nhave many parents and many children this materialised the full\nparent x child cross product. On one ~40k contention trace the chain\nexpanded to 52.5M wide rows and took over two minutes (the base\nandroid_monitor_contention table itself builds in ~1.6s), effectively\nhanging both android_monitor_contention and\nandroid_monitor_contention_chain.\n\nRestructure the chain so each node is emitted once per parent (parent_id\nis preserved in full, which is what the lock graph and DAG\nreconstruction actually consume) with a single representative child_id\nattached, instead of the parents x children cross product. _parents and\n_isolated are replaced by a _child_of lookup, and _children is ordered\nby id so the join binary-searches the sorted column instead of scanning.\n\nThis is identical to the previous behaviour whenever a node blocks at\nmost one other slice (the common case); it only collapses the duplicate\nrows a node with multiple children previously produced. The lock graph\noutput is unchanged. The android_monitor_contention metric golden is\nupdated accordingly.\n\nOn the repro trace the chain drops from 52.5M rows / \u003e2min to 1.3M rows\n/ ~5s.\n\n---------\n\nCo-authored-by: Primiano Tucci \u003cprimiano@google.com\u003e"
    },
    {
      "commit": "40ad5afd4e1f120609ab0851caffd5c98a3b416a",
      "tree": "c8cbd9444d9c1525b5ce57545fe60c18bbbc0fed",
      "parents": [
        "5d792c4f8618fe9d2e35448aebf8fa219a713eaf"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Fri Jul 10 09:55:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:55:16 2026"
      },
      "message": "ui: Replace deltas with durations in AndroidInputLifecycle (#6566)\n\nThe raw duration is more useful in understanding the latency of stages\nrather than the delta.\n\nBug: 454761692"
    },
    {
      "commit": "5d792c4f8618fe9d2e35448aebf8fa219a713eaf",
      "tree": "b7a03ead88515f02a98c9d765983d184354d8d8a",
      "parents": [
        "1ca9bb073a5834d5f4e475d9b150dbe28c8c05d9"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Jul 10 08:09:19 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:09:19 2026"
      },
      "message": "tp: expose Chrome JSON top-level metadata (#6653)\n\nThe top-level \"metadata\" dictionary of a Chrome JSON trace was\nsilently skipped by the tokenizer, so fields such as startTime,\ncpuThrottling, networkThrottling and hardwareConcurrency were not\nqueryable via the metadata table.\n\nParse that dictionary once the full object is buffered and add each\nfield to the metadata table under the \"json_metadata.\" prefix using\ndynamic (trace-scoped) metadata. Integers and booleans map to\nint_value, strings and non-integral numbers to str_value, and nested\nobjects/arrays are stored as their raw JSON text. Null fields are\ndropped.\n\nAdd a \"JSON Metadata\" section to the trace info page metadata tab so\nthese keys are surfaced together under their own heading.\n\nFixes #595."
    },
    {
      "commit": "1ca9bb073a5834d5f4e475d9b150dbe28c8c05d9",
      "tree": "3b6780e2c51614ea92186bec111d3f5f2d0a3ebb",
      "parents": [
        "7d3e789d79e542d7f7fc7e337bb3ae01e0e7e516"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 09 23:36:23 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 23:36:23 2026"
      },
      "message": "tp: fix ubsan crash in proto trace reader tests (#6652)"
    },
    {
      "commit": "7d3e789d79e542d7f7fc7e337bb3ae01e0e7e516",
      "tree": "05e48dd73ebc566fd727a4b656e0d1bda1dd2778",
      "parents": [
        "75f284c5172e11960194a7dd1db3ca0566b2a0c4"
      ],
      "author": {
        "name": "carlscabgro",
        "email": "77778393+carlscabgro@users.noreply.github.com",
        "time": "Thu Jul 09 23:17:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 23:17:14 2026"
      },
      "message": "tp: Defer parsing of extra descriptors until TrackEvent descriptors have been registered (#6528)\n\n# What\nDefer parsing of extra descriptors until TrackEvent descriptors have\nbeen registered. This is an intermediate fix until we work out a\nhierarchy of exactly what should happen when with respect to descriptor\nhandling.\n\n\n# Why \n#6260 \n- Extension descriptors are processed before the TrackEvent descriptor\n- Descriptor processing skips allready processed files\n- TrackEvent descriptor is added with merge\u003dfalse\n\nThis means that in order to add a new extension descriptor, you need to\nalso pass the TrackEvent description in the same FileSet. This means\nthat when the \"real\" TrackEvent is added to the pool it is skipped,\nbecause the \"track_event.proto\" file has been already processed. So we\nmight have a newer or (worse) older proto definition loaded. If the\nextension descriptor were to ship a stripped version fo the TrackEvent\n(with a dummy file name and defining only the extension range) once the\nreal TrackEvent descriptor is added (no file name match this time) we\nget an error because the TrackEvent is already defined and it is being\nadded with merge\u003dfalse."
    },
    {
      "commit": "75f284c5172e11960194a7dd1db3ca0566b2a0c4",
      "tree": "b9848f799fd7d3c1f6f2bf8c498bd5ea3a7eb81f",
      "parents": [
        "f546dea589f7b5fe9c6569c6af5306b6cf20cd76"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Jul 09 22:58:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 22:58:35 2026"
      },
      "message": "ui: restructure trace info page metadata and stats tabs (#6602)\n\nThe trace info page had a single \"Info and Stats (advanced)\" tab that\ndumped the metadata table and the stats table together, with a hardcoded\npriority allowlist for a handful of Chrome keys.\n\nSplit this into two purpose-built tabs:\n\n- A new \"Metadata\" tab that groups the metadata table into curated\n  sections (Trace, Device \u0026 OS, Benchmark, Chrome), each with a short\n  description, and an \"Other\" catch-all for everything else. When\n  nothing matches a curated section the \"Other\" header is dropped and\n  the entries render as a plain list. Keys are matched by name or\n  namespace prefix, replacing the previous cr-* allowlist.\n  trace_config_pbtxt is hidden as it belongs on the Trace Config tab.\n\n- The remaining stats table becomes its own \"Statistics\" tab.\n\nBoth tabs now render through the Grid widget with a dense styling\nvariant and a bold key column, replacing the hand-rolled HTML tables.\nThe combined \"Info and Stats (advanced)\" tab is removed."
    }
  ],
  "next": "f546dea589f7b5fe9c6569c6af5306b6cf20cd76"
}
