)]}'
{
  "log": [
    {
      "commit": "d3b1841f171c17161cb4faa1489052a09d8545d9",
      "tree": "3815d29b8a874a0ed97ae86b0668b060fe1c3ff5",
      "parents": [
        "dd88ac7f410629a3f06cd94c1b3810efa3d06c77"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Sep 11 14:36:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 13:36:11 2026 +0000"
      },
      "message": "ui: Improve URL state management in memory overview page (#7353)\n\nAdd a few improvements to the URL state management in the memory\noverview page.\n\n- The active tab (\u0027summary\u0027 or \u0027smaps\u0027, defined by MemoryOverviewTab) is\nnow encoded in the route (e.g. `#!/memoryoverview/\u003cupid\u003e/smaps`) and\ncontrolled via callbacks rather than local state.\n- Auto-redirect to the \u0027best\u0027 process using `location.replace()` when a\nupid is omitted from the URL rather than just showing it - e.g.\n`#!/memoryoverview/\u003cbestUpid\u003e`. This keeps the URL in sync with what the\nuser is seeing.\n- Small refactor:\n  - Refactor process stats logic out into a separate file.\n  - Rename landing_page.ts/scss to memory_overview_page.ts/scss."
    },
    {
      "commit": "dd88ac7f410629a3f06cd94c1b3810efa3d06c77",
      "tree": "cd303eea9b8838fc569c4be61d98808e802c5d42",
      "parents": [
        "71d4f3c9432450b01d161c04592f5754c9eb910c"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Sep 11 13:51:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 12:51:16 2026 +0000"
      },
      "message": "ui: Strip trailing semicolons from debug track queries (#7422)\n\nDebug track queries are nested inside a CTE, so a user supplied query\nwith a trailing semicolon (e.g. \"select * from slice;\") resulted in a\nSQL syntax error and an error report dialog.\n\nStrip trailing whitespace and semicolons from the query before embedding\nit, and treat a query which consists of nothing but whitespace and\nsemicolons (e.g. just hitting enter at the prompt) as a cancellation\nrather than running a broken query.\n\nFixes: b/559299841"
    },
    {
      "commit": "71d4f3c9432450b01d161c04592f5754c9eb910c",
      "tree": "2cdc1c4bdaef6ff30f3311925ba957ccc2bcb042",
      "parents": [
        "7af4ec945cd5a93c6fe6bb16dbc8293dfd071ff8"
      ],
      "author": {
        "name": "Parth Sane",
        "email": "parthsane@gmail.com",
        "time": "Fri Sep 11 11:25:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 11:25:45 2026 +0100"
      },
      "message": "perfetto: expose flush reason and flags in shared lib C ABI (#7370)\n\nExpose the flush reason (PerfettoDsFlushReason) and raw 64-bit flush\nflags via PerfettoDsOnFlushArgsGetReason() and\nPerfettoDsOnFlushArgsGetFlags() in the public shared library C ABI.\n\nThis allows producers (such as the Android platform Perfetto data source\nbindings) to distinguish between periodic flushes, session stops, and\nclone snapshots (kTraceClone)."
    },
    {
      "commit": "7af4ec945cd5a93c6fe6bb16dbc8293dfd071ff8",
      "tree": "8282e74e30820c9834628ff2b5b3d1ea7413c248",
      "parents": [
        "824153aa69e115d139c4b5466b1083c53234eb43"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Fri Sep 11 10:20:16 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 13:20:16 2026 +0300"
      },
      "message": "stdlib: add android.cpu.cluster_utilization module (#7351)\n\nAdd `android_cpu_cluster_utilization_in_interval(ts, dur)`, returning\nCPU utilization broken down `by cluster` over an interval, with one row\nper cluster. Clusters which ran nothing in the interval are still\nreported, with zero active time and zero utilization.\n\nClusters are classified via android_cpu_cluster_mapping\n(little/medium/big/unknown) and durations are measured on the `monotonic\nclock`, so time spent with the device suspended is excluded."
    },
    {
      "commit": "824153aa69e115d139c4b5466b1083c53234eb43",
      "tree": "1000b3b281a26aef4e7a5d74c1d1c8fe93f8023d",
      "parents": [
        "6f78923bd6e6f9bfd9078155226f76df8e0a007c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 11 09:49:41 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 09:49:41 2026 +0100"
      },
      "message": "build(deps): bump @vitest/mocker from 4.1.10 to 5.0.0 in /ui in the npm_and_yarn group across 0 directory (#7414)\n\nUpdates `@vitest/mocker` from 4.1.10 to 5.0.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/releases\"\u003e@​vitest/mocker\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev5.0.0\u003c/h2\u003e\n\u003cp\u003eVitest 5 is officially out! This release focuses on performance and\nbrings a lot of new features while fixing long-standing bugs. See our \u003ca\nhref\u003d\"https://vitest.dev/blog/vitest-5.html\"\u003eblog post\u003c/a\u003e for the\nofficial announcement.\u003c/p\u003e\n\u003ch3\u003e   🚨 Breaking Changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReplace \u003ccode\u003eloupe.inspect\u003c/code\u003e with pretty-format  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eClaude Opus 5 (1M context)\u003c/strong\u003e and \u003cstrong\u003eOpenAI\nCodex\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/9609\"\u003evitest-dev/vitest#9609\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/3f802da4b\"\u003e\u003c!-- raw\nHTML omitted --\u003e(3f802)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove quotes from string values in \u003ccode\u003etest.for/each\u003c/code\u003e title\n\u003ccode\u003e$\u003c/code\u003e variable (take 2)  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10170\"\u003evitest-dev/vitest#10170\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/04d37e9d7\"\u003e\u003c!-- raw\nHTML omitted --\u003e(04d37)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDefault \u003ccode\u003eattachmentsDir\u003c/code\u003e from\n\u003ccode\u003e.vitest-attachements/\u003c/code\u003e to \u003ccode\u003e.vitest/attachments/\u003c/code\u003e\n -  by \u003ca\nhref\u003d\"https://github.com/MdSadiqMd\"\u003e\u003ccode\u003e@​MdSadiqMd\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10186\"\u003evitest-dev/vitest#10186\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/1ba7338c3\"\u003e\u003c!-- raw\nHTML omitted --\u003e(1ba73)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove \u003ccode\u003esequential\u003c/code\u003e test/suite options in favor of\n\u003ccode\u003econcurrent\u003c/code\u003e  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e and\n\u003cstrong\u003eOpenAI Codex\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10198\"\u003evitest-dev/vitest#10198\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/9229f2edc\"\u003e\u003c!-- raw\nHTML omitted --\u003e(9229f)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRepresent locator as an object instead of a string  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10212\"\u003evitest-dev/vitest#10212\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/80f07edf6\"\u003e\u003c!-- raw\nHTML omitted --\u003e(80f07)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eInline \u003ccode\u003eexpect\u003c/code\u003e package  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10221\"\u003evitest-dev/vitest#10221\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/ad16223e7\"\u003e\u003c!-- raw\nHTML omitted --\u003e(ad162)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove deprecated entry points  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10222\"\u003evitest-dev/vitest#10222\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/994c6ddb9\"\u003e\u003c!-- raw\nHTML omitted --\u003e(994c6)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire Node.js 22 and Vite 6.4  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10178\"\u003evitest-dev/vitest#10178\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/3876283e8\"\u003e\u003c!-- raw\nHTML omitted --\u003e(38762)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFail \u003ccode\u003eexpect.poll\u003c/code\u003e when function didn\u0027t resolve in time\n -  by \u003ca href\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e\nand \u003cstrong\u003eOpenAI Codex\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10233\"\u003evitest-dev/vitest#10233\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/4df048c11\"\u003e\u003c!-- raw\nHTML omitted --\u003e(4df04)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThrow an error if hoistable methods are outside the top level scope\n -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10460\"\u003evitest-dev/vitest#10460\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/d0b4fddcb\"\u003e\u003c!-- raw\nHTML omitted --\u003e(d0b4f)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etoHaveTextContent\u003c/code\u003e is strict, add\n\u003ccode\u003etoMatchTextContent\u003c/code\u003e as alternative  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10473\"\u003evitest-dev/vitest#10473\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/18f303079\"\u003e\u003c!-- raw\nHTML omitted --\u003e(18f30)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon\u0027t lookup config file from ancestor directories  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eOpenAI Codex\u003c/strong\u003e and \u003cstrong\u003eHiroshi Ogawa\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10428\"\u003evitest-dev/vitest#10428\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/945d9090e\"\u003e\u003c!-- raw\nHTML omitted --\u003e(945d9)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eInline \u003ccode\u003e@vitest/runner\u003c/code\u003e package, do not publish it\nanymore  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10511\"\u003evitest-dev/vitest#10511\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/6d6e46b1e\"\u003e\u003c!-- raw\nHTML omitted --\u003e(6d6e4)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAllow mutating happy-dom/jsdom window object  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eHiroshi Ogawa\u003c/strong\u003e and \u003cstrong\u003eOpenAI Codex\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10373\"\u003evitest-dev/vitest#10373\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/206e8cff8\"\u003e\u003c!-- raw\nHTML omitted --\u003e(206e8)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExpose \u003ccode\u003econcurrencyId\u003c/code\u003e/\u003ccode\u003eworkerId\u003c/code\u003e on\nTestModule\u0027s diagnostics, make id 1-based  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10516\"\u003evitest-dev/vitest#10516\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/bdd985433\"\u003e\u003c!-- raw\nHTML omitted --\u003e(bdd98)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003escreenshotDirectory\u003c/code\u003e config to\n\u003ccode\u003ebrowser.expect.toMatchScreenshot\u003c/code\u003e  -  by \u003ca\nhref\u003d\"https://github.com/macarie\"\u003e\u003ccode\u003e@​macarie\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10592\"\u003evitest-dev/vitest#10592\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/a60ded0fb\"\u003e\u003c!-- raw\nHTML omitted --\u003e(a60de)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate \u003ccode\u003e@sinonjs/fake-timers\u003c/code\u003e and support mocking\n\u003ccode\u003eTemporal\u003c/code\u003e  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eHiroshi Ogawa\u003c/strong\u003e and \u003cstrong\u003eOpenCode\n(gpt-5.6-sol)\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10654\"\u003evitest-dev/vitest#10654\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/f8b1532fe\"\u003e\u003c!-- raw\nHTML omitted --\u003e(f8b15)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove webdriverio package  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10675\"\u003evitest-dev/vitest#10675\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/5fed68f72\"\u003e\u003c!-- raw\nHTML omitted --\u003e(5fed6)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClear mocks by default before each test  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10613\"\u003evitest-dev/vitest#10613\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/0f6463bf2\"\u003e\u003c!-- raw\nHTML omitted --\u003e(0f646)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon\u0027t emit localStorage warnings on Node 26, fail gracefully when\nworker fails to start  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10293\"\u003evitest-dev/vitest#10293\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/334edef92\"\u003e\u003c!-- raw\nHTML omitted --\u003e(334ed)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSeparate config resolution from the server creation  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10554\"\u003evitest-dev/vitest#10554\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/1c0ec3444\"\u003e\u003c!-- raw\nHTML omitted --\u003e(1c0ec)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eInline projects extend the root config by default  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10750\"\u003evitest-dev/vitest#10750\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/fec001ad3\"\u003e\u003c!-- raw\nHTML omitted --\u003e(fec00)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnable mocking Temporal without fake timers  -  by \u003ca\nhref\u003d\"https://github.com/fabon-f\"\u003e\u003ccode\u003e@​fabon-f\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eHiroshi Ogawa\u003c/strong\u003e and \u003cstrong\u003eOpenCode\n(gpt-5.6-sol)\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10757\"\u003evitest-dev/vitest#10757\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/ac2d46b42\"\u003e\u003c!-- raw\nHTML omitted --\u003e(ac2d4)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport nested projects  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10846\"\u003evitest-dev/vitest#10846\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/ec367cf2a\"\u003e\u003c!-- raw\nHTML omitted --\u003e(ec367)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003e\u0026gt;\u003c/code\u003e as separator in \u003ccode\u003e-t\u003c/code\u003e, calculate\n\u003ccode\u003eonly\u003c/code\u003e once  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10686\"\u003evitest-dev/vitest#10686\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/a0b20bc86\"\u003e\u003c!-- raw\nHTML omitted --\u003e(a0b20)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFail the test when an asynchronous assertion is not awaited  -  by\n\u003ca href\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10868\"\u003evitest-dev/vitest#10868\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/86d4a9da9\"\u003e\u003c!-- raw\nHTML omitted --\u003e(86d4a)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eShare the Vite server between inline projects  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10848\"\u003evitest-dev/vitest#10848\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/d87c96ee4\"\u003e\u003c!-- raw\nHTML omitted --\u003e(d87c9)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eParse files statically in vitest list by default  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/11088\"\u003evitest-dev/vitest#11088\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/51e949416\"\u003e\u003c!-- raw\nHTML omitted --\u003e(51e94)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ebenchmark\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eRewrite the public API  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10113\"\u003evitest-dev/vitest#10113\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/19f6e8947\"\u003e\u003c!-- raw\nHTML omitted --\u003e(19f6e)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ebrowser\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eIframe scale  -  by \u003ca\nhref\u003d\"https://github.com/macarie\"\u003e\u003ccode\u003e@​macarie\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/9745\"\u003evitest-dev/vitest#9745\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/b639852cc\"\u003e\u003c!-- raw\nHTML omitted --\u003e(b6398)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnable \u003ccode\u003elocators.exact\u003c/code\u003e by default  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10430\"\u003evitest-dev/vitest#10430\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/e203202f9\"\u003e\u003c!-- raw\nHTML omitted --\u003e(e2032)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003esessionId\u003c/code\u003e for orchestrator html request  -  by\n\u003ca href\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eHiroshi Ogawa\u003c/strong\u003e and \u003cstrong\u003eOpenAI Codex\u003c/strong\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10522\"\u003evitest-dev/vitest#10522\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/79b7d8fcc\"\u003e\u003c!-- raw\nHTML omitted --\u003e(79b7d)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSave failure screenshots in \u003ccode\u003eattachmentsDir\u003c/code\u003e  -  by \u003ca\nhref\u003d\"https://github.com/macarie\"\u003e\u003ccode\u003e@​macarie\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10917\"\u003evitest-dev/vitest#10917\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/3b5bbd8b4\"\u003e\u003c!-- raw\nHTML omitted --\u003e(3b5bb)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ecoverage\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einclude/exclude\u003c/code\u003e globs too eager  -  by \u003ca\nhref\u003d\"https://github.com/AriPerkkio\"\u003e\u003ccode\u003e@​AriPerkkio\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/9818\"\u003evitest-dev/vitest#9818\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/edacb0fd4\"\u003e\u003c!-- raw\nHTML omitted --\u003e(edacb)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAllow \u003ccode\u003ethresholds.perFile\u003c/code\u003e to accept an object  -  by \u003ca\nhref\u003d\"https://github.com/vladlenskiy\"\u003e\u003ccode\u003e@​vladlenskiy\u003c/code\u003e\u003c/a\u003e and\n\u003ca href\u003d\"https://github.com/AriPerkkio\"\u003e\u003ccode\u003e@​AriPerkkio\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10190\"\u003evitest-dev/vitest#10190\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/13b78d98b\"\u003e\u003c!-- raw\nHTML omitted --\u003e(13b78)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eexpect\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003etoThrow(\u0026quot;\u0026quot;)\u003c/code\u003e behavior by reverting \u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/6710\"\u003e#6710\u003c/a\u003e\n -  by \u003ca href\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/9643\"\u003evitest-dev/vitest#9643\u003c/a\u003e\nand \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/6710\"\u003evitest-dev/vitest#6710\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/6c3e4bdbf\"\u003e\u003c!-- raw\nHTML omitted --\u003e(6c3e4)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003emocker\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eDeserialize automock as automock  -  by \u003ca\nhref\u003d\"https://github.com/nami8824\"\u003e\u003ccode\u003e@​nami8824\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10192\"\u003evitest-dev/vitest#10192\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/2f892712d\"\u003e\u003c!-- raw\nHTML omitted --\u003e(2f892)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ereporters\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eblob\u003c/code\u003e reporter and \u003ccode\u003e--merge-reports\u003c/code\u003e default\nto \u003ccode\u003e.vitest/blob/\u003c/code\u003e  -  by \u003ca\nhref\u003d\"https://github.com/AriPerkkio\"\u003e\u003ccode\u003e@​AriPerkkio\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10232\"\u003evitest-dev/vitest#10232\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/d22b029ae\"\u003e\u003c!-- raw\nHTML omitted --\u003e(d22b0)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWrite json and junit reporter output files to \u003ccode\u003e.vitest\u003c/code\u003e\nby default  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eHiroshi Ogawa\u003c/strong\u003e, \u003cstrong\u003eOpenCode (gpt-5.6-sol)\u003c/strong\u003e\nand \u003ca\nhref\u003d\"https://github.com/AriPerkkio\"\u003e\u003ccode\u003e@​AriPerkkio\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10621\"\u003evitest-dev/vitest#10621\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/58577290a\"\u003e\u003c!-- raw\nHTML omitted --\u003e(58577)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/f441c6fab25e579c5b7dd3dd50538416f415fbae\"\u003e\u003ccode\u003ef441c6f\u003c/code\u003e\u003c/a\u003e\nchore: release v5.0.0 (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/11130\"\u003e#11130\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/897f51fd2493046c52ec9539b7d02fe3763bd63e\"\u003e\u003ccode\u003e897f51f\u003c/code\u003e\u003c/a\u003e\nchore: release v5.0.0-rc.4 (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/11107\"\u003e#11107\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/7db80dc27e5948010c00160ed0b86570baad6ce8\"\u003e\u003ccode\u003e7db80dc\u003c/code\u003e\u003c/a\u003e\nchore: release v5.0.0-rc.3 (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/11089\"\u003e#11089\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/732df2c2b4bc73e8fcddc256228e43c6e479a87e\"\u003e\u003ccode\u003e732df2c\u003c/code\u003e\u003c/a\u003e\nfix(deps): update all non-major dependencies (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/11043\"\u003e#11043\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/1e9f80ec18c06be06211c93536d90a81955e661a\"\u003e\u003ccode\u003e1e9f80e\u003c/code\u003e\u003c/a\u003e\nperf(vm): don\u0027t prewarm modules the worker never requests (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/11033\"\u003e#11033\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/af83d1b1933b5d74c421d30849717369b828de0b\"\u003e\u003ccode\u003eaf83d1b\u003c/code\u003e\u003c/a\u003e\nchore: release v5.0.0-rc.2 (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/10976\"\u003e#10976\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/8ff9b9a9efca7c6cfd5243569440de8d7a33aec4\"\u003e\u003ccode\u003e8ff9b9a\u003c/code\u003e\u003c/a\u003e\nfix(mocker): restrict redirect mocks to the fs allowlist (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/10972\"\u003e#10972\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/65263d74e6783cf052e1eff2f2a4e371bbd40635\"\u003e\u003ccode\u003e65263d7\u003c/code\u003e\u003c/a\u003e\nfix(deps): update all non-major dependencies (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/10966\"\u003e#10966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/a7fa111fef94bdc80ca9614c4e20b56f3393c920\"\u003e\u003ccode\u003ea7fa111\u003c/code\u003e\u003c/a\u003e\nchore: release v5.0.0-rc.1 (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/10920\"\u003e#10920\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/0553851f9f299233fbd2e797a76152e98f593ac7\"\u003e\u003ccode\u003e0553851\u003c/code\u003e\u003c/a\u003e\nchore: add Knip checks (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker/issues/10847\"\u003e#10847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commits/v5.0.0/packages/mocker\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003d@vitest/mocker\u0026package-manager\u003dnpm_and_yarn\u0026previous-version\u003d4.1.10\u0026new-version\u003d5.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this\ngroup update PR and stop Dependabot creating any more for the specific\ndependency\u0027s major version (unless you unignore this specific\ndependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this\ngroup update PR and stop Dependabot creating any more for the specific\ndependency\u0027s minor version (unless you unignore this specific\ndependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR\nand stop Dependabot creating any more for the specific dependency\n(unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore\nconditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will\nremove the ignore condition of the specified dependency and ignore\nconditions\nYou can disable automated security fix PRs for this repo from the\n[Security Alerts\npage](https://github.com/google/perfetto/network/alerts).\n\n\u003c/details\u003e\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Steve Golton \u003cstevegolton@google.com\u003e"
    },
    {
      "commit": "6f78923bd6e6f9bfd9078155226f76df8e0a007c",
      "tree": "5a76c6824cbf7408bc8c66b5ccd9585ba8a05296",
      "parents": [
        "7cb6a541e77971c23454306f8bae7cef92f50cd3"
      ],
      "author": {
        "name": "Ivan",
        "email": "99329845+ivan-chong@users.noreply.github.com",
        "time": "Thu Sep 10 19:44:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 19:44:49 2026 +0100"
      },
      "message": "ui: Extend plugin selection detail tabs to track events (#7003)\n\nThis PR extends the subtab concept from area selection tabs to also\ntrack event selections. This allows plugins to register their custom\nsubtabs which can be displayed in the selection details bottom drawer\neven on regular track slices.\n\nBug: 289343169"
    },
    {
      "commit": "7cb6a541e77971c23454306f8bae7cef92f50cd3",
      "tree": "8c9a23b48e4aa1ae4debc8a7215871a854d429d5",
      "parents": [
        "a71a33bb8c8bbf4fd4bad0718e2aad98bccc4ec6"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Sep 10 17:26:17 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 16:26:17 2026 +0000"
      },
      "message": "ui: Migrate TreeExplorer to AsyncMemo (#7387)\n\nThis patch switches out the query loading with AsyncMemos, which vastly\nsimplifies the management of asynchronous data fetching and caching,\nincluding dependency management. This avoids any race condition bugs\nwhere dependencies tables are dropped before the dependant table gets a\nchance to use it."
    },
    {
      "commit": "a71a33bb8c8bbf4fd4bad0718e2aad98bccc4ec6",
      "tree": "065708c3f67265a355238671f508e4ad2b4be85d",
      "parents": [
        "635c592a6ec25db870cd41c0b12ad7172e11108f"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Sep 10 17:02:59 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 16:02:59 2026 +0000"
      },
      "message": "ui: Use number instead of bigint for Day Explorer track IDs (#7413)\n\nIn day explorer, track ids are being cast as bigints in various places,\nhowever track ids are small integers so the bigint round-trip and\nNumber() conversions are unnecessary.\n\nUse NUM and plain numbers throughout, and drop the dead string branch\nwhen reading the tag from the selection.\n\nAlso adds guidance to docs/AGENTS-ui.md: prefer NUM/number over\nLONG/bigint for sequential TraceProcessor ID fields, reserve LONG for ns\ntimestamps/durations that can exceed 2^53, and convert query results to\nthe Time/Duration types via fromRaw() as soon as they leave the query\niteration."
    },
    {
      "commit": "635c592a6ec25db870cd41c0b12ad7172e11108f",
      "tree": "f88b5208a2414781ec63c2c869764b82ca39e727",
      "parents": [
        "d6f56e6d540127bce6076a874c475555dea86cb4"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Thu Sep 10 15:50:58 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 18:50:58 2026 +0300"
      },
      "message": "stdlib: fix lock attribution in android.lock_held stdlib module (#7415)\n\nPartition interval intersection on (lock_name, utid) rather than utid\nalone to avoid attributing monitor contention from one lock (e.g. ams)\nto another concurrently held lock (e.g. wms) on the same thread.\n\nAdditionally, require that the monitor contention slice started at or\nafter the lock held start time `(mc.ts \u003e\u003d raw.ts)` so that point-in-time\nblocking method samples taken prior to this lock hold are not\nerroneously attributed.\n\nBUG\u003db/559488910"
    },
    {
      "commit": "d6f56e6d540127bce6076a874c475555dea86cb4",
      "tree": "bf5883ecb6c73409a4fd52441b6f678dbdf80a36",
      "parents": [
        "2ff8de0eb199d5addc790df8bd4693272f7b0a62"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Thu Sep 10 12:00:18 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 11:00:18 2026 +0000"
      },
      "message": "ui: Fix integer overflow in slice minimap (#7412)\n\n- Divide durations by the resolution as floats before summing.\n- Avoid overflow in thread and process totals.\n- Rename utid_sum to utid_load to reflect the normalized values.\n- Remove the redundant IFNULL around the load sum.\nDurations are non-null, resolution is positive, and groups contain rows.\n\n```\nError stack:\nTraceback (most recent call last):\n  File \"stdin\" line 2 col 15\n    SELECT\n    ^\ninteger overflow\nEngineTag: dev.perfetto.TraceProcessorTrack\n- WasmEngineProxy.query (../../src/trace_processor/engine.ts:621:6)\n- async EngineProxy.query (../../src/trace_processor/engine.ts:821:4)\n- async Object.getData (../../src/plugins/dev.perfetto.TraceProcessorTrack/index.ts:800:8)\n- async MinimapManagerImpl.load (../../src/core/minimap_manager.ts:56:4)\n- async loadTraceIntoEngine (../../src/core/load_trace.ts:291:2)\n- async loadTrace (../../src/core/load_trace.ts:147:2)\n- async Object.work (../../src/core/app_impl.ts:267:8)\n- async AsyncLimiter.runTaskQueue (../../src/base/async_limiter.ts:65:10)\n- ```\n\nBug: 559323830"
    },
    {
      "commit": "2ff8de0eb199d5addc790df8bd4693272f7b0a62",
      "tree": "0d7e2a6bde8c4adeddee36aa52baafe10d2dd426",
      "parents": [
        "e73a4cd5972843aa2ea53a833599149c333df58e"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Thu Sep 10 11:52:07 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 10:52:07 2026 +0000"
      },
      "message": "Allow unknown fields in trace summary specs (#7411)\n\n- Enable this directly in the C++ parser for now to skip custom\nannotations as those seem to be the more common use case.\n\n- An API option can be added later if callers need strict validation.\n\nBug: 559483409"
    },
    {
      "commit": "e73a4cd5972843aa2ea53a833599149c333df58e",
      "tree": "ee5554709893755f06916ac9991dc6130fa8043d",
      "parents": [
        "1f179c0b1f68bd4942ece241d00b96c86eadff37"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Sep 10 10:55:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 10:55:19 2026 +0100"
      },
      "message": "ui: Gracefully handle WebGL context loss and restoration (#7409)\n\nInstead of throwing an error on WebGL context loss, fall back to\nCanvas2DRenderer by clearing webglRenderer and call preventDefault() so\nthe browser dispatches webglcontextrestored. Recreate the WebGL renderer\nwhen the context is restored.\n\nAlso update bindEventListener() to infer the event type conditionally\nwhen non-standard event names are passed.\n\n## Testing\n\n- Open up an instance of Perfetto + open a trace - you should see the\ntimeline.\n- Open up devtools and paste the following snippet - it should exhaust\nthe browser\u0027s available contexts. Context should be lost and restored\nonce you interact with the timeline again:\n\n```js\nfor (let i \u003d 0; i \u003c 20; i++) {\n  document.createElement(\u0027canvas\u0027).getContext(\u0027webgl2\u0027);\n}\n```\n\nFixes: b/559187709"
    },
    {
      "commit": "1f179c0b1f68bd4942ece241d00b96c86eadff37",
      "tree": "5d4b1dc8cbb072db38d64adac485653c912d3322",
      "parents": [
        "5bf94268225caaad92a7551721218fb3d6afbdfc"
      ],
      "author": {
        "name": "perfetto-automation[bot]",
        "email": "278437629+perfetto-automation[bot]@users.noreply.github.com",
        "time": "Thu Sep 10 09:46:35 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 09:46:35 2026 +0000"
      },
      "message": "Sync generated proto files (#7410)\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": "5bf94268225caaad92a7551721218fb3d6afbdfc",
      "tree": "c719196d22517e7c8a04b50998d50eecd9d096f4",
      "parents": [
        "b1ec541e01db0d9f37b4be8040c5111f95ce1bac"
      ],
      "author": {
        "name": "MichaelFQuigley",
        "email": "michaelquigley@google.com",
        "time": "Wed Sep 09 15:43:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 15:43:41 2026 -0700"
      },
      "message": "tp: Remove \u0027Unknown field in merged class\u0027 DLOG message from deobfuscator (#7406)\n\nThis is not actionable and creates log spam for each merged classes\ncomment in the proguard.map file."
    },
    {
      "commit": "b1ec541e01db0d9f37b4be8040c5111f95ce1bac",
      "tree": "0e034af6191e865e72d1f157ea3c2ddd790ef87a",
      "parents": [
        "e4b8661ebd16b8b9a8fc81d55818ae686dbe9fef"
      ],
      "author": {
        "name": "sanath099",
        "email": "sanath099@gmail.com",
        "time": "Wed Sep 09 16:24:16 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 16:24:16 2026 -0500"
      },
      "message": "ui: Support JobScheduler track events in AndroidLongBattery plugins (#7407)\n\nAdd support for JobScheduler track events to Android Long Battery\nplugins. Detects track_event.jobscheduler via\n__intrinsic_android_job_scheduler_track_events and includes the\nandroid.job_scheduler_states_track_events module. Renders the \u0027Jobs\u0027\nslice track under \u0027Device State\u0027 with all columns from\nandroid_job_scheduler_states_track_events, while retaining fallbacks for\nlegacy statsd atoms and battery_stats events.\n\nBug: 553025123"
    },
    {
      "commit": "e4b8661ebd16b8b9a8fc81d55818ae686dbe9fef",
      "tree": "ade41a48e0de2dfb7e0933b198162049d8a6aea4",
      "parents": [
        "ff983a7e34fcf1909ae632176226f3e5e6a7fdf2"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 09 20:51:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 20:51:50 2026 +0100"
      },
      "message": "docs: consolidate Trace Processor CLI reference (#7394)\n\nSeparate command reference material from task-oriented guides and retain\nlinks from the old reference anchors. Document the existing native\nsymbol search paths, environment configuration, and build-ID matching\nbehavior."
    },
    {
      "commit": "ff983a7e34fcf1909ae632176226f3e5e6a7fdf2",
      "tree": "981c75b100cc1d315aa422ed90165d8c81a6884f",
      "parents": [
        "494c9ef7ddb88d26f3ac77e04fd18cf6f26a9d16"
      ],
      "author": {
        "name": "willmcvicker",
        "email": "willmcvicker@google.com",
        "time": "Wed Sep 09 12:48:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 19:48:14 2026 +0000"
      },
      "message": "wattson: Add support to extract SoC model from devicetree on Linux (#7222)\n\nOn Android, the `ro.soc.model` system property is used to identify the\ntarget\u0027s SoC which the wattson stdlib uses to determine if a given\ntarget supports Wattson. Since Linux distributions don\u0027t use system\nproperties, this patch introduces a new SystemInfo attribute --\nlinux_device. For arm64 Linux devices, we can populate the linux_device\nattribute with the Device Tree base compatible. This attribute is then\npassed through via the metadata to allow the Wattson stdlib to create a\nmapping between the linux_device and wattson_device properies.\n\nWith this change, you can successfully collect Wattson metrics on\nsupported devices running Linux. As an example, use tracebox on your\nLinux target like this:\n\n  $ tracebox --txt -c wattson.cfg --background-wait -o trace.pb\n\nBug: 446195032\nTest: collect trace on Pixel 6 with Linux and verify Wattson track\nTest: verify power metrics wattson_markers_rails,wattson_markers_threads\n\nSigned-off-by: Will McVicker \u003cwillmcvicker@google.com\u003e"
    },
    {
      "commit": "494c9ef7ddb88d26f3ac77e04fd18cf6f26a9d16",
      "tree": "b49e56a3e6031ccdfd0c3e413cd1a25845777e79",
      "parents": [
        "2d2b4f52c6eedb6366d39f7a9c6cdbc14a37d9a9"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 09 18:01:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 18:01:00 2026 +0100"
      },
      "message": "tp: reduce setup on the ordinary track event import path (#7377)\n\nConstruct argument writers lazily and share the empty legacy decoder.\nHandle single interned categories directly and keep uncommon legacy and\ncorrelation handling out of line. Cache the last field handler,\ninvalidating the lookup when another handler is registered.\n\nOn the interned buildprof trace, against its parent:\n- Wall time: 19.66s -\u003e 18.53s (-5.7%).\n- User instructions: 289.388G -\u003e 278.381G (-3.80%).\n- Executable .text: 8,907,474 -\u003e 8,910,578 bytes (+3,104)."
    },
    {
      "commit": "2d2b4f52c6eedb6366d39f7a9c6cdbc14a37d9a9",
      "tree": "66546461b94415ca60c64670127607a111108bf9",
      "parents": [
        "aee7380fb7f540b4b8a1211efcdc51903f243035"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 09 18:01:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 18:01:00 2026 +0100"
      },
      "message": "tp: trim packet decoding and plain event tokenization (#7376)\n\nTrack event import only needs the event payload and packet sequence id.\nCollect both in one shared decoder walk instead of building a typed\npacket decoder, preserving last-occurrence semantics. Inline the module\nforwarding method.\n\nReuse the tokenizer\u0027s decoded fields to bypass defaults and counter\nsetup when the event needs no processing and already has a valid\ntimestamp. Legacy fields, extra counters, counter/state events, and\nmissing or negative timestamps retain the existing path.\n\nOn the interned buildprof trace, against its parent:\n- Wall time: 20.53s -\u003e 19.66s (-4.2%).\n- User instructions: 293.280G -\u003e 289.388G (-1.33%).\n- Executable .text: 8,906,946 -\u003e 8,907,474 bytes (+528)."
    },
    {
      "commit": "aee7380fb7f540b4b8a1211efcdc51903f243035",
      "tree": "51a4fabdefa2ecc7b511501cb6c743d7b713ff8e",
      "parents": [
        "7a55208c0f8fcd7f864b559bb144033a2c5ba141"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 09 18:00:59 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 18:00:59 2026 +0100"
      },
      "message": "tp: avoid redundant packet reader work (#7375)\n\nDetect compressed bundles using the reader\u0027s existing decoder and read\ncontiguous packet headers directly. Retain validated sequence lookups\nand inline the common single-chunk reader operations to reduce\nper-packet work.\n\nMove-slice blob views when consuming bytes so ownership transfers\nwithout refcount updates or a separate consumed-byte offset. Keep\nindividual packet field checks instead of maintaining a second inventory\nof rare fields.\n\nOn the interned buildprof trace, against its parent:\n- Wall time: 21.55s -\u003e 20.53s (-4.7%).\n- User instructions: 323.492G -\u003e 293.280G (-9.34%).\n- Executable .text: 8,905,154 -\u003e 8,906,946 bytes (+1,792)."
    },
    {
      "commit": "7a55208c0f8fcd7f864b559bb144033a2c5ba141",
      "tree": "87b76724bd4ef7fa932cf248f033fd40335adeb4",
      "parents": [
        "7ec339e2ca8da593d4aed27b81690b983a19613c"
      ],
      "author": {
        "name": "Samuel Wu",
        "email": "wusamuel@google.com",
        "time": "Wed Sep 09 09:17:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 09:17:20 2026 -0700"
      },
      "message": "stdlib: Wattson: Add SoC aliasing (#7373)\n\nAdd SoC aliasing functionality, and map SAR1130P to neo.\n\nBug: 552739525\nSigned-off-by: Samuel Wu \u003cwusamuel@google.com\u003e"
    },
    {
      "commit": "7ec339e2ca8da593d4aed27b81690b983a19613c",
      "tree": "4d3e849864138035ced0ee65ab361bcad021504c",
      "parents": [
        "e944fb4635a787d2fc3b3bb3582191e2e994ed96"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Wed Sep 09 16:27:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 16:27:14 2026 +0100"
      },
      "message": "ui: Document AsyncMemo in AGENTS-ui.md (#7388)\n\nDocument AsyncMemo for declarative async data fetching in view(),\ncovering key comparison, multi-step queries, AtomicTaskQueue,\ndisposables, and multi-tier caching. Update review antipatterns to\nrecommend AsyncMemo over QuerySlot."
    },
    {
      "commit": "e944fb4635a787d2fc3b3bb3582191e2e994ed96",
      "tree": "7952aebfd3eb528de93e8dca82a9c108f1fd96cc",
      "parents": [
        "5790475c1ec625b65b5c5e1a773123a28be85ee0"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 09 15:59:37 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 14:59:37 2026 +0000"
      },
      "message": "tp: fold tree values in a streaming pipeline (#7166)\n\nOnce rows are in tree order, a fold only needs one running value per\nnode.\nTreeAccumulateUp consumes child-first rows and adds each completed child\ninto\nits parent. TreeAccumulateDown consumes parent-first rows and carries\neach\nparent total into its children.\n\nBoth operators append the accumulated value and stream batches without\nkeeping\nanother copy of the input.\n\nThe SqlScan test covers the complete path from SQLite variants through\ntype\nvalidation, node numbering, ordering, and accumulation."
    },
    {
      "commit": "5790475c1ec625b65b5c5e1a773123a28be85ee0",
      "tree": "39586abb2d44465b3283b06bdd74b317aa95bdf7",
      "parents": [
        "ced94af64d7e4a779acb73b580726ea1e81fc1c8"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Wed Sep 09 15:28:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 15:28:38 2026 +0100"
      },
      "message": "ui: hde: Tweak HDE page layout (#7382)\n\n- Remove gutters\n- Use DetailsShell to provide consistent header\n- Tabs containing a single DataGrid take up the entire screen"
    },
    {
      "commit": "ced94af64d7e4a779acb73b580726ea1e81fc1c8",
      "tree": "81cccdcc56b0949d2932e9a9f78132a1510f7467",
      "parents": [
        "5d6dd85f0373da68d7d56a82b11ce919989f328a"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Wed Sep 09 13:37:02 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 13:37:02 2026 +0100"
      },
      "message": "ui: hde: Use Anchor widgets (#7380)\n\n- Replace all links with Anchor widgets for consistency.\n- While in the area - also fix some broken theme colour variable names."
    },
    {
      "commit": "5d6dd85f0373da68d7d56a82b11ce919989f328a",
      "tree": "a55ec80a3f9de36b7b2732f2a1384521006e62f3",
      "parents": [
        "8665a1fa48ac395bedbffa543e2330354cf717eb"
      ],
      "author": {
        "name": "Archkon",
        "email": "180910180+Archkon@users.noreply.github.com",
        "time": "Wed Sep 09 20:35:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 12:35:23 2026 +0000"
      },
      "message": " base: use intptr_t for ssize_t on Windows  (#7136)\n\nUse intptr_t for Perfetto\u0027s Windows ssize_t definition. This preserves\nthe width and value range on all Windows architectures and makes the\ndefinition compatible with common embedders.\n\nElectron has carried this downstream fix for Win32 builds since 2022."
    },
    {
      "commit": "8665a1fa48ac395bedbffa543e2330354cf717eb",
      "tree": "70615f23e8ef7b3656fb425491d2109b1740639f",
      "parents": [
        "fd896b1ad88899807bb128b7255deb5199dde54f"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 09 01:44:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 01:44:26 2026 +0100"
      },
      "message": "tp: make art hprof support deobfuscation using bundle (#7379)\n\nBecause we were not correctly registering with heap graph tracker,\ndeobfuscation\nwas not working properly. Register it so it does."
    },
    {
      "commit": "fd896b1ad88899807bb128b7255deb5199dde54f",
      "tree": "74a7ceb9d5b9372efa420639ce3a778dfd4ce593",
      "parents": [
        "29cd0ea4ceb5f864579133e5d5c0872d6c55ccdb"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 19:34:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 19:34:14 2026 +0100"
      },
      "message": "tp: parse decoded argument fields directly using scalar schemas (#7369)\n\nDispatch track event argument fields from one selective decode in wire\norder. Share field handling with whole-message reflection and carry\nrepeated indices across calls so existing allowlist callers and unknown\nfield accounting retain their behavior.\n\nPrepare scalar descriptors and keys once per message path, then write\neligible scalar messages without the work stack. Schema eligibility\navoids shape matching and cache churn when optional fields are absent\nor reordered. Keep ordinary parsing for repeated fields, nested\nmessages, overrides and contextual fields. Invalidate prepared schemas\nwhen descriptors or overrides change.\n\nLet selective decoding inherit generated accessors so one decoder serves\nboth event parsing and argument dispatch. Include compact repeated-index\nstorage and cached override lookup to support the shared field parser.\n\nOn the interned buildprof trace, compared with the two merged PRs:\n- Wall time: 30.59s -\u003e 21.71s (-29.0%).\n- User instructions: 449.806G -\u003e 323.493G (-28.1%).\n- Executable .text: 8,896,898 -\u003e 8,905,154 bytes (+8,256, +0.093%)."
    },
    {
      "commit": "29cd0ea4ceb5f864579133e5d5c0872d6c55ccdb",
      "tree": "7a380c03cb0e32d272bd4175b62481c48d7051bb",
      "parents": [
        "2566e6091d0b6cd2d0d7aadd6ad54f8227c737fd"
      ],
      "author": {
        "name": "Nicolò Mazzucato",
        "email": "nicomazz@google.com",
        "time": "Tue Sep 08 19:15:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 17:15:54 2026 +0000"
      },
      "message": "Support pinning metrics via parameter dictionaries in PinAndroidPerfMetrics (#7350)\n\nAllow other tools to automatically pin perf metrics by passing an open\nparameter dictionary, without depending on the legacy structured metric\nkey string format.\n\nIntroduce PinIntent and register a command to parse parameters and pin\nthe corresponding CUJs, scoped jank, or blocking calls."
    },
    {
      "commit": "2566e6091d0b6cd2d0d7aadd6ad54f8227c737fd",
      "tree": "e93150f11b400f570e9d1317a99e22ad663d835c",
      "parents": [
        "d59433bedad4de0de140b39bad0796e27aebff3c"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 16:17:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 16:17:16 2026 +0100"
      },
      "message": "tp: handle track event argument fields through extensions (#7365)\n\nGive each argument field the same handler interface as extension fields.\nMove built-in handlers out of the event importer and port the in-tree\nplugins, making field ownership explicit before changing reflection.\n\nRecorded buildprof results:\n- Wall time: 29.57s -\u003e 29.21s (-1.20%).\n- User instructions: 447.673G -\u003e 445.418G (-0.50%)."
    },
    {
      "commit": "d59433bedad4de0de140b39bad0796e27aebff3c",
      "tree": "7a967056727dda0700b15ff298bfd423f847e412",
      "parents": [
        "009d793ebcd08df7db362f0efc5281c5689ec657"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 16:17:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 16:17:16 2026 +0100"
      },
      "message": "tp: reduce token buffer allocation and extraction work (#7364)\n\nReturn each bump allocation together with its address and retain the\ncurrent chunk metadata to avoid repeated allocation-id lookups.\n\nResolve the data pointer and release bookkeeping together during\nextraction, then free only after reading all fields. This avoids a\nsecond chunk lookup without reading an allocation after freeing it.\n\nRecorded buildprof results:\n- Wall time: 30.52s -\u003e 29.57s (-3.11%).\n- User instructions: 455.313G -\u003e 447.673G (-1.68%)."
    },
    {
      "commit": "009d793ebcd08df7db362f0efc5281c5689ec657",
      "tree": "5f7581e2f523bc24322ff977b677f03cd071e54d",
      "parents": [
        "a790112eeadf49d5b5ca33fef79b0a54f7950092"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 14:36:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 13:36:50 2026 +0000"
      },
      "message": "ai: a bunch of imporvements for AI skills and TP (#7362)\n\n* add a bunch of AI evals to help us actually test the skill\n  properly to make sure it\u0027s doing what it should be\n* add tp help agent and hints in general help to hint to the\n  agent best practices and skills it should use\n* improve skill with learning from running evals, making pass\n  rate higher *and* reducing token usage\n\nFixes: https://github.com/google/perfetto/issues/6981"
    },
    {
      "commit": "a790112eeadf49d5b5ca33fef79b0a54f7950092",
      "tree": "bd98ae7c9268ed34be54883a356452294e38ea28",
      "parents": [
        "a27f16efe2a0bb785084106983e730fafc588f46"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 12:36:22 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:36:22 2026 +0100"
      },
      "message": "tp: stop re-resolving per-generation packet state on every packet (#7357)\n\nThe ProtoVM patch check hashed the sequence id on every packet although\nno VM is configured in almost every trace, the trace packet defaults\ndecoder was re-resolved per packet although the defaults are fixed for\na generation, and the default clock was copied per packet. The check\nreturns early without VMs, the decoder is memoized like the track\nevent defaults already were, and the clock is borrowed.\n\nInstructions to load a 3.1 GB trace of 23.7M track events go from\n459.93G to 458.13G (-0.4%), and for chrome_android_systrace from\n10.25G to 10.22G (-0.2%). Output is identical on both."
    },
    {
      "commit": "a27f16efe2a0bb785084106983e730fafc588f46",
      "tree": "6fee42d8efff8e4f487f5da31e9e48f123bfaac4",
      "parents": [
        "95786917baf43a09b3426f5761b1a2d97de61b3b"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 12:36:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:36:21 2026 +0100"
      },
      "message": "tp: decode each packet once in the proto reader (#7356)\n\nEvery TracePacket was decoded twice on the tokenization path: with the\ntyped decoder in ParsePacket, which reads the reader\u0027s fields by name,\nand again with SelectiveTracePacketDecoder for module dispatch.\n\nThe selective decoder\u0027s allowlist now covers every field the reader\nreads by name, so ParsePacket decodes once with it and passes it down.\nIts spill list remains exactly the payload fields modules are\ndispatched on, in wire order; track events are read by name and handed\nto their module directly.\n\nInstructions to load a 3.1 GB trace of 23.7M track events go from\n473.96G to 459.93G (-3.0%), and for chrome_android_systrace from\n10.62G to 10.25G (-3.5%). Output is identical on both."
    },
    {
      "commit": "95786917baf43a09b3426f5761b1a2d97de61b3b",
      "tree": "6266d7f419ccb7ee4c640b0cf6cb7b922efaa6c3",
      "parents": [
        "ec1542406a2c7eed425afa441f25fcb963d32b4e"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 12:36:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:36:21 2026 +0100"
      },
      "message": "tp: move the tracing service\u0027s packet handlers into a module (#7355)\n\nService lifecycle events and extension descriptors were handled by\nProtoTraceReader itself although nothing about them needs the reader:\nthey consume their field and are done, which is what importer modules\nare for. They move verbatim into TracingServiceModule. Clock snapshots\nstay in the reader, since resolving any packet\u0027s timestamp, including\nthe snapshot\u0027s own, depends on them.\n\nThe two packet types now pass through the content analyzer like every\nother module-handled packet, which moves the proto_content diff test\nexpectation by one packet. Instructions are unchanged."
    },
    {
      "commit": "ec1542406a2c7eed425afa441f25fcb963d32b4e",
      "tree": "81e1ab4ba9c057eb9e285828e85ba7cc871783b9",
      "parents": [
        "2c10bf5e2a782d61f3c6093649ad20c83a38cc43"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Tue Sep 08 12:36:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:36:21 2026 +0100"
      },
      "message": "tp: trim per-event work on the track event tokenize and import path (#7354)\n\nSeveral costs were paid on every track event without doing anything\nuseful for it: two heap allocations to look at a single inline\ncategory, two scans of the raw event bytes for out-of-tree fields\nthat are almost never there, a second typed decode of every packet in\nthe reader, a sequence-state insert per packet, a walk of the interned\nsubmessage map to find the track event defaults on every call, six\nrepeated-field iterators for extra counter values, entering the\n\"debug\" args dictionary for events without debug annotations, and\nseven separate checks for legacy timestamp fields.\n\nEach is skipped when it does not apply: the category is counted\nthrough its iterator, the typed decoder records whether it skipped an\nout-of-range field, the decoder is passed through, the defaults are\nmemoized per generation, and the legacy fields are tested with one\npresence mask.\n\nInstructions to load a 3.1 GB trace of 23.7M track events go from\n540.05G to 473.96G (-12.2%), and for chrome_android_systrace from\n11.87G to 10.62G (-10.5%). Output is identical on both."
    },
    {
      "commit": "2c10bf5e2a782d61f3c6093649ad20c83a38cc43",
      "tree": "f58845047c6dc25d051852bbe28fa7af2be65e8e",
      "parents": [
        "f0e69ecb45b59faaf5ea0fbf67b41ade51a3579f"
      ],
      "author": {
        "name": "Primiano Tucci",
        "email": "primiano@google.com",
        "time": "Tue Sep 08 12:25:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:25:03 2026 +0100"
      },
      "message": "docs: Add a blog to perfetto.dev (#7261)\n\nFor now the blog is hidden (i.e. it\u0027s not linked, works only if you\nopen perfetto.dev/blog/). I plan to unhide it later once we prove\neverything works fine on the prod site.\n\nA post is a directory named YYYY-MM-DD-slug holding post.md plus its\nimages. The date orders the feed but is dropped from the URL, so fixing\na wrong date doesn\u0027t break a permalink; images are hoisted to\n/blog/media/\u003cslug\u003e/ so /blog/\u003cslug\u003e can stay an extensionless file like\nthe docs pages. Front matter is title/author/summary, authors being\n@-prefixed GitHub handles as in rfcs/template.md.\n\nThe site gains a card index, an Atom feed, its own BM25 search index and\nper-post covers. A cover is the post\u0027s first image, or generated from\nthe title when it has none; the index links 640px thumbnails instead of\nfull screenshots, which takes it from ~1MB of cover art to ~180KB.\nAvatars are committed under authors/ (tools/fetch_avatars) rather than\nhotlinked, so a reader loading a post sends nothing to github.com.\n\nTwo things needed generalizing rather than duplicating:\n\n- render.mjs took /docs/ as the only content root. It now takes a `post`\n  and switches link and image handling on it, and renderPage passes the\n  front matter through to the template.\n- Every article rule was written `.docs .doc`, which would have meant a\n  post claiming to be a docs page to get typography. `.doc` and `.toc`\n  are hoisted to the top level and renamed `.md-content`, which is what\n  they always were; `.docs` and `.blog` are now separate shells that\n  share them. That also fixes the footer licence notice, which was\n  keyed off `.docs` and so went missing on the blog index.\n\nThe blog is deliberately unlisted for now: no top-bar link, and the feed\nis advertised only on blog pages. Re-add the link in\ntemplate_header.html\nto launch it.\n\nDrive-by: marked\u0027s mangle option obfuscated mailto: addresses with\nMath.random(), which made every build byte-different. Disabled, so the\noutput is reproducible again."
    },
    {
      "commit": "f0e69ecb45b59faaf5ea0fbf67b41ade51a3579f",
      "tree": "52115cd5804be7b9dad4ab89ac8a8e1ceeb9730d",
      "parents": [
        "eaad82305c8e3d7589b4f73844fbe93c80636199"
      ],
      "author": {
        "name": "Parth Sane",
        "email": "parthsane@gmail.com",
        "time": "Tue Sep 08 10:52:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 10:52:46 2026 +0100"
      },
      "message": "tp: add dump_process_metadata to AndroidProcessStateConfig (#7352)\n\nAdd AndroidProcessStateConfig proto and wire it into DataSourceConfig\n(field 145) for the \"android.process_state\" data source.\n\nThis flag allows omitting process metadata (process name, start time,\nstart seq id) from process state snapshots by default to save bandwidth,\nwhile allowing clients to enable it if ftrace is not used."
    },
    {
      "commit": "eaad82305c8e3d7589b4f73844fbe93c80636199",
      "tree": "2b135b0b855900085e445f6090f377f163df62bd",
      "parents": [
        "85b6e5fe50abbdc3b42b1d4d8dcc42f26675e223"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Mon Sep 07 15:30:05 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 15:30:05 2026 +0100"
      },
      "message": "tp: prove StringPool read path is concurrent-safe under locking (#7344)\n\nAdds two ThreadSanitizer stress tests proving the StringPool read path\nis safe for the multi-connection design, where string columns are read\non every query thread:\n\n - ConcurrentReadsNoInterns: 8 threads concurrently Get()/GetId() a\n   finalized pool (small, block-spanning and \u003e1MB large strings).\n - ConcurrentReadsWhileLockedInterns: with locking enabled, reader\n   threads do lock-free Get() of pre-existing ids while writer threads\n   continuously intern ~2KB strings, forcing several real 4MB-block\n   allocations during the read window (the new-block publication path),\n   plus occasional large-string appends. The test asserts the bytes of\n   every pre-existing id stay intact and self-validates that block\n   growth actually occurred.\n\nNo production fix was required: the lock-free Get() is safe against\nconcurrent interns because |blocks_| is a fixed array that never\nreallocates (a new block writes a different slot), block bytes are\nwritten forward-only before the Id is published, and large strings are\nfully mutex-guarded. Documents this concurrency contract on\nset_locking() — including that concurrent interns from multiple threads\nare serialized by the mutex and supported (the prior draft contract\nwrongly stated otherwise)."
    },
    {
      "commit": "85b6e5fe50abbdc3b42b1d4d8dcc42f26675e223",
      "tree": "1f79d37884d51a74669ced2f7ab65dbb51d7c604",
      "parents": [
        "5f9252ba1240fea9898fe9a9c3c0c271f96a2d22"
      ],
      "author": {
        "name": "Safayat Ullah",
        "email": "safayat@google.com",
        "time": "Mon Sep 07 14:01:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 14:01:14 2026 +0100"
      },
      "message": "watchdog_posix: monitor anon RSS from proc/self/statm (#7313)\n\nPreviously Watchdog measured the memory by reading RSS from\nproc/self/stat. This may lead to false guardrail violations in case of\ntotal RSS is increased from shared library\n\nThis change reads anon RSS (rss - shared) from proc/self/statm Also\nwatchdog memory slack is safely returned to 32 Mib as before.\n\nFIXED_READ_ONLY_FLAG_REASON\u003dNATIVE_FLAG_PRE_METADATA_MOUNT\nBug: 540573436\nFlag: use_anon_rss_in_watchdog\nFixes: #7338"
    },
    {
      "commit": "5f9252ba1240fea9898fe9a9c3c0c271f96a2d22",
      "tree": "8a36c215b76262fc277ea4292b8d991569f6a269",
      "parents": [
        "82ae18be13391333957f9627fca7c6d49cb9f6dd"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Mon Sep 07 12:06:32 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 12:06:32 2026 +0100"
      },
      "message": "ui: Link memory overview bitmap section to heap dump explorer (#7349)\n\nAdd a link in the header controls of Memory Overview\u0027s bitmap section\nto navigate directly to Heap Dump Explorer\u0027s bitmaps view."
    },
    {
      "commit": "82ae18be13391333957f9627fca7c6d49cb9f6dd",
      "tree": "cea7554c120b146ca8774220a4622f72860bb969",
      "parents": [
        "5a618806d71355f42352337e0f6438eb4611822e"
      ],
      "author": {
        "name": "Ion",
        "email": "ivanterescheenko@gmail.com",
        "time": "Mon Sep 07 13:54:58 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 11:54:58 2026 +0100"
      },
      "message": "docs: document the strace textual format (#7226)\n\n**Depends on #7224 — please land that first.** This describes the strace\nimporter\u0027s behaviour *after* that fix; on current `main` a `-T` capture\nstill\nimports with zero-duration slices and the measured numbers below differ.\nHappy\nto hold this until #7224 is in.\n\n---\n\nPerfetto has had an strace importer since the plugin landed, but the\nformat is\nnot mentioned anywhere under `docs/`. A reader has no way to find out\nthat an\nstrace log can be opened at all, and — more painfully — no way to find\nout\nwhich strace flags produce a log that imports cleanly. Get either of\n`-ttt` or\n`-f` wrong and the trace loads to an empty timeline, with the\nexplanation\nburied in the `stats` table.\n\nThis adds a section to the external-formats guide covering:\n\n- what the importer maps into — thread-track slices, the `strace`\ncategory,\n  `args`/`ret`, `-T` durations, and blocked calls spanning their\n  `\u003cunfinished ...\u003e`/`\u003c... resumed\u003e` pair;\n- the two flags that are not optional (`-ttt`, `-f`) and why each is\nrequired,\n  each pointing at the stat that fires when it is missing;\n- the limitations worth stating up front — opaque argument strings, and\nthe\n  fact that a `ptrace`-based tool perturbs the timings it reports;\n- how to capture a log in the first place.\n\nTwo things in it are measured rather than asserted:\n\n- The example block is verbatim lines from an strace 6.13 capture, not\n  hand-written — same method as the diff-test fixture in #7224.\n- The \"use `-o FILE`, don\u0027t redirect stderr\" advice comes from tracing\n`sh -c \u0027ls /usr/bin \u003e/dev/null; sleep 0.1\u0027` both ways: with `-o`, all\n214\nsyscalls import and none are dropped; over stderr, 140 import and 76 are\n  dropped as `strace_missing_pid`, because strace leaves the process it\nstarted unprefixed until a second one is attached. For a program that\nnever\n  forks, the stderr capture imports nothing at all.\n\n`--syscall-times` is documented with the version it appeared in (strace\n5.6,\nper the project\u0027s `NEWS`) rather than left for the reader to discover by\ntrying it.\n\nVerified: `tools/run_presubmit` passes on this branch."
    },
    {
      "commit": "5a618806d71355f42352337e0f6438eb4611822e",
      "tree": "3799e5026031c280d95dd714ad44cde4619d0c42",
      "parents": [
        "03eb494aa44072131b9d4e5b4ae4f9c89f3358d5"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Mon Sep 07 11:42:20 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 11:42:20 2026 +0100"
      },
      "message": "ui: restore every probe setting when loading a record config (#7348)\n\nFixes #7347"
    },
    {
      "commit": "03eb494aa44072131b9d4e5b4ae4f9c89f3358d5",
      "tree": "6af426b465436c67be2696d5f0ac2d941081e1e0",
      "parents": [
        "d0d8c6fa5f7411b59fccacf99233e79bcf94e3fc"
      ],
      "author": {
        "name": "Ion",
        "email": "ivanterescheenko@gmail.com",
        "time": "Sat Sep 05 13:40:59 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 11:40:59 2026 +0100"
      },
      "message": "tp: fix the strace importer on real -f and -T output (#7224)\n\nI ran a plain `strace -ttt -T -f sh -c \"ls /usr/bin \u003e /dev/null; sleep\n0.05; echo done\"` (strace 6.13) and fed the 228-line result to\ntrace_processor. It produced zero slices and 152 parse failures. Four\nseparate things are wrong, all in the tokenizer I contributed in #6588.\n\n**`[pid N]` prefixes.** Writing to stderr, which is what a piped or\nredirected capture records, strace prints the pid as `[pid 75] ` rather\nthan the bare `75 ` form it uses with `-o`. The tokenizer only knew the\nbare form, so every line belonging to a followed process failed to\nparse. Both forms are accepted now.\n\n**strace\u0027s own diagnostics.** strace interleaves messages like `strace:\nProcess 75 attached` with the trace. The `:` in `strace:` made the\ntimestamp parser classify them as `-t`/`-tt` output, which raises\n`strace_unsupported_timestamp_format` telling the user to re-run with\n`-ttt` on a trace that already used `-ttt`. Those lines are recognised\nand skipped now, and format sniffing looks past them, so a log that\nopens with one (as `strace -f -p \u003cpid\u003e` does) is still detected as\nstrace instead of failing type detection outright.\n\n**Return value split.** The split ran forwards to the first `)` followed\nby `\u003d`, which lands in the middle of the arguments whenever an argument\ncontains one. wait4 prints its status through macros, so `\u003c... wait4\nresumed\u003e[{WIFEXITED(s) \u0026\u0026 WEXITSTATUS(s) \u003d\u003d 0}], 0, NULL) \u003d 75` gave a\nreturn value of `\u003d 0}], 0, NULL) \u003d 75`. The scan runs backwards from the\nend of the line now, which also covers a string argument containing `)\n\u003d` verbatim.\n\n**`-T` durations.** `-T` prints how long each call took (`\u003d 0\n\u003c1.004879\u003e`) and that was ignored, so every completed call became a\nzero-duration slice with the timing glued onto the return value. The\nsuffix becomes the slice duration now. Without `-T` slices stay\nzero-duration, exactly as before.\n\nThe same log imports as 139 slices across 3 threads, 135 of them with\ndurations, after the change.\n\nThe new diff-test fixture is lines from that real strace 6.13 output\nrather than something hand-written, with the root process\u0027s lines given\nthe same `[pid]` prefix strace uses when it is attached to several\nprocesses.\n\nRan `perfetto_trace_processor_unittests --gtest_filter\u003d\"*Strace*\"` (37\npass, 14 of them new), the full unit suite (2067 pass),\n`diff_test_trace_processor.py --name-filter \".*Strace.*\"` (11 pass, 3\nnew) and the same for `(Systrace|Atrace|PerfText|Ftrace)` to confirm the\nsniffing change doesn\u0027t disturb the neighbouring text formats (28 pass).\nThe repo\u0027s pre-push presubmit passes.\n\nWritten with Claude Code (Claude Opus 5); I reviewed and tested\neverything before submitting."
    },
    {
      "commit": "d0d8c6fa5f7411b59fccacf99233e79bcf94e3fc",
      "tree": "b5214292b8a7dc2819768642ecafb4416df23ab2",
      "parents": [
        "5759cb363463acfcd29b10c0d23ea460b21633b7"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Fri Sep 04 18:52:43 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 19:52:43 2026 +0100"
      },
      "message": "stdlib: add android.lock_held stdlib module (#7340)\n\nAdd `android.lock_held` stdlib module to track intervals when named\nlocks are held.\n\nMerge recursive holds, truncate exclusive holds across threads, and\nadopt in the `AndroidLockContention` UI plugin."
    },
    {
      "commit": "5759cb363463acfcd29b10c0d23ea460b21633b7",
      "tree": "0f2c739755e65891ef3adc0864195b64bb202b9b",
      "parents": [
        "c0def78172e9cf5579c68ec552aab5e90c62d247"
      ],
      "author": {
        "name": "Ryan VanderMeulen",
        "email": "ryanvm@gmail.com",
        "time": "Fri Sep 04 14:41:01 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 18:41:01 2026 +0000"
      },
      "message": "base: give flat_hash_map\u0027s IsLookupKeyAllowed external linkage (clang 23 -Wunused-template) (#7346)\n\n`flat_hash_map_v2_internal::IsLookupKeyAllowed` is a namespace-scope\n`constexpr` function template, so it is implicitly inline; declaring it\n`static` makes it an internal-linkage template that every translation\nunit including `flat_hash_map.h` without instantiating `FlatHashMap`\nnever instantiates. clang 23.1.0 puts `-Wunused-template` under `-Wall`\nand reports exactly that:\n\n```\nthird_party/perfetto/sdk/perfetto.cc:53071:23: error: unused function template \u0027IsLookupKeyAllowed\u0027 [-Werror,-Wunused-template]\n```\n\nwhich breaks `-Werror` consumers of the amalgamated SDK such as Firefox\n(seen building Firefox with clang 23.1.0 against SDK v56.1). Dropping\nthe `static` changes nothing else."
    },
    {
      "commit": "c0def78172e9cf5579c68ec552aab5e90c62d247",
      "tree": "3fd113fedcd6d2b64cca8e28533f655143e99f36",
      "parents": [
        "3dc2790526b7b0078aa131eeb40c9e681c993cdf"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 18:51:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 18:51:11 2026 +0100"
      },
      "message": "tp: prove finalized Dataframe supports concurrent cursors (#7343)\n\nAdds a ThreadSanitizer stress test that locks in the load-bearing\ncontract of the trace_processor multithreading effort: a finalized\ndataframe::Dataframe is safe for concurrent reads via independent\ncursors, requiring no external synchronization.\n\nEight threads each independently PlanQuery + PrepareCursor + Execute\nover the SAME shared finalized dataframe, for two query shapes:\n - a scan + two-key sort + projection that reads the string column\n   (StringPool::Get on the lock-free read path), and\n - an Eq filter on an unsorted, indexed integer column, which the\n   planner resolves via the index (asserted through the query\n   bytecode) so the shared index permutation vector is read\n   concurrently.\n\nEach thread compares its full row set against a single-threaded\ngolden. TSan reports zero data races: PlanQuery is stateless (the\nregister cache is call-local, not a shared per-dataframe cache),\nPrepareCursor copies storage/index pointers into per-cursor state,\nand the index is materialized at finalize time, not lazily on read.\n\nDocuments the finalized-read concurrency contract on the Dataframe\nclass. No production behavior change."
    },
    {
      "commit": "3dc2790526b7b0078aa131eeb40c9e681c993cdf",
      "tree": "346b157d984204d5b6d5e0f20717a22a8daf0498",
      "parents": [
        "de1cddbbf4e6ec3d099f8f448a6e043d95553dc9"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 18:51:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 18:51:11 2026 +0100"
      },
      "message": "tp: add concurrency stress-test harness for multi-threaded TP (#7342)\n\nAdds ConcurrentlyRun(), a header-only test utility that spawns N\nthreads,\nholds them all on a start barrier until the last arrives, then releases\nthem simultaneously to maximize the race-overlap window under TSan.\n\nThis is the foundation of the trace_processor multithreading effort:\nevery subsequent PR (concurrent dataframe cursors, StringPool reads,\nforked-connection query fan-out) is graded red-green against this\nharness\nunder out/linux_tsan.\n\nThe self-test verifies the invocation count and that threads genuinely\nrun concurrently (a rendezvous that fails rather than hangs if the\nharness\never ran sequentially). A DISABLED_ test documents that the harness\nsurfaces a real data race under ThreadSanitizer."
    },
    {
      "commit": "de1cddbbf4e6ec3d099f8f448a6e043d95553dc9",
      "tree": "6e0ca86108da37d2f8adad35cb5bd647d935fe22",
      "parents": [
        "3b2649a2b599a4bd8931736184839dc9aac79d6d"
      ],
      "author": {
        "name": "sanath099",
        "email": "sanath099@gmail.com",
        "time": "Fri Sep 04 12:27:20 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 12:27:20 2026 -0500"
      },
      "message": "tp: stdlib: add track-event-based JobScheduler queries (#5324)\n\nAdded a new module `android.job_scheduler_states_track_events` to\nprovide JobScheduler state tracking derived from track events. This\nco-exists with the existing statsd-based `android_job_scheduler_states`\nmodule.\n\nChanges:\n- Created `android.job_scheduler_states_track_events` module.\n- Implemented comprehensive state and reason mapping functions.\n- Added logic to carry forward requested_priority from SCHEDULED events.\n- Added diff tests using synthetic track event traces.\n- Retained existing statsd-based JobScheduler queries and tests.\n\nTest: tools/diff_test_trace_processor.py\n./out/dist/trace_processor_shell --name-filter \u0027.*job_scheduler.*\u0027"
    },
    {
      "commit": "3b2649a2b599a4bd8931736184839dc9aac79d6d",
      "tree": "6aa91fcf9704f5965601ab760b7f4c37672cd628",
      "parents": [
        "d6ee730638dee970e4e06035bffa237ed13a5828"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 17:59:59 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 17:59:59 2026 +0100"
      },
      "message": "tp: order tree rows parent first without breaking the pipeline (#7330)\n\nFolding down a tree needs every parent before its children. Unlike child\nfirst, that order needs no knowledge of the input as a whole: a row can\ngo out as soon as its parent has, so there is no reason to hold the\nwhole input.\n\nTreeParentFirst streams every row whose parent is already out as a view\nof its batch. A row arriving before its parent is copied aside and let\ngo\nthe moment the parent arrives, along with whatever is held under it. The\ncost is proportional to how far out of order the input is: nothing for\nordered input, everything for reversed input. The planner never needs to\nknow which, and never needs to leave the operator out.\n\nRows still held when the input ends name a parent which is never a row,\nwhich Finish() reports."
    },
    {
      "commit": "d6ee730638dee970e4e06035bffa237ed13a5828",
      "tree": "724c68b8f617b66731afd0c58a6ff58be1635109",
      "parents": [
        "6f0ea1db3695df0ae016c64bfb999a41f5be3fb9"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 17:59:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 17:59:11 2026 +0100"
      },
      "message": "tp: order tree rows child first (#7214)\n\nFolding up a tree needs every child before its parent, and needs the\norder to be a depth first post-order so the fold can carry a stack of\nthe current path instead of an array indexed by node. No source should\nhave that order imposed on it.\n\nTreeChildFirst is a breaker, because the first row out has to be a leaf\nand no row is known to be a leaf until the input ends. Rows which\narrived\nchild first come back as they arrived, rows which arrived parent first\nare reversed, and rows in neither order are sorted. Which of the three\nhappens is found out from the rows, so the planner only has to leave the\nbreaker out when it knows the input is already child first.\n\nThe breaker reports a node which is its own parent, a node with two\nrows,\na parent which is never a row, and a cycle."
    },
    {
      "commit": "6f0ea1db3695df0ae016c64bfb999a41f5be3fb9",
      "tree": "f9df04966f32b1cf93f9e8db039dc12ac670c2ef",
      "parents": [
        "301da0a7cedeb65090066eed60655a4a745bd9de"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 17:24:34 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 17:24:34 2026 +0100"
      },
      "message": "tp: finish operators after the last input (#7329)\n\nAn operator which holds rows back has nowhere to let them go once the\nsource runs dry, and no way to report rows it is still holding. Finish()\nis called once after the last batch and can return output, fan out, or\nfail, just as Execute() can.\n\nThe pipeline finishes its operators from the bottom up. Whatever one\nlets\ngo is pushed through the operators above it as ordinary input before the\nnext one is finished, so an operator sees all of its input before its\nown\nFinish() runs."
    },
    {
      "commit": "301da0a7cedeb65090066eed60655a4a745bd9de",
      "tree": "0888d3e54618e4333097cb009884c369aab3ec5a",
      "parents": [
        "e8c8a413533878000bf5508cc7e2725078734dfa"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 16:41:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 16:41:29 2026 +0100"
      },
      "message": "tp: add pipeline breakers (#7328)\n\nA plan is push all the way up and only pulled from at the top. Some\nsteps\ncannot be pushed through because nothing can come out until everything\nhas gone in, sorting being the classic case. Until now each such step\nhad to be written as a Source wrapping a Source and drain its input by\nhand, hiding that it is a sink for one pipeline and the source of the\nnext.\n\nBreaker makes that shape explicit. The pipeline below pushes each batch\ninto Consume(), Finish() runs once after the last, and only then does\nthe\npipeline above pull batches out. The base owns the input state, the\ndrain\nloop, error propagation from the input and rewinding, so a concrete\nbreaker only supplies the two halves."
    },
    {
      "commit": "e8c8a413533878000bf5508cc7e2725078734dfa",
      "tree": "a79e941556d8bfc405a3e55f145498918b57f7fd",
      "parents": [
        "269b4e55f8486d9ad461dedd1cfbe07c8de42b0e"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 16:41:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 16:41:29 2026 +0100"
      },
      "message": "tp: assign dense tree node numbers (#7213)\n\nTree IDs can be sparse, strings, or row IDs from a table much larger\nthan the\nquery result. Arrays indexed by those IDs would scale with the ID range\nrather\nthan the tree being processed.\n\nTreeNumberNodes assigns stable dense numbers as rows arrive and appends\nthe\nnumbered node and parent columns to each batch. A parent is numbered\nwhen first\nreferenced, so child-first input works even when the parent row appears\nlater.\n\nThe original columns stay in the batch. Later tree operators get compact\nindices without losing the values needed in the result."
    },
    {
      "commit": "269b4e55f8486d9ad461dedd1cfbe07c8de42b0e",
      "tree": "937f59ca8c938b1a1adf6ccfb51b9161ab14304a",
      "parents": [
        "2209b348ec265e6a1c46aeb7e999838e8a2c1d8a"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Fri Sep 04 12:15:49 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 15:15:49 2026 +0300"
      },
      "message": "ui: step through aggregate profiles with the arrow keys (#7336)\n\nReading an archive one profile at a time meant reopening the dropdown\nfor every step. Left and right now move to the neighbouring profile.\n\nThe dropdown steps through its own options when it has focus, so the\nhandler stays out of the way while it, or any editable element, is\nfocused. It also checks the page is on screen, since a page navigated\naway from stays mounted behind a closed gate."
    },
    {
      "commit": "2209b348ec265e6a1c46aeb7e999838e8a2c1d8a",
      "tree": "e294122bb68bcf6418eb519fad459417a5898e78",
      "parents": [
        "0b211a121f27578be65879d4794cf1d9ee68747d"
      ],
      "author": {
        "name": "Kean Mariotti",
        "email": "keanmariotti@google.com",
        "time": "Fri Sep 04 12:08:13 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 12:08:13 2026 +0000"
      },
      "message": "tools: add java_blob_emitter (#7339)\n\nThis commit adds java_blob_emitter.py, a build-time codegen tool\nanalogous to the already-existing cpp_blob_emitter.py. The tool takes\nbinary data as input and emits a Java class with a\n\"public static byte[] getBytes()\" method.\n\nBecause the JVM spec imposes a strict 64KB bytecode method size limit,\nbyte array literals containing roughly more than ~10,900 elements would\nresult in a too large static initializer and crash the compilation with\na \"code too large\" error. As a mitigation, the tool dynamically falls\nback to storing the data into a base64 string constant when the binary\npayload exceeds 8KB. If the threshold is not exceeded, the data is\nstored as a byte array literal.\n\nBug: 512718675"
    },
    {
      "commit": "0b211a121f27578be65879d4794cf1d9ee68747d",
      "tree": "0f03d7e31e58ed875264b318391e3696d8542f55",
      "parents": [
        "8a230965f362d1b96468138bbd81e8fdaa9505e8"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Fri Sep 04 11:29:55 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 11:29:55 2026 +0100"
      },
      "message": "perfetto: add sdk variant of libperfetto_client_experimental (#7311)\n\nModules built with sdk_version can only link deps that have an sdk\nvariant, and no perfetto library provided one.\n\n- Add sdk_version: \"current\" to libperfetto_client_experimental.\n  Existing platform/vendor/host consumers are unaffected.\n- Make perfetto_flags_c_lib force-read-only and give it sdk_version too.\n  Its production-mode deps (libbase, aconfig storage) have no sdk\n  variant. All flags read from C++ are fixed read-only, so no behaviour\n  change.\n- Set stl: \"libc++_static\" on both. sdk variants otherwise default to\n  the NDK \"system\" STL, which has no libc++.\n- Delete the obsolete, non read-only save_all_traces_in_bugreport flag.\n\nBuild and Tests pass:\n  - http://ag/q/topic:%22libperfetto_sdk_variant%22\n  -  http://android-build/abtd/run/L39000030178677719/\n  - http://android-build/abtd/run/L87100030178538702/"
    },
    {
      "commit": "8a230965f362d1b96468138bbd81e8fdaa9505e8",
      "tree": "4e7802d16c84a6b9bece77a15216b321791972e1",
      "parents": [
        "eb3a11f77049314020326402ee657c641a6f1bf9"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Fri Sep 04 09:41:25 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 12:41:25 2026 +0300"
      },
      "message": "bt-ui: convert bigtrace into a single-page application (#7127)\n\nReworks the Bigtrace UI into a cohesive single-page application,\nreplacing multi-page route navigation with a persistent, tabbed query\nworkspace.\n\nThis overhaul streamlines preset management, cleanly separates trace\ncorpus selection from query execution settings, introduces support for\ntrace UUID lists and experiment filters, and significantly reduces\nbackend load through debounced fetching and request coalescing.\n\nKey Changes:\n1. Single-Page Application Architecture:\n- Replaced multi-page routing (/home, /settings, /tables, /query) and\nthe left sidebar with tabbed query workspaces.\n- Added QueryLauncher: an integrated launch surface shown for new\nqueries and for configuring trace selections on existing queries.\n- Added LocalPresetStore to persist custom user presets in localStorage\nalongside the backend preset catalog.\n- Added a topbar connection button with real-time health checks to\nmanage backend endpoints.\n\n2. Decoupled Trace Selection \u0026 Query Settings:\n- Separated trace selection (which traces to query, corpus filters, and\nmetadata columns) from query execution options (row limits,\nmaterialization, and trace fan-out caps).\n- Moved query execution controls into an Advanced Query Settings modal\naccessible via the toolbar gear button.\n- Implemented transactional editing sessions with Cancel/Apply\nsemantics, ensuring in-progress edits can be discarded cleanly.\n\n3. Trace UUID Selection \u0026 Fan-Out Capping:\n- Added a dedicated UUID mode allowing users to paste lists of trace\nUUIDs (comma or whitespace separated) directly into a query.\n- Elevated the trace fan-out limit (`traceLimit`) to a first-class\nrequest parameter with mode-specific defaults.\n\n4. Experiment \u0026 Arm Filtering:\n- Added ExperimentFilterControl to search the /experiments catalog and\nfilter queries to specific experiment arms (Treatment vs. Control).\n- Resolved experiment display metadata asynchronously with memoization\nwhile preserving numeric IDs on the wire and across stored presets.\n- Added client-side support for named, expiring persistent result tables\n(`tableName`, `tableTtlDays`, and /check_table_exists).\n\n5. Performance \u0026 Network Optimizations:\n- Introduced FetchScheduler to debounce rapid scroll-triggered window\nrequests (150ms) and abort superseded in-flight requests.\n- Decoupled 3-second status polling from result data fetching: the poll\nnow monitors progress metrics only and avoids issuing full table scans\nwhile queries are still writing.\n- Removed the obsolete command palette / omnibox component (~600 lines)\nand added a direct theme toggle to the topbar.\n\nTesting:\n- Ran complete UI unit test suite: 155 test files passed, 2,659 tests\npassed.\n- Verified type checking (`ui/node ui/build.mjs --no-build --typecheck\n--bigtrace`).\n- Tested tab lifecycle, preset save/edit/delete flows, UUID mode\nswitching,\n  and experiment filtering"
    },
    {
      "commit": "eb3a11f77049314020326402ee657c641a6f1bf9",
      "tree": "576ae3f1add02fc57b317ce354ef3f5d02708544",
      "parents": [
        "3c6ef6dfedd4619318ac9a2c92092f8d0cb52707"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Fri Sep 04 08:59:28 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 08:59:28 2026 +0100"
      },
      "message": "ui: Add \u0027Show only direct flows\u0027 setting to FlowEvents plugin (#7296)\n\nAdd a new setting `dev.perfetto.DirectFlowsOnly` which, when enabled,\nonly renders the immediate flows for a given slice when selected, rather\nthan following the entire flow chain via BFS. This is useful for traces\nwith dense flow graphs (e.g. build dependencies) where the full-chain\ntraversal causes the UI to grind to a halt.\n\nThe setting is registered by the FlowEvents plugin and defaults to off\n(preserving current behaviour). When enabled, the sliceSelected query\nuses a simple `WHERE` clause on the flow table instead of the\n`directly_connected_flow()` table function.\n\nFixes https://github.com/google/perfetto/issues/1004"
    },
    {
      "commit": "3c6ef6dfedd4619318ac9a2c92092f8d0cb52707",
      "tree": "8c90c39380659f79706ec81cec2495d6ee993861",
      "parents": [
        "25ae4a99e193b7a2323ca606ad1a327e112a11a5"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 01:01:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 01:01:46 2026 +0100"
      },
      "message": "tp: let TraceBlob wrap memory it does not own (#7269)\n\nTraceBlob can hold heap memory it allocated or an mmap region, so a\ncaller that already has the bytes somewhere else has no way to hand\nthem over: it has to copy them into a blob first.\n\nAdd an ownership mode that wraps a pointer and holds a shared_ptr to\nwhoever owns it, for as long as the blob and every TraceBlobView onto\nit. Give Rpc::Parse() an overload taking a TraceBlobView so callers can\nuse it; the pointer-and-length overload stays and now copies through\nTraceBlob::CopyFrom() rather than open-coding new[] and memcpy.\n\nNo behaviour change: nothing adopts anything yet."
    },
    {
      "commit": "25ae4a99e193b7a2323ca606ad1a327e112a11a5",
      "tree": "45980ebb926437f364f37e490249997039ffcf00",
      "parents": [
        "99c1da243398ebf9fe2f9f4607aaed9bcb29d071"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 01:01:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 01:01:46 2026 +0100"
      },
      "message": "protozero: remove Append() and its fastpath (#7267)\n\nAppend()\u0027s fastpath returned messages pointing into the caller\u0027s buffer,\nvalid only until the next call. That is why RemoteTraceProcessor had to\nhoist its read buffer out of the loop, and it is what stops a Message\nfrom owning its storage. Every caller now writes through BeginWrite(),\nso both can go.\n\nAlso collapses RingBufferMessageReader into ProtoRingBuffer: the virtual\nhad a single production implementation, and a test-only subclass whose\ncoverage the ProtoRingBuffer tests subsume.\n\nThe benchmarks added to motivate the switch go too: their \"before\" arm\nis the staging buffer this removes."
    },
    {
      "commit": "99c1da243398ebf9fe2f9f4607aaed9bcb29d071",
      "tree": "220fc53625534eb444b626a71c4e9605193d4ab8",
      "parents": [
        "8980920568f3b55813265195e99daba11a03ba07"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Fri Sep 04 01:01:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 01:01:46 2026 +0100"
      },
      "message": "base: stream HTTP and websocket payloads into the handler\u0027s buffer (#7266)\n\nThis makes it such that instead of the HttpServer providing the buffer\nfor HTTP/Websocket payloads, it instead asks the handler for where they\nwould like the payload to be stored.\n\nThe flow looks like this: socket read -\u003e HTTPServer reads the\nheaders/framing -\u003e once it knows the size it calls OnHttpRequestBody or\nOnWebsocketPayload depending on the message type -\u003e the handler provides\nthe storage bytes -\u003e httpserver reads into those provided buffers.\n\nThe motivation for this is that it removes one copy allowing for\n\"zero-copy\" parsing and tokenization etc.\n\nThe motivation for this is multi-threaded trace processor which requires\nfast-handoffs of buffers between threads and reducing the latency of the\nparse path (because we\u0027re going to be adding latency by a cross thread\nhop). This change is one step on that journey.\n\nBecause a payload is now read across several socket reads, more than one\ncan be in flight at a time, so every buffer the handler hands out has to\nbelong to the connection asking for it. RPC payloads go into that\nconnection\u0027s Rpc::Stream, added in the previous change; the bodies of\nthe non-RPC endpoints go into a per-connection buffer alongside it.\nSharing either across connections lets one connection\u0027s payload be\ndispatched into another\u0027s, or freed under it when the buffer grows.\n\nThe origin check moves above the point where the body is requested, so a\nrequest that is about to be refused with a 403 is never handed a payload\nsink to write into.\n\nThe reservation is held in the connection\u0027s state between the two calls,\nso a peer that disappears mid-payload gives it back explicitly rather\nthan leaving the tokenizer believing a write is still in flight."
    },
    {
      "commit": "8980920568f3b55813265195e99daba11a03ba07",
      "tree": "05dab431f93f0e257efc8be9ed3388db88c48119",
      "parents": [
        "4386a0ee5f5dafdc8863fab735989c3bea867035"
      ],
      "author": {
        "name": "Safayat Ullah",
        "email": "safayat@google.com",
        "time": "Thu Sep 03 23:17:51 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 23:17:51 2026 +0100"
      },
      "message": "traced: Don\u0027t compress clock snapshot, trace config and uuid (#7300)\n\nThese packets can be useful for services that consume the trace\non-device. Keep them uncompressed even in presence of a compression_type\nsetting, so that on-device services can inspect trace metadata without\nhaving to uncompress the trace.\n\n- cherrypick of aosp/2815935\n\nTest: perfetto_unittests --gtest_filter\u003dTracingServiceImplTest.*Compr*\nBug: 302357655\n\n---------\n\nCo-authored-by: Primiano Tucci \u003cprimiano@google.com\u003e"
    },
    {
      "commit": "4386a0ee5f5dafdc8863fab735989c3bea867035",
      "tree": "081f2f8e326cd9fea581fee2dd6422dd76cf2519",
      "parents": [
        "9aa4e2e09b82a0b82537ad19ea3ce4653fbf9d5d"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Thu Sep 03 21:13:59 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 00:13:59 2026 +0300"
      },
      "message": "ui: add copy button for aggregate profile name and fix initial render (#7333)\n\nAdd a copy button next to the aggregate profile selector so member\nfilenames in multi-pprof archives can be copied from the native select.\n\nAlso fix the initial page render (existing bug) by scheduling a redraw\nand propagating the selected profile state to createFlamegraph so the\nflamegraph mounts immediately on load."
    },
    {
      "commit": "9aa4e2e09b82a0b82537ad19ea3ce4653fbf9d5d",
      "tree": "a071596248a53acb5c85b48ce9f8e1cddc30d8f5",
      "parents": [
        "3e9c093e6a8719df1c957a6f8e167125ec1b8a60"
      ],
      "author": {
        "name": "Parth Sane",
        "email": "parthsane@gmail.com",
        "time": "Thu Sep 03 18:23:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 17:23:49 2026 +0000"
      },
      "message": "perfetto: expose PerfettoSDK Java libs to ART modules (#7230)\n\nExpose Perfetto Java SDK and JNI libraries for Libcore / ART\nintegration:\n- Add jarjar rules for dalvik.system.dev.perfetto.sdk.\n- Conditionally expose JNI_OnLoad_Perfetto when LIBCORE_INTEGRATION is\ndefined.\n- Add libperfetto_jni_static, perfetto_jarjar_rules_files, and\nperfetto_trace_lib_libcore_java targets in Android.bp.extras.\n- Update tools/gen_android_bp to set apex_available and min_sdk_version\non SDK libraries."
    },
    {
      "commit": "3e9c093e6a8719df1c957a6f8e167125ec1b8a60",
      "tree": "e9c5c4de662157d81be616cb9c3700bebb974f23",
      "parents": [
        "87f0c25cfa45b51c2aaf0e68a41947c23c6d1f0f"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Sep 03 18:08:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 17:08:29 2026 +0000"
      },
      "message": "ui: Fix connected flows panel showing all connected flows (#7334)\n\nThe consolidation of flow events into a single plugin in #7030\nintroduced a bug where the single selection flow events panel now\ndisplays all following events in the chain.\n\nThis patch limits the output of `getConnectedFlows()` to directly\nconnected ones only.\n\nNote: While filtering in JS like this is inefficient - this is what the\nold code did. Optimising this is a problem for another patch."
    },
    {
      "commit": "87f0c25cfa45b51c2aaf0e68a41947c23c6d1f0f",
      "tree": "6e06db2b6a58131a7c51161e13142aeeb115d03c",
      "parents": [
        "958446de75cbaf0cbcd8defa1c6e5d4bb04d8b60"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Thu Sep 03 14:35:17 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 14:35:17 2026 +0100"
      },
      "message": "ui: Serialise workspaces to permalink (#6930)\n\nSerialise and restore all non-default workspaces to the permalink.\n\nWhen workspaces are present in the serialised state - all non-default\nworkspaces are wiped and replaced with the workspaces from the\npermalink.\n\nThe currently selected workspace is also stored and restored.\n\nLocalstorage testing:\n- Create some workspaces, move some tracks over and pin some tracks on\nthose workspaces.\n- Rename the workspace.\n- Run Mod+Shift+P -\u003e Quicksave UI state to localStorage\n- Reload the page (resets the state).\n- Run Mod+Shift+P -\u003e Quickload UI state from localStorage\n- Check the workspaces have been restored.\n\nPermalink testing (internal only):\n- Create some custom workspaces as above\n- Click share to share the trace + UI state.\n- Copy the link and paste into a new tab.\n- Check the workspaces have been restored.\n\nFixes: b/556607258"
    },
    {
      "commit": "958446de75cbaf0cbcd8defa1c6e5d4bb04d8b60",
      "tree": "a43c3769189247167f02a722d70b1348bb809874",
      "parents": [
        "5a553c958ffd838ab38eaac5059d7ed6b7f9cac3"
      ],
      "author": {
        "name": "dragosp95",
        "email": "dragosp@google.com",
        "time": "Thu Sep 03 16:23:29 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 16:23:29 2026 +0300"
      },
      "message": "Add the new extension merger in the gen_bazel tool (#7332)\n\nAdd the new extension merger in the gen_bazel tool.\n\nThis will help correctly generate the BUILD rules for the new tool"
    },
    {
      "commit": "5a553c958ffd838ab38eaac5059d7ed6b7f9cac3",
      "tree": "d53c35012d99d2321af4deebef64fbca4cfb33e9",
      "parents": [
        "4a3f2740779837b4007472655822c5a5650516d1"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 14:09:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 14:09:10 2026 +0100"
      },
      "message": "tp: give the RPC layer one framing stream per connection (#7274)\n\nRpc holds a single tokenizer for the whole process, even though several\ntransports serve more than one peer at a time. A tokenizer holds the\nmessage that arrived in pieces, so interleaving the bytes of two peers\ninto one corrupts both.\n\nunixd.cc had already worked around this by keeping a ProtoRingBuffer per\nconnection and forwarding only whole messages, and httpd.cc is about to\nneed the same thing: once it reads payloads straight into the tokenizer,\ntwo connections mid-payload at once alias each other\u0027s memory.\n\nIntroduce Rpc::Stream, owning the framing state of one byte-pipe: the\ntokenizer and the response function. Transports that serve one peer\n(Wasm, stdiod) hold one stream; those that serve many (httpd, unixd)\nhold one per connection. unixd loses its hand-rolled tokenizer and\nmessage-forwarding loop, as the stream does that now.\n\nThe message sequence ids deliberately stay on Rpc, shared by every\nstream. They are not framing state: a second peer numbering its requests\nfrom its own 0 breaks the sequence, and that is how two clients on one\nTraceProcessor - two UI tabs on the same --httpd instance, say - are\ndetected and told so. Per-connection tokenizers make that check more\nuseful rather than replacing it, because the peers now reach it with\ntheir framing intact instead of first shredding each other\u0027s messages.\n\nThis also retires the SetRpcResponseFunction(fn)/SetRpcResponseFunction\n(nullptr) dance every transport had to perform around each dispatch: the\nresponse function is handed to the stream once, at construction."
    },
    {
      "commit": "4a3f2740779837b4007472655822c5a5650516d1",
      "tree": "f1a77f77d811c4e786aca79d6965b4895d303108",
      "parents": [
        "cdf046c8da642b7cdf3f89c247a7a6ff39974153"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 14:09:09 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 14:09:09 2026 +0100"
      },
      "message": "ui: write wasm RPC requests directly into the tokenizer (#7265)\n\ntrace_processor_rpc_init() allocated a 32MB request buffer that JS wrote\ninto\nand C++ copied out of on every chunk. The tokenizer holds a standing\nreservation instead and hands back the address for the next write, so\nnothing\nis copied and it stays at one JS-\u003eWasm call per request.\n\nEntry points are resolved once with cwrap() instead of ccall(), which\nredoes\nthe symbol lookup and argument marshalling on every call. For a numeric\nsignature cwrap() returns the raw wasm export, so this is as direct as\nit gets:\n29.6 ns -\u003e 4.5 ns per call.\n\n  memory64, vs the staging buffer: trace load -61.5%, queries -23.7%\n\naddFunction() was declared as returning void; it returns a function\npointer.\nccall()\u0027s any[] hid that, cwrap()\u0027s number[] does not."
    },
    {
      "commit": "cdf046c8da642b7cdf3f89c247a7a6ff39974153",
      "tree": "1c29e2c2ba105807cf406af617a466e7e5e35a06",
      "parents": [
        "8122f1682afbad53b1952c1afa9586943508ea18"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 13:20:48 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 13:20:48 2026 +0100"
      },
      "message": "protozero: let transports read directly into ProtoRingBuffer (#7264)\n\nEvery transport kept a staging buffer, read into it, then handed those\nbytes to Append(), which copied them again. BeginWrite()/EndWrite() lets\nread(2) deposit them in the ring buffer directly, so they are copied\nonce.\n\nThe reservation is handed out as a move-only WriteHandle that must be\nconsumed exactly once, by EndWrite() to keep what was written or\nAbortWrite() to discard it; dropping one fails a CHECK. Holding it in a\nvalue the compiler tracks is what makes the pattern safe to use: the\nbuffer refuses to recompact, grow or hand out a second reservation while\none is outstanding, so bytes cannot move under a pointer someone still\nholds. Rpc::RequestHandle carries the same contract out to the\ntransports.\n\n```\n  out/linux_clang_release/perfetto_benchmarks \\\n      --benchmark_filter\u003d\u0027ProtoRingBufferIngest|ProtoRingBufferDispatch\u0027\n  ingest, 4KB reads    142 ns -\u003e 98.3 ns\n  ingest, 1MB reads   38.4 us -\u003e 19.2 us\n  dispatch             171 ns -\u003e 99.1 ns\n```\n\ntraceconv also drops a 64MB read buffer: peak RSS 62.7MB -\u003e 13.6MB."
    },
    {
      "commit": "8122f1682afbad53b1952c1afa9586943508ea18",
      "tree": "6e1631909c2dec7f979225246075bc3f5aecc1fb",
      "parents": [
        "127645ff2e1c7781629f17a8085e16f921bdc343"
      ],
      "author": {
        "name": "Elisa (Zi-Yi) Tai",
        "email": "47915194+zytyz@users.noreply.github.com",
        "time": "Thu Sep 03 04:37:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 11:37:05 2026 +0000"
      },
      "message": "ui: GpuCompute: correct the Summary tab and rename Workload Analysis (#7242)\n\nSmall fixes so a vendor plugin can register its own metrics into the\nGpuCompute tab.\n\n- Fix the Summary tab so a dependent plugin\u0027s metric ids reach it. The\nprefetch ran before those plugins had registered, so the columns came\nout\n  empty and stayed empty.\n\n- Scale the compute and memory throughput bars against the hardware peak\nrather than the largest value in the table, and label them with a\npercent\nsign. On a capture spanning 0.03% to 0.93% of peak, a kernel at the mean\n  0.47% filled 51% of its bar, and the busiest always pinned at 100%.\n\n- Rename \"Workload Analysis\" to \"Compute Workload Analysis\". It covers\nper-pipeline compute utilization only, and the plain name collides with\nthe\n  memory counterpart a vendor plugin registers alongside it.\n\n- Rename the matching workflow in the Perfetto agent skill, so an agent\nand a\n  user read one name for one section."
    },
    {
      "commit": "127645ff2e1c7781629f17a8085e16f921bdc343",
      "tree": "a5814a8e0c5663f3ac8e0148f370716e9a20aa8e",
      "parents": [
        "7d325b585ea6cc5ee4af88f1600999f5f9302be8"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 12:03:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 12:03:14 2026 +0100"
      },
      "message": "tp: validate variant column types (#7167)\n\nA SqlScan column uses Variant when lineage cannot prove one storage\ntype.\nTyped operators need to check those values before reading them as a flat\ncolumn.\n\nAssertType checks every selected row against the requested type and\nproduces a\nflat column. Nulls remain null. Narrow integers can widen when the\nconversion\nis exact; other mismatches stop the pipeline and name the offending\ncolumn.\n\nThis is an operator rather than part of SqlScan because the consumer,\nnot the\nsource, decides what type a column must have."
    },
    {
      "commit": "7d325b585ea6cc5ee4af88f1600999f5f9302be8",
      "tree": "e8c83c8a3029ff3e01bffd3ca3388137b76469b6",
      "parents": [
        "b36e97037c37af0b4d03de255e61fef4c5e24923"
      ],
      "author": {
        "name": "Safayat Ullah",
        "email": "safayat@google.com",
        "time": "Thu Sep 03 11:49:32 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 11:49:32 2026 +0100"
      },
      "message": "profiling: Update RegsFake test helper for libunwindstack API changes (#7200)\n\nplatform change: http://ag/41639901"
    },
    {
      "commit": "b36e97037c37af0b4d03de255e61fef4c5e24923",
      "tree": "f54ae0f1e597e84d6f227fa3160c426743c95741",
      "parents": [
        "7dec8e0edf00eb0a92cf8acfe7aa18a2d3e3164f"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Thu Sep 03 12:19:00 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 12:19:00 2026 +0300"
      },
      "message": "tp+ui: scope pprof archive members and intern fallback mappings (#7294)\n\n### Summary\n\nImproves multi-pprof archive support in Trace Processor by correctly\nscoping members and interning fallback mappings, and fixes a UI profile\nselection bug on the Aggregate Profiles page:\n\n- Archive member scoping (TP): Scopes imported pprofs by their member\nfilename within archives (walking past unnamed gzip layers) instead of\ndefaulting all to pprof_file. The file ID is passed directly to the\nPprofTraceReader constructor from the parser, with ancestor naming\nencapsulated in TraceFileTracker.\n- Fallback mapping \u0026 frame interning (TP): Names the interned fallback\nmapping \"[pprof unknown]\" and uses\nVirtualMemoryMapping::InternFrameAndCheckIfNew() to skip re-symbolizing\nframes already interned by earlier profiles in an archive, preventing\nframes/mappings/symbols from scaling linearly with profiles × locations.\n- Profile selector fix (UI): Fixes a state clobbering bug in\nAggregateProfilesPage where switching profiles in the dropdown caused\nthe selector to snap back to the previous profile.\n  - Controls layout \u0026 styles (UI):\n- Consolidates the profile selector onto the left of the controls row\nalongside help buttons, eliminating a redundant row of chrome above the\nflamegraph.\n- Corrects the stylesheet root class (.pf-pprof-page →\n.pf-aggregate-profiles-page) so page padding, selector sizing, and\ncontrol styles take effect.\n\n  ### Visual comparison on a ZIP with 100 pprofs\n  \n  ### Before: can\u0027t select the pprof\n\u003cimg width\u003d\"3254\" height\u003d\"228\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/8b3c6051-ae38-4ca8-a719-29970a705988\"\n/\u003e\n\n\n### After: can select the pprof\n\u003cimg width\u003d\"2220\" height\u003d\"272\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/be2844e1-4cfb-462b-a37b-6b007bf31854\"\n/\u003e\n\n\n  ### Testing\n\n• TP diff tests: tools/diff_test_trace_processor.py\n\u003cout\u003e/trace_processor_shell --name-filter\u003d\".\\*pprof.\\*\" (13/13 passed)\n  • UI unit tests: ui/run-unittests -n (all passed)"
    },
    {
      "commit": "7dec8e0edf00eb0a92cf8acfe7aa18a2d3e3164f",
      "tree": "5aa322113715acf6d1cba152adb181a2855fc1b2",
      "parents": [
        "222a9602e4309cf2f04a3f4d67b8e6bed9557e71"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 09:47:30 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 09:47:30 2026 +0100"
      },
      "message": "tp: signifcantly reduce symbolization traffic to llvm-symbolizer (#7315)\n\nWe were not properly deduplicating mappings across processes when we\nwere symbolizing with llvm-symbolizer meaning we were unnecessarily\ndoing tons of extra IO operations and symbolization requests. This\nwas further compounded by switching back and forth between mappings\ninstead of consistently doing all the symbolization for one mapping\nthen moving onto the next.\n\nBug: https://github.com/google/perfetto/issues/6383"
    },
    {
      "commit": "222a9602e4309cf2f04a3f4d67b8e6bed9557e71",
      "tree": "21ec0fe1f0315dbd39e23788b39b6f2c456f3308",
      "parents": [
        "78c48fcab714ccbd4330e177394867693999b56d"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 09:37:22 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 09:37:22 2026 +0100"
      },
      "message": "perfetto: pin the PyPI package to its own release prebuilts (#7321)\n\nThe Python package is built from the release tag, but the prebuilt\nmanifests are rolled on main only after tagging, since they hash the\nbinaries LUCI builds from the tag. Every release since #6133 has\ntherefore shipped the previous release\u0027s trace_processor.\n\nTreat the manifests as a release artifact instead: the finalize job\nhands the rolled manifests to the PyPI job, the manual script rolls\nthem itself, and setup.py refuses a release build whose pin does not\nmatch its version.\n\nFixes #7314"
    },
    {
      "commit": "78c48fcab714ccbd4330e177394867693999b56d",
      "tree": "7a34a52c20914994dd530cd2fce6cfc422cc7727",
      "parents": [
        "58e1a1940f11f868c0038b72947ab646992a70cb"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Thu Sep 03 00:12:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 00:12:19 2026 +0100"
      },
      "message": "tp: scan SQL queries into batches (#7151)\n\nQueries which filter, join, group, or compute still need SQLite. SqlScan\nsteps\na prepared statement and fills RowBatch instances instead of exposing\nthe\nrow-at-a-time cursor to the rest of the pipeline.\n\nLineage decides how each result column is stored. Columns traced to a\ndataframe come out flat at the proven type. Other columns use Variant\nbecause\nSQLite may return a different type on each row.\n\nPreparing, stepping, and rewinding the statement all follow the Source\nstatus\ncontract. Type validation is left to the operator which knows how a\ncolumn\nwill be used."
    },
    {
      "commit": "58e1a1940f11f868c0038b72947ab646992a70cb",
      "tree": "141f7b3ea77b6dbb13945d9a6c2cd1a82213401a",
      "parents": [
        "feb4ef454b237907554fd747867dff9d8f76ed71"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 02 22:39:15 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 22:39:15 2026 +0100"
      },
      "message": "tp: scan dataframes without SQLite (#7165)\n\nA query which only reads a dataframe gives SQLite nothing to do. The\nvalues\nalready have storage types and are laid out the way a batch needs them.\n\nDataframeScan returns views over the dataframe\u0027s storage without\ncopying.\nColumns without one slot per row are expanded one batch at a time into a\nreused buffer, so they still look dense to downstream operators.\n\nThe planner only takes this path for passthrough dataframes. Filtering,\njoining, grouping, and expressions still go through SQLite."
    },
    {
      "commit": "feb4ef454b237907554fd747867dff9d8f76ed71",
      "tree": "45a06cbceeee20a6ebcaf978b853c685aa61f23c",
      "parents": [
        "ff6954cc8b5687bb7d5cebde3e922277ee15c87f"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 02 19:11:25 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 19:11:25 2026 +0100"
      },
      "message": "tp: add a batch execution pipeline (#7135)\n\nTrace processor moves rows one at a time through a cursor. That\ninterface\nworks well for callers, but upstream it costs a virtual call and bounds\ncheck\nper row and prevents operators from working over a run of values.\n\nAdd a batch pipeline alongside the cursor. RowBatch holds column views\nover\nproducer-owned storage, so filtering changes a selection instead of\nmoving\nvalues. Operators hold only plan data; mutable execution state is owned\nseparately, which makes plans safe to reuse.\n\nValues normally live until the producer\u0027s next pull. RowStore copies\nthem into\nfixed-size chunks when an operator needs to keep them longer. Later\nchanges add\nsources and operators on top of these primitives."
    },
    {
      "commit": "ff6954cc8b5687bb7d5cebde3e922277ee15c87f",
      "tree": "891019e2762dd2a21534d2520d2ea802f6a28e14",
      "parents": [
        "66bd188c5b87ecad0171e205b1a03b4380511737"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 02 18:33:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 18:33:01 2026 +0100"
      },
      "message": "tp: trace SQL columns to dataframes (#7212)\n\nSQLite declarations do not bind result types, so the executor needs\nsemantic\ncolumn origins before it can select flat storage.\n\nReuse the shared PerfettoSQL relation analyzer for that work. The\nanalyzer owns\nparsing view definitions and reports canonical leaf relation names as\norigins.\nViews are parsed on demand for now; a TODO records that caching those\nparsed\ndefinitions would avoid repeated parser allocation if this becomes\nmeasurable.\n\nThe trace processor adapter is limited to three boundary operations:\n- expose a live dataframe as a leaf relation;\n- return SQLite\u0027s stored CREATE VIEW SQL;\n- map resolved leaf columns to dataframe storage types.\n\nAliases, subqueries, joins, compound queries, and row-origin semantics\nremain\nowned by `src/perfetto_sql/analysis`."
    },
    {
      "commit": "66bd188c5b87ecad0171e205b1a03b4380511737",
      "tree": "ccd87262efd07ab233e0fc43760454a80f1fa4a0",
      "parents": [
        "e1c8a56313af59c335d8c2ed7098dba0b528a57e"
      ],
      "author": {
        "name": "Runping Lai",
        "email": "runpinglai@google.com",
        "time": "Wed Sep 02 09:44:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 09:44:54 2026 -0700"
      },
      "message": "tp: Add Wattson CPU power model for Tensor G6 (#7301)\n\nAdd Wattson CPU 1D power curves and topology definitions for Tensor G6\n(Pixel 11):\n- Add 1D active/idle/static curves for Policy 0, 2, 6 and DSU (policy\n255).\n- Register Tensor G6 CPU topology (2+4+1) and devfreq configuration\n  in device_infos.sql.\n- Add _filtered_curves_dsu_1d table in curves/utils.sql to support\n  standalone 1D DSU power modeling directly from cpu_1d curves.\n- Integrate 1D DSU curve lookup into dsu_scu_mw calculation in\n  cpu/estimates.sql while preserving legacy 2D interconnect lookup.\n\nBug: 553610666\nTest: UI and TP test\n\n---------\n\nSigned-off-by: Runping Lai \u003crunpinglai@google.com\u003e"
    },
    {
      "commit": "e1c8a56313af59c335d8c2ed7098dba0b528a57e",
      "tree": "7e41d76e8f67bf708e163a855a02c511ac5dff61",
      "parents": [
        "cca2e3dc87233dc1c39d74e29347ce5392854915"
      ],
      "author": {
        "name": "Lalit Maganti",
        "email": "lalitm@google.com",
        "time": "Wed Sep 02 16:42:31 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 15:42:31 2026 +0000"
      },
      "message": "base: make more tests compile on all platforms (#7310)\n\nThere\u0027s no reason to gate these tests *and* also fix a shadowing issue\nwhile I\u0027m there."
    },
    {
      "commit": "cca2e3dc87233dc1c39d74e29347ce5392854915",
      "tree": "66879e30d1470899d0f7cf6cd7734ee9b508841b",
      "parents": [
        "fc6a7ef8e2192bd4c2c96a62fd42d2155f280a17"
      ],
      "author": {
        "name": "Ryan Zuklie",
        "email": "rzuklie@google.com",
        "time": "Wed Sep 02 10:14:19 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 10:14:19 2026 -0400"
      },
      "message": "Promote BatteryStatus and PlugType to top level tracks. (#7303)\n\nThese previously were top level when emit by the periodic poller, but\nprocess level when emit by atrace. This leads to two separate track_ids\nthat can lead to incorrect results when trying to use them normally.\nThis fixes #7302"
    },
    {
      "commit": "fc6a7ef8e2192bd4c2c96a62fd42d2155f280a17",
      "tree": "ae541aee1e8db2315d6c436bf7b4988c209e846b",
      "parents": [
        "d791dc0a7af5707848ae8417b6f61501cf743a35"
      ],
      "author": {
        "name": "gignat-dev",
        "email": "gignat@google.com",
        "time": "Wed Sep 02 15:48:01 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 13:48:01 2026 +0100"
      },
      "message": "ui: AndroidLockContention: link held locks to their slice (#7309)\n\nEmit slice_id and table_name in the held locks debug track query so\nDebugSliceTrackDetailsPanel can link each held lock back to its\nunderlying slice. Also explicitly include intervals.overlap module."
    },
    {
      "commit": "d791dc0a7af5707848ae8417b6f61501cf743a35",
      "tree": "9267201798540a2e832834338e140e4b4717c8e4",
      "parents": [
        "52bcf2126bc45a077b9d97c91c78e93cf1407eb1"
      ],
      "author": {
        "name": "sashwinbalaji",
        "email": "sashwinbalaji@google.com",
        "time": "Wed Sep 02 11:40:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 11:40:11 2026 +0100"
      },
      "message": "base: Remove use_pcre2 flag (#7306)\n\nBug: 556095727"
    },
    {
      "commit": "52bcf2126bc45a077b9d97c91c78e93cf1407eb1",
      "tree": "379b1e9aa4895591fd9822608c951ab6cda442ef",
      "parents": [
        "da8eb3f29700c6a5f407d65dd847537541e29f2f"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Wed Sep 02 11:35:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 11:35:24 2026 +0100"
      },
      "message": "docs: Update memscope docs for all-channel availability (#7305)\n\nMemscope and Memory Overview are now available on all branches, not just\nAutopush and Canary. Update the note in the Memscope docs to reflect\nthis but recommend canary/autopush for the best experience."
    },
    {
      "commit": "da8eb3f29700c6a5f407d65dd847537541e29f2f",
      "tree": "00d0bf33d40ed496341b2322618e73d68a038fdd",
      "parents": [
        "3241d99a5a5ee69d393cf8351cb9d7f9109e9a78"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Wed Sep 02 11:35:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 11:35:00 2026 +0100"
      },
      "message": "ui: Add changelog entries for recent UI changes (#7307)\n\nUpdate changelog to include some notable changes that have been missed\nrelated to the UI."
    },
    {
      "commit": "3241d99a5a5ee69d393cf8351cb9d7f9109e9a78",
      "tree": "e906724699c760f6cf02ef41c54d43e614e84b6c",
      "parents": [
        "3d2f33db76793e7bd41b7de7de43345947454a15"
      ],
      "author": {
        "name": "Samuel Wu",
        "email": "wusamuel@google.com",
        "time": "Wed Sep 02 01:19:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 09:19:17 2026 +0100"
      },
      "message": "traced: Remove sys_stats_large_read flag (#7304)\n\nCleanup large sys_stats flagging.\n\nSince the read() syscall is not guaranteed to return the same number of\nbytes as requested, read() must be called in a loop until the desired\nnumber of bytes is returned.\n\nThe flagging commit was introduced in\n811e50e3c19da79edebaefb0c10329f8742f8e5f (traced: Handle sys_stats\npread() returning fewer bytes (#5527))\n\nBug: 555896758\n\nSigned-off-by: Samuel Wu \u003cwusamuel@google.com\u003e"
    },
    {
      "commit": "3d2f33db76793e7bd41b7de7de43345947454a15",
      "tree": "2ecdd17caa673cf6d2835665327a2ce1b16954c7",
      "parents": [
        "c1f6c68e3ec3b46418faf857a5114fa4b8a9bdd3"
      ],
      "author": {
        "name": "Runping Lai",
        "email": "runpinglai@google.com",
        "time": "Wed Sep 02 01:00:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 01:00:21 2026 -0700"
      },
      "message": "tp: Add GPU Wattson support for Tensor G6 (#7298)\n\nAdd GPU power model curves and device info mapping for Tensor G6. This\nenables Trace Processor to estimate GPU subsystem power on Tensor G6\ndevices by integrating GPU frequency transitions and power state\ntracking in Wattson.\n\nBug: 555772124\nTest: UI and tp test\n\nSigned-off-by: Runping Lai \u003crunpinglai@google.com\u003e"
    },
    {
      "commit": "c1f6c68e3ec3b46418faf857a5114fa4b8a9bdd3",
      "tree": "fcfb87f695da437e2edded3109009d5d44de6212",
      "parents": [
        "56b3c449c968296bda3831d7cd2e0d2140acc9e9"
      ],
      "author": {
        "name": "Runping Lai",
        "email": "runpinglai@google.com",
        "time": "Wed Sep 02 01:00:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 01:00:05 2026 -0700"
      },
      "message": "tp: Add Tensor G6 TPU power curves to Wattson (#7299)\n\nAdd TPU power model curves for Tensor G6 (Pixel 11) covering Cluster 0\nand Cluster 2 across all 17 DVFS frequencies with concurrency up to 16\nparallel requests.\n\nUpdate `_tpu_estimates_mw` in `wattson/tpu/estimates.sql` to dynamically\nclamp parallel requests based on the maximum request count defined in\nthe loaded curves table instead of hardcoding a limit of 8.\n\nBug: 555772464\nTest: TP test and UI test\n\nSigned-off-by: Runping Lai \u003crunpinglai@google.com\u003e"
    },
    {
      "commit": "56b3c449c968296bda3831d7cd2e0d2140acc9e9",
      "tree": "3bb49a02612af4343e11cbd1e3b351442fbcbe7f",
      "parents": [
        "1f646294374f26a59bed4434a0ae25f94d855109"
      ],
      "author": {
        "name": "yforta",
        "email": "yforta@google.com",
        "time": "Tue Sep 01 12:45:41 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 12:45:41 2026 -0600"
      },
      "message": "trace_redaction: case-sensitive package matching (#7297)\n\nAndroid package names are case-sensitive identifiers. Using\ncase-insensitive comparison could cause mismatched package UID\nassociation in packages_list during trace redaction.\n\nBug: 554956547\nTest: perfetto_unittests --gtest_filter\u003d\"FindPackageUidTest.*\"\nTAG\u003dagy\nCONV\u003dbf6e2915-053a-48a9-8ed1-17ba5fbbbe2a"
    },
    {
      "commit": "1f646294374f26a59bed4434a0ae25f94d855109",
      "tree": "5c3f0acd2367c75a8935d18717ab142fb92cc2e7",
      "parents": [
        "c7fbd5a9b2bc0d9a298e5b0fa7a7dbb17cdb605b"
      ],
      "author": {
        "name": "Elliot Saba",
        "email": "staticfloat@gmail.com",
        "time": "Tue Sep 01 11:25:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 19:25:43 2026 +0100"
      },
      "message": "ui: Add slider to control GPU counters collection (#7285)\n\nOn some platforms (e.g. mesa\u0027s `pps-producer`) collection at 10KHz can\nhave a large CPU performance impact. Give the user an easy way to select\na reasonable GPU counter collection rate, expressed in Hz similar to\nother collection rates such as stack sampling.\n\nKeep the default at 10KHz to not disturb existing users, but at least\nerase the comment claiming it is 10Hz."
    },
    {
      "commit": "c7fbd5a9b2bc0d9a298e5b0fa7a7dbb17cdb605b",
      "tree": "0917fa99a60762fb444c7305fa7965cd9fb55ad5",
      "parents": [
        "24c4f197835183bfbf279b642380474ccbaca6cf"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Sep 01 17:54:25 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 17:54:25 2026 +0100"
      },
      "message": "ui: fix flamegraph crash on heap profiles with negative sizes (#7290)\n\nThe heap profile flamegraph subquery passed raw per-row sizes through\n`iif(positive_alloc, size, 0)` without clamping. Individual rows within\na callsite with net-positive count can still have negative sizes\n(deallocations), causing the flamegraph intrinsic to reject them with\n\"value columns must be non-negative\".\n\nClamp with `max(..., 0)` to match the existing pattern already used for\n`alloc_size` and `alloc_count`.\n\nFixes: https://b.corp.google.com/issues/554195579"
    },
    {
      "commit": "24c4f197835183bfbf279b642380474ccbaca6cf",
      "tree": "26bd9014271e2dfe75f596a9887732dee118f4e7",
      "parents": [
        "a995d36a1e4a208300fae7e1b4eba44465dd0e98"
      ],
      "author": {
        "name": "copybara-service[bot]",
        "email": "56741989+copybara-service[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 17:08:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 17:08:33 2026 +0100"
      },
      "message": "Copybara import from Chromium: proto and stdlib changes (#7288)\n\nCopybara import from Chromium: proto and stdlib changes\n\n- c58e0535873ecb7d50ad31c15899d1f89b3aa6df [AdTagging] Enforce one-way\ntagging and introduce FrameAd... by Yao Xiao \u003cyaoxia@chromium.org\u003e\n\nCOPYBARA_IMPORT\u003dProject import generated by Copybara.\n\nGitOrigin-RevId: c58e0535873ecb7d50ad31c15899d1f89b3aa6df\n\nCo-authored-by: Perfetto Team \u003ccopybara-servicebot@google.com\u003e"
    },
    {
      "commit": "a995d36a1e4a208300fae7e1b4eba44465dd0e98",
      "tree": "3592ab4bd60f4b394e4ca280591d5a451d0f933b",
      "parents": [
        "133776de173f956fd676edbdf0c415d7d8cb80cb"
      ],
      "author": {
        "name": "Safayat Ullah",
        "email": "safayat@google.com",
        "time": "Tue Sep 01 16:06:43 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 15:06:43 2026 +0000"
      },
      "message": "tp: fix trace processor unit tests for chromium (#7293)"
    },
    {
      "commit": "133776de173f956fd676edbdf0c415d7d8cb80cb",
      "tree": "119af50d3a3f5f42baf53887cb17fb9eafbfbc8f",
      "parents": [
        "8a5e83fb56b87c61d30b2564d507bdbaa23653a4"
      ],
      "author": {
        "name": "Mohanram",
        "email": "mohanram.meenakshisundaram@intel.com",
        "time": "Tue Sep 01 19:51:38 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 14:21:38 2026 +0000"
      },
      "message": "perfetto: Fix TracingMuxerImpl::Shutdown() crash (#7089)\n\nAt benchmark exit calls \"Tracing::Shutdown()\"\n(triggered via _util_perfetto_fini registered at exit process).\n\nthen DestroyStoppedTraceWritersForCurrentThread() function destroys\nTraceWriterImpl for data sources that have already been explicitly\nstopped. If any data source not stopped still active at shutdown time\nretains alive. Then muxer is deleted, which frees all shared memory.\n\nLater PlatformPosix-\u003eShutdown() -\u003e ~TraceWriterImpl() -\u003e Flush() -\u003e\nReturnCompletedChunk() which try to access the already freed memory and\ncauses SIGSEGV crash.\n\nFix: Added DestroyAllTraceWritersForCurrentThread() new helper function\nto reset all trace writer on the calling thread before shared memory\ndestoryed.\n\nBug: 534222391\n\nSigned-off-by: Mohanram Meenakshisundaram \u003cmohanram.meenakshisundaram@intel.com\u003e"
    },
    {
      "commit": "8a5e83fb56b87c61d30b2564d507bdbaa23653a4",
      "tree": "d3543d1259b500dcaf3f96746ca6a662470e7d94",
      "parents": [
        "6de9aef0fe145201c475538cd9d23c00a25b3044"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Sep 01 12:34:09 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 12:34:09 2026 +0100"
      },
      "message": "ui: Intelletto: Register tools with Chrome\u0027s WebMCP API (#6883)\n\nRegister Intelletto tool calls with Chrome\u0027s experimental WebMCP API (if\navailable)."
    },
    {
      "commit": "6de9aef0fe145201c475538cd9d23c00a25b3044",
      "tree": "0bcdaf93d9cc2fad2bfe6e6d3a9b912c128a89f2",
      "parents": [
        "77c560edc3374d669967377c1a6c4121e54baaf1"
      ],
      "author": {
        "name": "Steve Golton",
        "email": "stevegolton@google.com",
        "time": "Tue Sep 01 12:26:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 12:26:16 2026 +0100"
      },
      "message": "ui: Consolidate flow events into single plugin and extract connected flows (#7030)\n\nInternal tidy up. Move all flow rendering and query logic into its own\nplugin making use of the timeline overlay extension point, instead of\nhaving it built into the timeline renderer."
    },
    {
      "commit": "77c560edc3374d669967377c1a6c4121e54baaf1",
      "tree": "241c801a166cead88bf803dda1c6f4b9052386c5",
      "parents": [
        "3abc8b5378d83a60ca1f190c1a9072612f9ab84c"
      ],
      "author": {
        "name": "andrabivolaru",
        "email": "andrabivolaru@google.com",
        "time": "Tue Sep 01 13:31:18 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 13:31:18 2026 +0300"
      },
      "message": "proto_merger: Keep reserved fields of deleted types in deleted_fields (#7208)\n\nWhen a field is reserved upstream and its type is a deleted nested\nmessage/enum (not present upstream), `proto_merger` previously moved it\nto `fields`, causing it to be serialized *before* its type definition.\n\nThis change keeps reserved fields of deleted types in `deleted_fields`\nwith `[deprecated \u003d true]` so they are serialized after their nested\ntype definitions.\n\nAdded unit test\n`ReservedUpstreamFieldWithDeletedTypeIsPlacedInDeletedFields` in\n`proto_file_serializer_unittest.cc`."
    }
  ],
  "next": "3abc8b5378d83a60ca1f190c1a9072612f9ab84c"
}
