)]}'
{
  "log": [
    {
      "commit": "f469832acc0e13f3ef06236b315d8421c6be8455",
      "tree": "8033be5e9df382c295009b0eef02ad0fc73142d8",
      "parents": [
        "b66cc8ec6b906b4fc159a3b0d135a9e891994638"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Fri Aug 21 15:22:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 22:22:13 2026 +0000"
      },
      "message": "Read the PR diff and build logs and feed it to gemini in prompt (#5137)\n\nhttps://github.com/flutter/flutter/issues/191099"
    },
    {
      "commit": "b66cc8ec6b906b4fc159a3b0d135a9e891994638",
      "tree": "9fc4677e8602803df35bfca24bbed5bb51dd7398",
      "parents": [
        "ac5092a4ffbad796b3f1b01018cf43bb60f2ca3b"
      ],
      "author": {
        "name": "Andy Wolff",
        "email": "awolff@google.com",
        "time": "Fri Aug 21 14:17:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 14:17:58 2026 -0700"
      },
      "message": "[flutter-gold] Support unified check run Dashboard Checks in push_gold_status_to_github (#5139)\n\nFixes https://github.com/flutter/flutter/issues/191483\n\nAs detailed in the issue, the rollout of unified check runs replaced\nindividual shard check runs with `Dashboard Checks`. Because\n`PushGoldStatusToGithub` matched against a hardcoded list of legacy\nshard names, golden status updates and triage labels stopped triggering\non PRs. This PR adds `\u0027dashboard checks\u0027` to the recognized check run\nlist.\n\nUnder the unified flow, individual shard check runs are no longer\npublished to GitHub. While we could theoretically inspect individual\nshards by querying Firestore `PresubmitGuard` records, doing so is\nunnecessary. `Dashboard Checks` only completes once all scheduled\npresubmit builds have finished, and tests upload golden image digests\ndirectly to Skia Gold as they run. When `Dashboard Checks` completes,\nSkia Gold already knows whether golden tests ran and whether any\nunexpected images were produced. For PRs that do not touch goldens (or\ndo not run golden tests at all), Skia Gold returns zero untriaged\nimages, so Cocoon cleanly marks `flutter-gold` as `SUCCESS` without\nposting comments or applying labels. Skipping Firestore queries keeps\n`PushGoldStatusToGithub` simple, fast, and stateless against GitHub and\nGold.\n\nAdded unit tests in `push_gold_status_to_github_test.dart` for\nin-progress, untriaged, and clean `Dashboard Checks` states.\n\ncc @ievdokdm @jtmcdole\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read the [Flutter Style Guide] _recently_, and have followed its\nadvice.\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] All existing and new tests are passing.\n\nIf you need help, consider asking for advice on the #hackers-new channel\non [Discord].\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#overview\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#tests\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md\n[CLA]: https://cla.developers.google.com/\n[flutter/tests]: https://github.com/flutter/tests\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Discord]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md"
    },
    {
      "commit": "ac5092a4ffbad796b3f1b01018cf43bb60f2ca3b",
      "tree": "f5facfacffa32d662378569569c1d6be5602a14d",
      "parents": [
        "bc221aae4a52a0c287744c845b973d31151beaa4"
      ],
      "author": {
        "name": "Andy Wolff",
        "email": "awolff@google.com",
        "time": "Thu Aug 20 14:57:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 21:57:58 2026 +0000"
      },
      "message": "[cocoon] Support Shift+Scroll for horizontal scrolling and optimize lattice layout (#5135)\n\n# [cocoon] Support Shift+Scroll for horizontal scrolling and optimize lattice layout\r\n\r\nFixes https://github.com/flutter/flutter/issues/191441 \r\n\r\nAdds support Shift+scroll wheel to horizontally scroll on flutter-dashboard.\r\nOptimizes the underlying lattice viewport layout logic to significantly reduce layout overhead during rapid scrolling.\r\n\r\nWe achieve this by wrapping the grid body in a pointer signal listener that catches scroll wheel events when Shift is pressed, or when browsers translate Shift-scroll into horizontal deltas. It routes those deltas directly to the horizontal scroll controller.\r\n\r\nDuring local testing, I noticed scrolling was super janky because `performLayout()` was iterating over every cell in the entire matrix grid regardless of visibility (`O(total_rows * total_cols)`). I added a visibility check in `performLayout()`, bounding iteration strictly to the visible viewport bounds (`O(visible_rows * visible_cols)`), the sticky header row, and the sticky header column. On a 200x400 grid, this reduces layout work from 80,000 cell iterations per frame down to ~600 iterations.\r\n\r\nAdded `dashboard/test/widgets/lattice_test.dart`"
    },
    {
      "commit": "bc221aae4a52a0c287744c845b973d31151beaa4",
      "tree": "67c0c0d895c3f435566be9dce7c5f7a04c62b184",
      "parents": [
        "a68a8c6e26db58dd009f0e8d866491aaaa2165c0"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Aug 20 14:43:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 21:43:01 2026 +0000"
      },
      "message": "reset re-runned dashboard checks conclusion to neutral (#5136)\n\nworkaround for https://github.com/flutter/flutter/issues/191005"
    },
    {
      "commit": "a68a8c6e26db58dd009f0e8d866491aaaa2165c0",
      "tree": "96b73c663ed52b0b605f5f04d4220ad9b1dafedf",
      "parents": [
        "6d6505446dee1ff956f73938d0e89a26da8a4c89"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Aug 20 12:41:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 19:41:09 2026 +0000"
      },
      "message": "reset re-runned dashboard checks status to queued (#5133)\n\nhttps://github.com/flutter/flutter/issues/191005"
    },
    {
      "commit": "6d6505446dee1ff956f73938d0e89a26da8a4c89",
      "tree": "7c6da00cb20dc124f91e8ca7b5eeff8eba529f2b",
      "parents": [
        "d60dce528678df7eb212e786c1d11d62a4689eaa"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Aug 20 12:26:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 19:26:58 2026 +0000"
      },
      "message": "Changed logdog to human readable url for gemini log analysis api (#5134)\n\nfix: https://github.com/flutter/flutter/issues/191099"
    },
    {
      "commit": "d60dce528678df7eb212e786c1d11d62a4689eaa",
      "tree": "9a130a9f26141339820a3c7a8ee4a5b409d6b880",
      "parents": [
        "80b2cb4714c325d47e8e8a95d574bb5dfa138f17"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Aug 19 18:28:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 01:28:04 2026 +0000"
      },
      "message": "Added logging for Gemini log analizys (#5132)\n\nin scope of https://github.com/flutter/flutter/issues/191099"
    },
    {
      "commit": "80b2cb4714c325d47e8e8a95d574bb5dfa138f17",
      "tree": "39fa957b127aaeae3ac66760e883a80bb57ef54b",
      "parents": [
        "f330c27d246615c357871c264736b757f6e8f4aa"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Aug 19 15:40:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 22:40:09 2026 +0000"
      },
      "message": "Reset Dashboard Checks to In Progress when re-run all failed jobs (#5130)\n\nfix of the github error:\r\n\r\n```\r\nError:\r\n    GitHub Error: \r\n      Message: Invalid request.\r\n    \r\n    For \u0027properties/name\u0027, nil is not a string.\r\n     is not a member of [\"success\", \"failure\", \"neutral\", \"cancelled\", \"timed_out\", \"action_required\", \"skipped\"].\r\n    For \u0027properties/conclusion\u0027, nil is not a string.\r\n    For \u0027properties/completed_at\u0027, nil is not a string.\r\n```\r\nwhen reset check run status back to in progress\r\n\r\nin scope of: https://github.com/flutter/flutter/issues/191005"
    },
    {
      "commit": "f330c27d246615c357871c264736b757f6e8f4aa",
      "tree": "0e9bdc95a42b85e0bf1e32b38aaa886b578d00f5",
      "parents": [
        "7af83c41bda88dbb80f4e48b7d907fb8a470f711"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Aug 19 11:00:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 18:00:41 2026 +0000"
      },
      "message": "roll new packages (#5129)"
    },
    {
      "commit": "7af83c41bda88dbb80f4e48b7d907fb8a470f711",
      "tree": "b2cdb5aebc866b83cc0db0bcb3ec59fda72510a5",
      "parents": [
        "75b7d9c610d77762d38c4a835699916ab4c6125b"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Aug 18 10:28:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 17:28:17 2026 +0000"
      },
      "message": "experiment for updating dashboard checks status to in progress (#5128)\n\nhttps://github.com/flutter/flutter/issues/191005"
    },
    {
      "commit": "75b7d9c610d77762d38c4a835699916ab4c6125b",
      "tree": "f1f76ec76f019744bfbb4bae63850480388bd2aa",
      "parents": [
        "63babfe14d79ddab84e8a1585784b3861ab86f05"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Aug 12 10:04:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 17:04:09 2026 +0000"
      },
      "message": "feat(suppression): automatically unsuppress and re-suppress tests on GitHub issue events (#5126)\n\n- Add IssueService and wire it to GithubWebhookSubscription to handle GitHub \u0027issues\u0027 webhook events.\r\n- Automatically unsuppress tests when an associated GitHub issue is closed.\r\n- Automatically re-suppress tests when an associated GitHub issue is reopened.\r\n- Add TestSuppression.canonicalizeIssueUrl to sanitize user input (stripping fragments, query params, subpaths, and trailing slashes) into canonical GitHub issue URLs on ingress.\r\n- Add unit and webhook integration tests for IssueService, TestSuppression, and UpdateSuppressedTest.\r\n\r\nfixes: flutter/flutter#188030 only if we update the webhook."
    },
    {
      "commit": "63babfe14d79ddab84e8a1585784b3861ab86f05",
      "tree": "6a36277d575cd6fcb6258b6768a4284b97ea9fb8",
      "parents": [
        "11859fce2329ec338d8f5651ec7de1d0c5d516ce"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Aug 06 15:08:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 22:08:25 2026 +0000"
      },
      "message": "Temporary workaround to fix github authentication (#5125)\n\nfix: https://github.com/flutter/flutter/issues/189892"
    },
    {
      "commit": "11859fce2329ec338d8f5651ec7de1d0c5d516ce",
      "tree": "be4208ae62e493576083fe7878945f93e0285fb6",
      "parents": [
        "fe9480799c826d58ecfb61758af87814b6c04538"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Aug 06 14:32:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 21:32:03 2026 +0000"
      },
      "message": "fixed created, start, end date format (#5124)\n\nfix: https://github.com/flutter/flutter/issues/190633"
    },
    {
      "commit": "fe9480799c826d58ecfb61758af87814b6c04538",
      "tree": "e04e4f65773bcfdbfb04e79ea3b88c48db2b705c",
      "parents": [
        "3d97b8f9e06ebddfbaedea42ac6713de96f84453"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Aug 05 15:50:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 22:50:20 2026 +0000"
      },
      "message": "Display job execution start and end time (#5123)\n\nadded start and end times in the job execution details\r\n\r\n\u003cimg width\u003d\"350\" height\u003d\"241\" alt\u003d\"image\" src\u003d\"https://github.com/user-attachments/assets/39bd7a41-0d2b-48af-a61d-160f0ea1b5fe\" /\u003e\r\n\r\nfix: https://github.com/flutter/flutter/issues/190633"
    },
    {
      "commit": "3d97b8f9e06ebddfbaedea42ac6713de96f84453",
      "tree": "b3c5ff9f2a3bfc8fd8f8c0c4964d56ad7474e4b2",
      "parents": [
        "312629481952bb75f841e55f87638be865b800a5"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Aug 04 15:03:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 15:03:30 2026 -0700"
      },
      "message": "auth: allow certain googlers to vacuum commits (#5122)"
    },
    {
      "commit": "312629481952bb75f841e55f87638be865b800a5",
      "tree": "c0262053bc1c6723dd8f832dfbc5ba43e739ded2",
      "parents": [
        "b1f79e1ed3edb66fa5f44318b182ee75accd2b01"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Aug 04 12:41:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 19:41:20 2026 +0000"
      },
      "message": "Additional logging for unauthenticated calls (#5121)\n\nadditional logging for deeper investigation of https://github.com/flutter/flutter/issues/189892 and https://github.com/flutter/flutter/issues/190495"
    },
    {
      "commit": "b1f79e1ed3edb66fa5f44318b182ee75accd2b01",
      "tree": "23882a9cec081ef8625ef8517c5aa5f4f5524aab",
      "parents": [
        "72eee5b277937d69d165f8311313339cca5746a6"
      ],
      "author": {
        "name": "Jackson Gardner",
        "email": "jacksongardner@google.com",
        "time": "Tue Aug 04 12:26:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 19:26:11 2026 +0000"
      },
      "message": "Eliminate redundant `getDocument` errors in Firestore. (#5118)\n\nLooking through our GCP logs, a large portion of our errors are coming from calls to get documents from firestore where the document is not found. In many cases, we actually handle this 404 error gracefully and proceed without issue. However, this interaction still causes Firestore itself to log an error, even though cocoon handles it just fine.\r\n\r\nThis change adds a convenience method `getDocumentOrNull` which uses the batch document fetch API instead, which always returns a 200, and if the document is not found, just returns an empty list. I went through and found all the places we were catching the 404 error from fetching a document and used this method instead. This should eliminate a lot of these errors in our GCP logs."
    },
    {
      "commit": "72eee5b277937d69d165f8311313339cca5746a6",
      "tree": "8bad0f3517b2eb12d2f65ad295162d30f0fffc4d",
      "parents": [
        "a4905291287f774f9f1c29f1b4436200bb7e1b6f"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Aug 03 15:31:40 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 22:31:40 2026 +0000"
      },
      "message": "Made Execution Details text in Dashboard Checks selectable (#5120)\n\nfix: https://github.com/flutter/flutter/issues/190147"
    },
    {
      "commit": "a4905291287f774f9f1c29f1b4436200bb7e1b6f",
      "tree": "34bdbfa7c41446b55b1110b7e9d9f21f244f86d4",
      "parents": [
        "42ae12e5801f2cd0e0d1a67bce7a11f1baa3644d"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Aug 03 14:22:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 21:22:18 2026 +0000"
      },
      "message": "Adding aditional logging for debugging (#5119)\n\nlogging for debugging behavior of https://github.com/flutter/cocoon/pull/5117"
    },
    {
      "commit": "42ae12e5801f2cd0e0d1a67bce7a11f1baa3644d",
      "tree": "abc604e302afa2de40455d2ea3e5cc1b9d511b47",
      "parents": [
        "4ad5f7fc03cc3bc04e7673ae967d4a7a3783ec18"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Fri Jul 31 09:48:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 16:48:07 2026 +0000"
      },
      "message": "Reset failed check run back to in progress if all failed jobs are re-runned (#5117)\n\nfix: https://github.com/flutter/flutter/issues/189943"
    },
    {
      "commit": "4ad5f7fc03cc3bc04e7673ae967d4a7a3783ec18",
      "tree": "db56f97960b3e32ee0b490f39cbd632c304c2e56",
      "parents": [
        "9958fbb66b39600937647e7b29d6e80471562e7c"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Fri Jul 31 09:45:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 16:45:56 2026 +0000"
      },
      "message": "Store in firestore resutls of auto retry (#5116)\n\nfix: https://github.com/flutter/flutter/issues/190165"
    },
    {
      "commit": "9958fbb66b39600937647e7b29d6e80471562e7c",
      "tree": "6d6a8c491bd275815fa93a60dfbe9eb27229d638",
      "parents": [
        "a74082835c6ad9357327f6740cae388d26cab701"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Jul 27 16:11:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 23:11:24 2026 +0000"
      },
      "message": "change status to in progress only for initial scheduling try builds (#5115)\n\nfix: https://github.com/flutter/flutter/issues/190080"
    },
    {
      "commit": "a74082835c6ad9357327f6740cae388d26cab701",
      "tree": "c173392111c20082aee0aa780a6fc071d7e4404d",
      "parents": [
        "f876a761699dbbc395638df000734a4e77b004b3"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Jul 27 12:24:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 19:24:08 2026 +0000"
      },
      "message": "Set Dashboard Checks to inProgress state (#5114)\n\nfix: https://github.com/flutter/flutter/issues/190080"
    },
    {
      "commit": "f876a761699dbbc395638df000734a4e77b004b3",
      "tree": "9ad5cd03cbccdabbf7224f8255e705808dc2a93b",
      "parents": [
        "b1b4ac23b55472d6f65896afbb751a4d1948d713"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Fri Jul 24 11:19:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 18:19:21 2026 +0000"
      },
      "message": "In `markConclusion` do not throw exception if remainingJobs is zero (#5113)\n\nIn `markConclusion` do not throw exception if remainingJobs is zero but keep it zero\r\n\r\nfix: https://github.com/flutter/flutter/issues/189989"
    },
    {
      "commit": "b1b4ac23b55472d6f65896afbb751a4d1948d713",
      "tree": "f1b2ee869448b996a16a54852ca9b3bce02dc8e7",
      "parents": [
        "5d46e863311d8827ae5752daccd5a2b82803f5b2"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Fri Jul 24 09:38:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 16:38:32 2026 +0000"
      },
      "message": "emergency label processing for unified check run (#5110)\n\nfix: https://github.com/flutter/flutter/issues/189729"
    },
    {
      "commit": "5d46e863311d8827ae5752daccd5a2b82803f5b2",
      "tree": "c45edc6628af53a6bb032a6939b8dd63fece2fe1",
      "parents": [
        "99dd640bb340ad35fff444c5fe8db7778fc24950"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Jul 23 13:56:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 20:56:29 2026 +0000"
      },
      "message": "Extend github auth logging (#5112)\n\nAdded logging into github auth for deeper analysis of github auth issue: https://github.com/flutter/flutter/issues/189892"
    },
    {
      "commit": "99dd640bb340ad35fff444c5fe8db7778fc24950",
      "tree": "172dad28f95dfe65ae2d674094c5170407648eee",
      "parents": [
        "8b7ec15d2df16b5f944dbb0017f85289bec22536"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Jul 22 16:04:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 23:04:15 2026 +0000"
      },
      "message": "Enabled test suppression for unified check run (#5111)\n\nfix: https://github.com/flutter/flutter/issues/189877"
    },
    {
      "commit": "8b7ec15d2df16b5f944dbb0017f85289bec22536",
      "tree": "c653aa3a326b90af792f8cac54d371f93b37c9ed",
      "parents": [
        "181e70a603ae34dff23e82ff3fc2215696ef10c7"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jul 21 09:28:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 16:28:22 2026 +0000"
      },
      "message": "land usage of ordered queue to all users (#5108)\n\nfix: https://github.com/flutter/flutter/issues/189029"
    },
    {
      "commit": "181e70a603ae34dff23e82ff3fc2215696ef10c7",
      "tree": "8239123c74fca35ca04cb60d6a9b30e88b44df82",
      "parents": [
        "7ef207eb78fa34ecdfdafae7adbb72ba82eaa327"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Jul 20 13:51:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 20:51:29 2026 +0000"
      },
      "message": "printed list of failed jobs in failed github `Dashboard Checks` details (#5109)\n\nfix: https://github.com/flutter/flutter/issues/189731"
    },
    {
      "commit": "7ef207eb78fa34ecdfdafae7adbb72ba82eaa327",
      "tree": "3c2670efb528dce3441976e17eac63a07c8b9676",
      "parents": [
        "a86ab143a005dc6b98dfb343f482b0600af8513c"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Fri Jul 17 11:23:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 18:23:18 2026 +0000"
      },
      "message": "fix(auto_submit): Pass requestSha to GitHub merge API (#5107)\n\nDefense in depth - prevent autosubmit from trying to land a pushed (but not approved) pr. \r\n\r\nThis is not a real issue since we have branch protection rules, but it\u0027s good to have."
    },
    {
      "commit": "a86ab143a005dc6b98dfb343f482b0600af8513c",
      "tree": "097e12bf3415db6a7d9e1c3414172f167696b055",
      "parents": [
        "6f75a18e743bf79f232285312c701d6f123b2cf3"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Jul 15 15:25:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 22:25:06 2026 +0000"
      },
      "message": "fix(ci): harden some workflows in cocoon (#5106)\n\nfixes flutter/flutter#189097\r\n\r\n```\r\n➜  /app /opt/zizmor --gh-token\u003d$(gh auth token) .github/workflows\r\n INFO zizmor: 🌈 zizmor v1.25.2\r\n INFO audit: zizmor: 🌈 completed .github/workflows/app_dart_tests.yaml\r\n INFO audit: zizmor: 🌈 completed .github/workflows/common_validation.yaml\r\n INFO audit: zizmor: 🌈 completed .github/workflows/dashboard_tests.yaml\r\n INFO audit: zizmor: 🌈 completed .github/workflows/packages_checks.yaml\r\nNo findings to report. Good job! (13 suppressed)\r\n➜  /app /opt/zizmor --gh-token\u003d$(gh auth token) packages/wait_for_tests\r\n INFO zizmor: 🌈 zizmor v1.25.2\r\n INFO audit: zizmor: 🌈 completed packages/wait_for_tests/action.yml\r\nNo findings to report. Good job! (1 suppressed)\r\n```"
    },
    {
      "commit": "6f75a18e743bf79f232285312c701d6f123b2cf3",
      "tree": "83d2e0feb6119688e13aebbdbbc39cad63dfb3a7",
      "parents": [
        "b2ef63459e3c2f337decb07e2647425f649c9c20"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Jul 15 10:17:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 17:17:29 2026 +0000"
      },
      "message": "Let unified check run be! (#5099)\n\nfix: https://github.com/flutter/flutter/issues/176988"
    },
    {
      "commit": "b2ef63459e3c2f337decb07e2647425f649c9c20",
      "tree": "8eba6e5faf4d4e2bad3160e7c00ed68dc6680770",
      "parents": [
        "8b8e4353632e39776a36b09b1348928ca54bfe98"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jul 14 11:29:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 18:29:49 2026 +0000"
      },
      "message": "ordered presubmit builds processing (#5104)\n\nfix: https://github.com/flutter/flutter/issues/189029"
    },
    {
      "commit": "8b8e4353632e39776a36b09b1348928ca54bfe98",
      "tree": "7cb256f57e76e603e31998f9e4e0270f6fbfb8af",
      "parents": [
        "18bfc77abd4f27de76b961f5f489b555cefaba44"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Fri Jul 10 14:28:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:28:32 2026 -0700"
      },
      "message": "refactor(presubmit_guard): update API used by wait_for_tests to support more Cocoon scheduled tests. (#5102)\n\nEnhances `_getCiStagingFallback` in the presubmit guard handler to\nhandle task rerun sequences chronologically and filter bringup tasks.\n\n\u003e [!NOTE]\n\u003e We should probably rename this function since it now blends all tests.\nIts really just \"give me the tests... please\".\n\n| Repository | Unified Status | Presubmit | GitHub Merge Queue |\nPost-Submit |\n| :--- | :--- | :---: | :--- | :--- |\n| **`flutter/flutter`** | Non-Unified | **Yes** | Engine Phase Only |\nEngine Phase + Tasks |\n| **`flutter/flutter`** | Unified | **Yes** | Engine Phase Only | Engine\nPhase + Tasks |\n| **`flutter/packages`** | Non-Unified | **No** | *No Merge Queue* |\nTasks Only |\n| **`flutter/packages`** | Unified | **Yes** | *No Merge Queue* | Tasks\nOnly |\n\n\u003e [!NOTE]\n\u003e * **`flutter/flutter`** always uses `ciStaging` (Engine Phase) in the\nMerge Queue and blends them with general tasks in Post-Submit.\n\u003e * **`flutter/packages`** does not have a Merge Queue. It only includes\nPresubmit tasks once unified, and transitions directly to general tasks\nin Post-Submit.\n\u003e * **`flutter/packages`** does not use wait_for_tests in presubmits, so\nenabling unified checkruns fixes this.."
    },
    {
      "commit": "18bfc77abd4f27de76b961f5f489b555cefaba44",
      "tree": "b1b0b373c0bdd5927a0cf6171e2385dd7e63c2a6",
      "parents": [
        "c82f779e201b2d22f43b531268cfbd2ce4fbd4ab"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Jul 09 15:00:50 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 22:00:50 2026 +0000"
      },
      "message": "Delete legacy flow for closeMqGuardAfterPresubmit \u003d\u003d false (#5101)\n\nDeleting legacy `closeMqGuardAfterPresubmit \u003d false` flow as it obsolete\r\n\r\n**Context:**\r\nWe have 2  different processing flows based on whether `processJobStatusUpdate` config variable is `true` or `false`:\r\n\r\n1. **Legacy**. if `closeMqGuardAfterPresubmit` flag is set to `false` then flow is the following: \r\n\r\n```mermaid\r\nsequenceDiagram\r\n    LUCI-\u003e\u003eCocoon: Build complete\u003cbr/\u003enotification\r\n    Cocoon-\u003e\u003eGithub: Update Check\r\n    Github-\u003e\u003eCocoon: Check complete\u003cbr/\u003enotification\r\n    Note over Cocoon: Check complete processing\r\n    Cocoon-\u003e\u003eGithub: If all success\u003cbr/\u003eunlock merge queue\r\n```\r\n\r\nFor **Check complete processing** `processJobStatusUpdate()` called with `PresubmitJobState` constructed from check using `PresubmitJobState.fromCheckRun()` \r\n\r\n2. **Current**.  if `closeMqGuardAfterPresubmit` flag is set to `true` or for **Unified Check Run** flow :\r\n\r\n```mermaid\r\nsequenceDiagram\r\n    LUCI-\u003e\u003eCocoon: Build complete\u003cbr/\u003enotification\r\n    Note over Cocoon: Build complete processing\r\n    Cocoon-\u003e\u003eGithub: Update Check\u003cbr/\u003eor Job in firestore\r\n    Cocoon-\u003e\u003eGithub: If all success\u003cbr/\u003eunlock merge queue\r\n    Github-\u003e\u003eCocoon: Check complete\u003cbr/\u003enotification\r\n    Note over Cocoon: Ignoring\r\n```"
    },
    {
      "commit": "c82f779e201b2d22f43b531268cfbd2ce4fbd4ab",
      "tree": "acfe6ac8528091ddc250938e41987d6c9c3e67d7",
      "parents": [
        "25ad54ecf9ef93265712e30e552489b0792151f8"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Mon Jul 06 13:59:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 13:59:56 2026 -0700"
      },
      "message": "fix(ci): dart must be setup (#5098)\n\nAction was missing \"uses\" clause to setup dart on the runner.\n+ Includes a change to make `gh act` local development possible"
    },
    {
      "commit": "25ad54ecf9ef93265712e30e552489b0792151f8",
      "tree": "e0599b618621fa764cbad8ec8b699a45952e7b9f",
      "parents": [
        "67ef3d40727ec85574f718d4e2fe911bf72de3de"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Jul 01 16:08:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 16:08:01 2026 -0700"
      },
      "message": "feat(wait-action): add wait_for_tests shared GitHub Action and CLI tool (#5097)\n\nAdd the wait_for_tests action package to the Cocoon workspace. This will\nallow flutter/flutter and flutter/packages to wait on Cocoon scheduled\ntests to complete. This is made more important with the upcoming\nUniversal Presubmits on the flutter dashboard.\n\nKey additions:\n- Configured the GitHub Action workflow definition in `action.yml`.\n- Created the wait_for_tests CLI tool in `bin/wait_for_tests.dart`\nsupporting environment-variable or command-line arguments\n- Implemented robust polling, status clamping (between 30 and 600\nseconds), and evaluation logic in `lib/wait_for_tests.dart` using the\nshared `TaskStatus` from `package:cocoon_common`.\n- Added tests.\n- Registered the package in the workspace root `pubspec.yaml`."
    },
    {
      "commit": "67ef3d40727ec85574f718d4e2fe911bf72de3de",
      "tree": "04b25d0535806149a8d9cc5b53e1dd44206943cc",
      "parents": [
        "e9537ace317f42b75b2d80e02f5bfb2014339831"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Jul 01 13:55:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 13:55:42 2026 -0700"
      },
      "message": "feat(docker): support native multi-arch (amd64/arm64) builds (#5096)\n\n- Update Dockerfile.base to exclude prepackaged cache on arm64/aarch64\nand trigger native SDK bootstrapping.\n- Exclude .pub-preload-cache by default on all architectures to optimize\nsize.\n- Update Dockerfile to download yq dynamically based on target\narchitecture.\n- Refactor cloudbuild.yaml to use docker buildx with QEMU emulation and\ndirect manifest-list pushing.\n- Remove hardcoded amd64 platform constraints from docker-compose.yml.\n- Update README.md to document arm64 capabilities and simplify local\ncommands.\n\nfixes: flutter/flutter#188873"
    },
    {
      "commit": "e9537ace317f42b75b2d80e02f5bfb2014339831",
      "tree": "9a4289c05a6fd79a78dbc9410ae3bf39003e620a",
      "parents": [
        "cd0c18df65594e5e8b638d7228e6b4dffd8165f7"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 30 12:57:52 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 19:57:52 2026 +0000"
      },
      "message": "feat(app_dart): fall back to ciStaging in GetPresubmitGuard when no guards found (#5094)\n\nIn the Unified Check Run flow, if no modern `UnifiedCheckRun` presubmit guards are found for a commit, retrieve the legacy `ciStaging` documents as a fallback. This will make waiting for check-runs to pass universal.\r\n\r\n- Implement `CiStaging.getCiStagingForCommitSha` to query staging documents by repository and commit SHA.\r\n- Refactor `GetPresubmitGuard` to invoke `_getCiStagingFallback` when no guards are present.\r\n- Extract `check_run_id` from the staging `checkRunGuard` JSON, and look up pull request and author metadata via `PrCheckRuns`.\r\n- Add unit tests verifying `ciStaging` fallback execution and JSON response structure.\r\n- Clean up related linter warnings (redundant imports, type annotations, and curly braces).\r\n\r\nfixes flutter/flutter#188756"
    },
    {
      "commit": "cd0c18df65594e5e8b638d7228e6b4dffd8165f7",
      "tree": "a531ce770a96f1b6c03339882f0791ecf2a33d96",
      "parents": [
        "31a0b69748e2da3b4ee2b875861a77e2bed024b4"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Jun 29 13:50:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 20:50:02 2026 +0000"
      },
      "message": "comments (#5093)\n\nAdded comments to explain what presubmit guards and presubmit jobs terms means"
    },
    {
      "commit": "31a0b69748e2da3b4ee2b875861a77e2bed024b4",
      "tree": "9bb97156b5161743efdd17ea7713a721d202af8e",
      "parents": [
        "2dd521d8e7b06de33e992b46266252e3f1afc9e3"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Jun 29 13:17:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 20:17:06 2026 +0000"
      },
      "message": "Polishing (#5092)\n\nrenamed:\r\n - `get-presubmit-jobs` to `get-presubmit-job` since it returns run details of one job\r\n - `builds` to `jobs` in get-presubmit-guard response"
    },
    {
      "commit": "2dd521d8e7b06de33e992b46266252e3f1afc9e3",
      "tree": "ac339287c55d8d7c9a47c56f013ba9d02ee38d8e",
      "parents": [
        "994995d408ef4d6a45d001b4b7fa48ae0d67fbe6"
      ],
      "author": {
        "name": "Jackson Gardner",
        "email": "jacksongardner@google.com",
        "time": "Fri Jun 26 15:11:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 22:11:23 2026 +0000"
      },
      "message": "Remove revert bot from autosubmit. (#5091)\n\nThis functionality has been replaced by a GitHub action, so we\u0027re going to remove this feature from cocoon."
    },
    {
      "commit": "994995d408ef4d6a45d001b4b7fa48ae0d67fbe6",
      "tree": "7bb25988e2e4d860cdab8d1b30aaf4c27b08cbb9",
      "parents": [
        "0548289e8570f66ce802dc4351d81569942f3495"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Fri Jun 26 10:07:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 17:07:03 2026 +0000"
      },
      "message": "fix(docker): coder-up should report some progress (#5090)\n\nRefactor environment startup to pull images before starting.\r\n\r\n```\r\n❯ coder-up\r\nPulling image for: pr-review...\r\nTrying to pull us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:stable...\r\nGetting image source signatures\r\nCopying blob sha256:d6cecff2cfc0d8bdbed2c1efdef4de8531c66487a8380b2b954f014daf825fc9\r\nCopying blob sha256:7072d26cd09a3c77bb7b35b9c22b3893c89392b79baf4840e7425aacdb09e080\r\nCopying blob sha256:cb259a83ac3dd9fea0b394df41df2b298adf0df938fef5999475af18a751c257\r\nCopying blob sha256:86b721c394db1bb8086ba7973e5e93ea83ed9fef5b6c153886babb2c666530e1\r\nCopying blob sha256:a3c9bf3c2c2f678b4dce5bd10dff513a847ea4d28768519d1cb59e8e4c0da5b9\r\nCopying blob sha256:5f635f4c089e00f4b39a1b5666f94a365ebcd733fa901351a22373bdcd53f71a\r\nCopying blob sha256:aa2962c22a5f8d7291663569925f0f78061fbc432594f6d7190e42f2d56126f5\r\nCopying blob sha256:2815e56b3171962731fc48f3d358dfd5d4c87a68ef645c19f1fde2de83856c8f\r\nCopying blob sha256:cbf3095671ca2d21c59e0bf0f8eabd2e9f3ac096d6d5e7124c633af529d8cb40\r\nCopying blob sha256:15478765193d849298501e70753e4e776e8bcbf13e991ed69ee5ddcd01bfd5b5\r\nCopying blob sha256:59647213e5b0a5ab5dbc04d5e1d6c7934b1e5b70ebcedc3af3f631a15316da63\r\nCopying blob sha256:a1833780d6af2b6427b6dbe64d4984b13074cc86c00b07146e93e2fa995b5558\r\nCopying config sha256:e2ce22a9680f3303f296f1fb672d91d308570df998981a722097844abad8cae3\r\nWriting manifest to image destination\r\nWARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64)\r\ne2ce22a9680f3303f296f1fb672d91d308570df998981a722097844abad8cae3\r\nStarting development environment: pr-review...\r\nWARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64)\r\ne2ce22a9680f3303f296f1fb672d91d308570df998981a722097844abad8cae3\r\n6a534a8c0b384ae7f3897654cca354d94ec06f02542031ac6b00cbb393717a3b\r\n6c5fbce2f44bd49a723a3bbdfd39bfc09671b243a06cfe773bec6ce55df2da33\r\npr-review\r\n```"
    },
    {
      "commit": "0548289e8570f66ce802dc4351d81569942f3495",
      "tree": "73cabb60f0fce6a4fc388594f2a4b2805aad514b",
      "parents": [
        "77d6f1e8a0a3062f77278aaa61d80837d1f6896e"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Jun 25 15:19:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 22:19:13 2026 +0000"
      },
      "message": "light theme UI fixes (#5089)\n\nfix: https://github.com/flutter/flutter/issues/188111"
    },
    {
      "commit": "77d6f1e8a0a3062f77278aaa61d80837d1f6896e",
      "tree": "f5e5f25305656245426c05be1748d06d677733ce",
      "parents": [
        "31f34160ebef687ea0fc15c1b1fe1113c8667de5"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Thu Jun 25 14:50:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 14:50:28 2026 -0700"
      },
      "message": "fix: add install of jq to orchestrator (#5088)\n\nTwo AI reviews suggested \"jq\" was included; it was in fact a lie.\n\nRan the cloud-sdk image locally in docker with this and it was able to\nwork. Triggered remotely and waiting for confirmation"
    },
    {
      "commit": "31f34160ebef687ea0fc15c1b1fe1113c8667de5",
      "tree": "dfc52df0361800194ff183322dd47e4280de8f92",
      "parents": [
        "7a4ae880af963916bb473fab3fb828071e770397"
      ],
      "author": {
        "name": "Jackson Gardner",
        "email": "jacksongardner@google.com",
        "time": "Thu Jun 25 14:36:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 21:36:13 2026 +0000"
      },
      "message": "Refactor CICD label management to use per-PR sequential queue (#5035)\n\nThis change overhauls the management of the `CICD` label in Cocoon to address race conditions and non-idempotent operations that caused issues in the previous attempt.\r\n\r\nKey changes:\r\n- Introduced `PullRequestManager` to handle events for a single PR sequentially via an operation queue.\r\n- Moved PR-specific logic from `webhook_subscription.dart` to `PullRequestManager`, thinning out the webhook handler.\r\n- Implemented new state machine logic for `opened` and `synchronize` events to handle privileged users and draft PRs correctly.\r\n- Made `_scheduleIfMergeable` idempotent by tracking `scheduledSha` in Firestore to prevent duplicate triggering of presubmits for the same SHA.\r\n- Refactored `PullRequestManager` creation to be synchronous in the cache, queueing the asynchronous initialization to avoid creation race conditions.\r\n- Restored `cicd_flowchart.md` from a previous commit to document the flow.\r\n- Fixed all static analysis issues and ensured all tests pass."
    },
    {
      "commit": "7a4ae880af963916bb473fab3fb828071e770397",
      "tree": "0bc3ff39729757a6d963750734dd41873d0f85aa",
      "parents": [
        "bc6c7466dc74123650ef3f38e167d3c8824ce3a1"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Thu Jun 25 14:25:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 14:25:48 2026 -0700"
      },
      "message": "Change logging option to CLOUD_LOGGING_ONLY (#5087)\n\nUpdated logging options to send logs directly to Cloud Logging."
    },
    {
      "commit": "bc6c7466dc74123650ef3f38e167d3c8824ce3a1",
      "tree": "4972d30e7faafc85a97cab732d9ad9a8318d6dda",
      "parents": [
        "96f9f25f537ab3367959155fcc7465befe1b6cde"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Thu Jun 25 13:27:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 20:27:03 2026 +0000"
      },
      "message": "ci(flutter_agy_docker): conditionally tag docker images by release channel (#5086)\n\nAdd `orchestrator.yaml` to fetch the latest `stable` Flutter version and automatically trigger the `flutter-agy-docker` build with the correct version substitution.\r\n\r\nUpdate `cloudbuild.yaml` to fetch the official Flutter releases JSON and conditionally apply docker tags:\r\n- Tag and push as `stable` and `latest` if the built version matches the current stable release.\r\n- Tag and push as `beta` if the built version matches the current beta release.\r\n- Remove the unconditional `latest` tagging that applied to every build.\r\n\r\nFlows:\r\n\r\n```mermaid\r\nsequenceDiagram\r\n    autonumber\r\n    actor Scheduler as Cloud Scheduler\r\n    actor User as Manual Trigger\r\n    participant Orchestrator as orchestrator.yaml\r\n    participant CloudBuild as cloudbuild.yaml\r\n    participant Storage as Google Cloud Storage (Releases)\r\n    participant AR as Artifact Registry\r\n\r\n    %% Cloud Scheduler Flow\r\n    rect rgb(240, 248, 255)\r\n        note over Scheduler, AR: Flow 1: Automated Stable Build\r\n        Scheduler-\u003e\u003eOrchestrator: Trigger daily/weekly\r\n        Orchestrator-\u003e\u003eStorage: Fetch releases_linux.json\r\n        Storage--\u003e\u003eOrchestrator: Return JSON\r\n        Orchestrator-\u003e\u003eOrchestrator: Parse latest stable version (e.g. 3.44.4)\r\n        Orchestrator-\u003e\u003eCloudBuild: gcloud builds triggers run \u003cbr/\u003e(_FLUTTER_VERSION\u003d3.44.4)\r\n\r\n        CloudBuild-\u003e\u003eCloudBuild: Build images (flutter_base, flutter_docker)\r\n        CloudBuild-\u003e\u003eStorage: Fetch releases_linux.json (Step 3)\r\n        Storage--\u003e\u003eCloudBuild: Return JSON\r\n\r\n        CloudBuild-\u003e\u003eCloudBuild: Compare _FLUTTER_VERSION to stable/beta\r\n        note right of CloudBuild: Matches Stable\r\n\r\n        CloudBuild-\u003e\u003eAR: Push tag: :3.44.4\r\n        CloudBuild-\u003e\u003eAR: Push tag: :stable\r\n        CloudBuild-\u003e\u003eAR: Push tag: :latest\r\n    end\r\n\r\n    %% Manual Trigger Flow\r\n    rect rgb(255, 248, 240)\r\n        note over User, AR: Flow 2: Manual Version Build\r\n        User-\u003e\u003eCloudBuild: Trigger manually \u003cbr/\u003e(_FLUTTER_VERSION\u003dX.Y.Z)\r\n\r\n        CloudBuild-\u003e\u003eCloudBuild: Build images (flutter_base, flutter_docker)\r\n        CloudBuild-\u003e\u003eStorage: Fetch releases_linux.json (Step 3)\r\n        Storage--\u003e\u003eCloudBuild: Return JSON\r\n\r\n        CloudBuild-\u003e\u003eCloudBuild: Compare _FLUTTER_VERSION to stable/beta\r\n\r\n        alt Matches Stable Version\r\n            CloudBuild-\u003e\u003eAR: Push tag: :X.Y.Z\r\n            CloudBuild-\u003e\u003eAR: Push tag: :stable\r\n            CloudBuild-\u003e\u003eAR: Push tag: :latest\r\n        else Matches Beta Version\r\n            CloudBuild-\u003e\u003eAR: Push tag: :X.Y.Z\r\n            CloudBuild-\u003e\u003eAR: Push tag: :beta\r\n        else Neither (Random Version)\r\n            CloudBuild-\u003e\u003eAR: Push tag: :X.Y.Z\r\n            note right of CloudBuild: Skips stable, latest, and beta tags\r\n        end\r\n    end\r\n```"
    },
    {
      "commit": "96f9f25f537ab3367959155fcc7465befe1b6cde",
      "tree": "2010fce312d3b797caade115505b20da319388ed",
      "parents": [
        "54f00db3b4dfeb5598e4eb1833de6e6f87017291"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Jun 25 08:57:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 15:57:08 2026 +0000"
      },
      "message": "Mobile layout (#5084)\n\nMobile layout implementation\r\n\r\n\u003cimg width\u003d\"377\" height\u003d\"722\" alt\u003d\"image\" src\u003d\"https://github.com/user-attachments/assets/4a632589-0281-4b0b-b4b1-49772eb32f63\" /\u003e\r\n\r\n\u003cimg width\u003d\"375\" height\u003d\"718\" alt\u003d\"image\" src\u003d\"https://github.com/user-attachments/assets/13ec5d5f-9715-4c96-94aa-9b66efb43ec8\" /\u003e\r\n\r\nChanged default layout: \r\n - lowered paddings \r\n-  moved `Filter jobs` and `Re-run failed` buttons to the side view\r\n\u003cimg width\u003d\"850\" height\u003d\"462\" alt\u003d\"image\" src\u003d\"https://github.com/user-attachments/assets/228c12bd-1173-47de-a792-fb9143e2c622\" /\u003e\r\n\r\nfix: https://github.com/flutter/flutter/issues/188344"
    },
    {
      "commit": "54f00db3b4dfeb5598e4eb1833de6e6f87017291",
      "tree": "e14c51c0febaa93c6620ba830c34094025ba8b5e",
      "parents": [
        "2f052338c64bba556e6f892fb8e023a5b8d908dd"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Jun 24 13:21:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 13:21:51 2026 -0700"
      },
      "message": "refactor(docker): optimize base image and clean up build steps (#5085)\n\n- Use /etc/sudoers.d/coder for sudo configuration in Dockerfile.\n- Delete unused Flutter engine artifacts and pub cache assets to reduce\nimage size.\n- Explicitly extract Flutter to /opt with --no-same-owner.\n- Add \u0027flutter doctor\u0027 verification step.\n\nThis should reduce the overall image size by several hundred megs."
    },
    {
      "commit": "2f052338c64bba556e6f892fb8e023a5b8d908dd",
      "tree": "6acfdf4a6912542103d4c7446977cac22028f237",
      "parents": [
        "a3516aac5e6b574e694b924d85c8ee3df88d5aaf"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 23 16:38:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 23:38:16 2026 +0000"
      },
      "message": "fix: prevent redundant presubmit builds by checking for existing LUCI… (#5083)\n\nTo avoid re-running all checks if the CICD label is removed and added after presubmits have started, check if builds already exist for the current SHA. If builds already exist, there is no need to cancel them and create new ones.\r\n\r\nfix: https://github.com/flutter/flutter/issues/188126"
    },
    {
      "commit": "a3516aac5e6b574e694b924d85c8ee3df88d5aaf",
      "tree": "0884066953a877f4d9d12d4cc95b073c7299b547",
      "parents": [
        "4da2038215d9ed1e49fe278773ca4e4ee258afb5"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 23 16:07:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 16:07:00 2026 -0700"
      },
      "message": "feat: add skill update script and fix docker build context (#5082)\n\nThis commit introduces a new script for updating agent skills. Just run\n`update_skills.sh` and it will download to your mapped `~/.gemini`\nfolder (or the `.agents/skills` in your current working directory with\n`--local`).\n\n- **update_skills.sh**: Added a script to efficiently fetch and update\nagent skills from known GitHub repositories (flutter/skills,\ndart-lang/skills, kevmoo/dash_skills). Features include:\n- Support for global (`~/.gemini/config/skills`) or local\n(`.agents/skills`) installations.\n  - Avoids full clones by utilizing `git ls-remote` for commit checks.\n- Uses `git ls-tree` to track individual skill hashes and only update\nwhat changed.\n- **Dockerfile**: Added `update_skills.sh` to `/usr/local/bin` and made\nit executable.\n- **cloudbuild.yaml**: Fixed the Docker build steps by explicitly\nsetting `dir: \u0027cloud_build/flutter_agy_docker/\u0027` and using relative\npaths for the Dockerfile and build context, resolving potential build\ncontext issues.\n\n\n```shell\n$ update_skills.sh\nUpdating skills in /home/coder/.gemini/config/skills...\n----------------------------------------\n[\u003d] flutter/skills is up to date.\n[\u003d] dart-lang/skills is up to date.\n[\u003d] kevmoo/dash_skills is up to date.\n----------------------------------------\nSummary:\nChecked 3 repositories.\nAll skills are up to date.\nSkills available in: /home/coder/.gemini/config/skill\n```"
    },
    {
      "commit": "4da2038215d9ed1e49fe278773ca4e4ee258afb5",
      "tree": "605c5aab9b470133e9f5aa0a5f2a1441efefc20c",
      "parents": [
        "07125d46d87884335350f09c5c5eac4c0c02534c"
      ],
      "author": {
        "name": "Jackson Gardner",
        "email": "jacksongardner@google.com",
        "time": "Tue Jun 23 14:00:50 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 21:00:50 2026 +0000"
      },
      "message": "Show `bringup: true` tasks by default. (#5066)"
    },
    {
      "commit": "07125d46d87884335350f09c5c5eac4c0c02534c",
      "tree": "89b3ffd6a46b89e20e8ab1e3d0cbb03b8aa7a0d5",
      "parents": [
        "f3422bf3a5581fec4bd7ef4cf990dfde8288a701"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 23 10:57:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 10:57:33 2026 -0700"
      },
      "message": "build(docker): split flutter image into base and dev images (#5080)\n\nWhy? Improves caching - flutter maybe has an update weekly; os /\nantigravity release more often.\n\n- Create `Dockerfile.base` to handle heavy Flutter SDK downloads and\nconfiguration.\n- Update `Dockerfile` to focus on user configuration and development\ntools, removing the heavy fetcher stage.\n- Update `cloudbuild.yaml` to implement a multi-step build, creating the\nstatic base image first, then the auto-updating dev image.\n- Inject a `CACHE_BUSTER` build argument in `cloudbuild.yaml` to force\n`apt-get` updates on the dev image"
    },
    {
      "commit": "f3422bf3a5581fec4bd7ef4cf990dfde8288a701",
      "tree": "600cbb512a1116f4b787ef3aa3a163b9d0ceaec0",
      "parents": [
        "a0cf6a7d696623b14efea811a96546233c492647"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 23 10:29:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 17:29:29 2026 +0000"
      },
      "message": "Enrolled Justin to unified checkrun (#5081)\n\nEnrolled Justin to Unified Checkrun"
    },
    {
      "commit": "a0cf6a7d696623b14efea811a96546233c492647",
      "tree": "8c005e91069366bb183ba990788e2c9e4e576456",
      "parents": [
        "92a1b90b2d63fada430dd912bc92f905e9be375d"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 23 10:07:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 17:07:05 2026 +0000"
      },
      "message": "update test data for packages check run flow (#5079)\n\nupdated seeder test data"
    },
    {
      "commit": "92a1b90b2d63fada430dd912bc92f905e9be375d",
      "tree": "a4923d8c6d5e046b8bb08a385e1f3d80219a4b31",
      "parents": [
        "a363eef1eb2e4417cf33692c9ee6dc754c83f18f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 22 07:07:41 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 07:07:41 2026 +0000"
      },
      "message": "chore(deps): bump actions/checkout from 6 to 7 (#5078)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/releases\"\u003eactions/checkout\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev7.0.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eblock checking out fork pr for pull_request_target and workflow_run by \u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2454\"\u003eactions/checkout#2454\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2458\"\u003eactions/checkout#2458\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump flatted from 3.3.1 to 3.4.2 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2460\"\u003eactions/checkout#2460\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump js-yaml from 4.1.0 to 4.2.0 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2461\"\u003eactions/checkout#2461\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump \u003ccode\u003e@​actions/core\u003c/code\u003e and \u003ccode\u003e@​actions/tool-cache\u003c/code\u003e and Remove uuid by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2459\"\u003eactions/checkout#2459\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eupgrade module to esm and update dependencies by \u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2463\"\u003eactions/checkout#2463\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump the minor-npm-dependencies group across 1 directory with 3 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2462\"\u003eactions/checkout#2462\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003egetting ready for checkout v7 release by \u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2464\"\u003eactions/checkout#2464\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eupdate error wording by \u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2467\"\u003eactions/checkout#2467\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2454\"\u003eactions/checkout#2454\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v6.0.3...v7.0.0\"\u003ehttps://github.com/actions/checkout/compare/v6.0.3...v7.0.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev6.0.3\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate changelog by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2357\"\u003eactions/checkout#2357\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: expand merge commit SHA regex and add SHA-256 test cases by \u003ca href\u003d\"https://github.com/yaananth\"\u003e\u003ccode\u003e@​yaananth\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2414\"\u003eactions/checkout#2414\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix checkout init for SHA-256 repositories by \u003ca href\u003d\"https://github.com/yaananth\"\u003e\u003ccode\u003e@​yaananth\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2439\"\u003eactions/checkout#2439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate changelog for v6.0.3 by \u003ca href\u003d\"https://github.com/yaananth\"\u003e\u003ccode\u003e@​yaananth\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2446\"\u003eactions/checkout#2446\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/yaananth\"\u003e\u003ccode\u003e@​yaananth\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2414\"\u003eactions/checkout#2414\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v6...v6.0.3\"\u003ehttps://github.com/actions/checkout/compare/v6...v6.0.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev6.0.2\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd orchestration_id to git user-agent when ACTIONS_ORCHESTRATION_ID is set by \u003ca href\u003d\"https://github.com/TingluoHuang\"\u003e\u003ccode\u003e@​TingluoHuang\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2355\"\u003eactions/checkout#2355\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix tag handling: preserve annotations and explicit fetch-tags by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2356\"\u003eactions/checkout#2356\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v6.0.1...v6.0.2\"\u003ehttps://github.com/actions/checkout/compare/v6.0.1...v6.0.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev6.0.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate all references from v5 and v4 to v6 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2314\"\u003eactions/checkout#2314\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd worktree support for persist-credentials includeIf by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2327\"\u003eactions/checkout#2327\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClarify v6 README by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2328\"\u003eactions/checkout#2328\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v6...v6.0.1\"\u003ehttps://github.com/actions/checkout/compare/v6...v6.0.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/blob/main/CHANGELOG.md\"\u003eactions/checkout\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003ch2\u003ev7.0.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBlock checking out fork PR for pull_request_target and workflow_run by \u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2454\"\u003eactions/checkout#2454\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2458\"\u003eactions/checkout#2458\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump flatted from 3.3.1 to 3.4.2 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2460\"\u003eactions/checkout#2460\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump js-yaml from 4.1.0 to 4.2.0 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2461\"\u003eactions/checkout#2461\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump \u003ccode\u003e@​actions/core\u003c/code\u003e and \u003ccode\u003e@​actions/tool-cache\u003c/code\u003e and Remove uuid by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2459\"\u003eactions/checkout#2459\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eupgrade module to esm and update dependencies by \u003ca href\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2463\"\u003eactions/checkout#2463\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump the minor-npm-dependencies group across 1 directory with 3 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2462\"\u003eactions/checkout#2462\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev6.0.3\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix checkout init for SHA-256 repositories by \u003ca href\u003d\"https://github.com/yaananth\"\u003e\u003ccode\u003e@​yaananth\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2439\"\u003eactions/checkout#2439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: expand merge commit SHA regex and add SHA-256 test cases by \u003ca href\u003d\"https://github.com/yaananth\"\u003e\u003ccode\u003e@​yaananth\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2414\"\u003eactions/checkout#2414\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev6.0.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix tag handling: preserve annotations and explicit fetch-tags by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2356\"\u003eactions/checkout#2356\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev6.0.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd worktree support for persist-credentials includeIf by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2327\"\u003eactions/checkout#2327\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev6.0.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePersist creds to a separate file by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2286\"\u003eactions/checkout#2286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate README to include Node.js 24 support details and requirements by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2248\"\u003eactions/checkout#2248\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev5.0.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePort v6 cleanup to v5 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2301\"\u003eactions/checkout#2301\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev5.0.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate actions checkout to use node 24 by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2226\"\u003eactions/checkout#2226\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.3.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePort v6 cleanup to v4 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2305\"\u003eactions/checkout#2305\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.3.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003edocs: update README.md by \u003ca href\u003d\"https://github.com/motss\"\u003e\u003ccode\u003e@​motss\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1971\"\u003eactions/checkout#1971\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd internal repos for checking out multiple repositories by \u003ca href\u003d\"https://github.com/mouismail\"\u003e\u003ccode\u003e@​mouismail\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1977\"\u003eactions/checkout#1977\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocumentation update - add recommended permissions to Readme by \u003ca href\u003d\"https://github.com/benwells\"\u003e\u003ccode\u003e@​benwells\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2043\"\u003eactions/checkout#2043\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdjust positioning of user email note and permissions heading by \u003ca href\u003d\"https://github.com/joshmgross\"\u003e\u003ccode\u003e@​joshmgross\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2044\"\u003eactions/checkout#2044\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate README.md by \u003ca href\u003d\"https://github.com/nebuk89\"\u003e\u003ccode\u003e@​nebuk89\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2194\"\u003eactions/checkout#2194\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate CODEOWNERS for actions by \u003ca href\u003d\"https://github.com/TingluoHuang\"\u003e\u003ccode\u003e@​TingluoHuang\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2224\"\u003eactions/checkout#2224\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate package dependencies by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2236\"\u003eactions/checkout#2236\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eurl-helper.ts\u003c/code\u003e now leverages well-known environment variables by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1941\"\u003eactions/checkout#1941\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExpand unit test coverage for \u003ccode\u003eisGhes\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1946\"\u003eactions/checkout#1946\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck out other refs/* by commit if provided, fall back to ref by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@​orhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1924\"\u003eactions/checkout#1924\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\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 href\u003d\"https://github.com/actions/checkout/commit/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0\"\u003e\u003ccode\u003e9c091bb\u003c/code\u003e\u003c/a\u003e update error wording (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2467\"\u003e#2467\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/1044a6dea927916f2c38ba5aeffbc0a847b1221a\"\u003e\u003ccode\u003e1044a6d\u003c/code\u003e\u003c/a\u003e getting ready for checkout v7 release (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2464\"\u003e#2464\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/f0282184c7ce73ab54c7e4ab5a617122602e575f\"\u003e\u003ccode\u003ef028218\u003c/code\u003e\u003c/a\u003e Bump the minor-npm-dependencies group across 1 directory with 3 updates (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2462\"\u003e#2462\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/d914b262ffc244530a203ab40decab34c3abf34d\"\u003e\u003ccode\u003ed914b26\u003c/code\u003e\u003c/a\u003e upgrade module to esm and update dependencies (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2463\"\u003e#2463\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/537c7ef99cef6e5ddb5e7ff5d16d14510503801d\"\u003e\u003ccode\u003e537c7ef\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/core\u003c/code\u003e and \u003ccode\u003e@​actions/tool-cache\u003c/code\u003e and Remove uuid (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2459\"\u003e#2459\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/130a169078a413d3a5246a393625e8e742f387f6\"\u003e\u003ccode\u003e130a169\u003c/code\u003e\u003c/a\u003e Bump js-yaml from 4.1.0 to 4.2.0 (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2461\"\u003e#2461\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/7d09575332117a40b46e5e020664df234cd416f3\"\u003e\u003ccode\u003e7d09575\u003c/code\u003e\u003c/a\u003e Bump flatted from 3.3.1 to 3.4.2 (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2460\"\u003e#2460\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/0f9f3aa320cb53abeb534aeb54048075d9697a0e\"\u003e\u003ccode\u003e0f9f3aa\u003c/code\u003e\u003c/a\u003e Bump actions/publish-immutable-action (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2458\"\u003e#2458\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/f9e715a95fcd1f9253f77dd28f11e88d2d6460c7\"\u003e\u003ccode\u003ef9e715a\u003c/code\u003e\u003c/a\u003e block checking out fork pr for pull_request_target and workflow_run (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2454\"\u003e#2454\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/actions/checkout/compare/v6...v7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/checkout\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d6\u0026new-version\u003d7)](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 alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\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 that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\u003c/details\u003e"
    },
    {
      "commit": "a363eef1eb2e4417cf33692c9ee6dc754c83f18f",
      "tree": "bd5cd6a25f35a995111af04fd97eb25499a65f6c",
      "parents": [
        "cfea040f8bee40cb182183fb5ec00a1334e5f0ca"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Thu Jun 18 15:46:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 22:46:32 2026 +0000"
      },
      "message": "added mboetger to unified check run (#5077)\n\nTurned on unified check run feature to Matt"
    },
    {
      "commit": "cfea040f8bee40cb182183fb5ec00a1334e5f0ca",
      "tree": "3e8ce11177ef963258e9dcdeefe630aaef8d5e08",
      "parents": [
        "2e641090c9a4d34b08fa61aec460d8fcd86815f8"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Thu Jun 18 15:41:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 22:41:22 2026 +0000"
      },
      "message": "docs(docker): add FAQ for using git worktrees (#5076)\n\nAdded a new FAQ \u0026 Troubleshooting section to the flutter_agy_docker README.\r\nThis section explains how to configure Git to use relative paths for worktrees\r\nwhen working within the container to prevent broken worktree references.\r\n\r\nAlso make sure the next image has this turned on so when you type \"gwta fu\" you get a \".git\" that is relative."
    },
    {
      "commit": "2e641090c9a4d34b08fa61aec460d8fcd86815f8",
      "tree": "532881f877d80bdbd3f0c8c728e39b4782cc2dff",
      "parents": [
        "6590183e6636d7d31a6c0a3add4ced5b9ebda2ac"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Thu Jun 18 14:40:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 14:40:45 2026 -0700"
      },
      "message": "feat(docker): add dev environment compose file and helper scripts (#5075)\n\n- Adds a simple. README.md\n- Adds docker-compose.yml configured to use the flutter_docker image,\nwith volume mappings for .dart_tool, build cache, and the .gemini\nfolder.\n- Adds functions.sh with coder-up, coder-attach, and coder-down\nconvenience functions to manage the podman container lifecycle and\nconnect via tmux."
    },
    {
      "commit": "6590183e6636d7d31a6c0a3add4ced5b9ebda2ac",
      "tree": "818041b83e4630cfcd630b5dee104cb283bd3ee6",
      "parents": [
        "8c6e7392131e3a2f80ff9f18069d81c1d4fba3c1"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Jun 17 13:58:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 20:58:07 2026 +0000"
      },
      "message": "188117 shaselector (#5074)\n\nShow date and status in ShaSelector drop down menu while collapsed\r\nfix: https://github.com/flutter/flutter/issues/188117"
    },
    {
      "commit": "8c6e7392131e3a2f80ff9f18069d81c1d4fba3c1",
      "tree": "4c938d9907880831eb1e91db0f8c285d315f47b8",
      "parents": [
        "265d8974a2f5604d3881679198b2976c29e0ba9e"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed Jun 17 08:19:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 15:19:01 2026 +0000"
      },
      "message": "Default user \u003d\u003d coder (#5073)\n\nUbuntu sets `ubuntu` as user 1000. I want this as `coder`. This fixes mounting files into the image."
    },
    {
      "commit": "265d8974a2f5604d3881679198b2976c29e0ba9e",
      "tree": "f8f3f30ada8f12261fa0a6f7fa21e8affcd4e067",
      "parents": [
        "b8b2020b071dd58c36347c4992c175e34edf6c44"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 16 16:31:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 23:31:09 2026 +0000"
      },
      "message": "fix comments (#5072)\n\nfix few comment leftovers from https://github.com/flutter/cocoon/pull/5070 renames"
    },
    {
      "commit": "b8b2020b071dd58c36347c4992c175e34edf6c44",
      "tree": "31ff55ff61dc95ee0e938d90f0618b86e2bc36b5",
      "parents": [
        "29f66bdccc3cb7336e7b535b628ba9e2af14d15a"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 16 16:13:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 23:13:23 2026 +0000"
      },
      "message": "Rename “Flutter Presubmits” check to “Dashboard Checks” check (#5070)\n\nRename “Flutter Presubmits” check to “Dashboard Checks” check and add some description"
    },
    {
      "commit": "29f66bdccc3cb7336e7b535b628ba9e2af14d15a",
      "tree": "2e52c1e8fa722cea12f7e1c6d34999bdbb8c4d0f",
      "parents": [
        "6b504a599be5722d2c11928afda0cf9b69d122c4"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 16 15:28:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 22:28:08 2026 +0000"
      },
      "message": "added beta testers of unified check run (#5069)\n\nAdded Victoria and Loïc to beta testers"
    },
    {
      "commit": "6b504a599be5722d2c11928afda0cf9b69d122c4",
      "tree": "340ca4c6ba4a754ef80c186bf4d68552a035aac6",
      "parents": [
        "2862ed40de6807eb395e29f0bb2576c78261ae41"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 16 15:17:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 15:17:17 2026 -0700"
      },
      "message": "git version 2.54.0 (#5071)\n\nDocker image needs newer version of Git to support relative workspaces."
    },
    {
      "commit": "2862ed40de6807eb395e29f0bb2576c78261ae41",
      "tree": "16a39eccc6da87031b2941f012cdfd177988f5cd",
      "parents": [
        "80616b25f31f6836ee4f457a60d55f66890ff416"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 16 12:27:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 19:27:19 2026 +0000"
      },
      "message": "Change Docker build context to `cloud_build/flutter_agy_docker` (#5068)\n\nThis works if you run the cloud build command in the folder, but Cloud Console needs to know the directory though\r\n\r\nAfter this change we can setup a schedule."
    },
    {
      "commit": "80616b25f31f6836ee4f457a60d55f66890ff416",
      "tree": "08dd842c7d569d59110f6308fb0cf84abc410244",
      "parents": [
        "22c0a9e5cf8d9f3c575df5c2b17790c7023358fe"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 16 11:33:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 18:33:11 2026 +0000"
      },
      "message": "Update Docker image registry from us-central1 to us (#5067)\n\nmultiregion"
    },
    {
      "commit": "22c0a9e5cf8d9f3c575df5c2b17790c7023358fe",
      "tree": "2600ee51f7d1612774a71300a73c7a48e410143c",
      "parents": [
        "abceaae43c0d7258ad9057097127b25bfafcb717"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Tue Jun 16 11:21:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 18:21:24 2026 +0000"
      },
      "message": "store state entirely in query parameters (#5064)\n\nfix: https://github.com/flutter/flutter/issues/186357"
    },
    {
      "commit": "abceaae43c0d7258ad9057097127b25bfafcb717",
      "tree": "21b9d4cdf558ebf390bb9c63a8b02ba8441f183e",
      "parents": [
        "0f861a93e86cfa1a6c1e00a51af5e6dce33ebff5"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Tue Jun 16 11:13:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 11:13:53 2026 -0700"
      },
      "message": "bug(cloudbuild): explicitly tell cloudbuild where to send logs. (#5065)\n\nCloud build triggers need this line."
    },
    {
      "commit": "0f861a93e86cfa1a6c1e00a51af5e6dce33ebff5",
      "tree": "0f27d50cf605bdf3b6854c487b6c8306150214bc",
      "parents": [
        "43dcc7d1abbcaaa605d5c08fc2ddd6d85fc31703"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Mon Jun 15 18:14:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 18:14:12 2026 -0700"
      },
      "message": "feat(flutter_agy_docker): add Dockerfile and Cloud Build configuration (#5063)\n\nNew Dockerfile and cloudbuild.yaml to produce a development image.\n\nThe Dockerfile sets up a multi-stage build that fetches, hydrates, and\nconfigures the Flutter SDK, and installs opinionated developer tools."
    },
    {
      "commit": "43dcc7d1abbcaaa605d5c08fc2ddd6d85fc31703",
      "tree": "b72f46aa77b6c3e8ca977295296e33f715759fc5",
      "parents": [
        "41fbbe2a453a9cb8086520f5346db5d4de9c65dd"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Mon Jun 15 11:32:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 18:32:55 2026 +0000"
      },
      "message": "Fixed light mode style discrepancies (#5062)\n\nfix: https://github.com/flutter/flutter/issues/187964"
    },
    {
      "commit": "41fbbe2a453a9cb8086520f5346db5d4de9c65dd",
      "tree": "2a410eb53281e3ca8245e2160e7d079475cc93c7",
      "parents": [
        "5e6ac217a14e35554e922f59607efc5647aa0ffd"
      ],
      "author": {
        "name": "Dmitry Grand (dmgr)",
        "email": "dmgr@google.com",
        "time": "Wed Jun 10 10:40:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 17:40:30 2026 +0000"
      },
      "message": "Recursively extract logs of failed steps in build or its subbuilds (#5061)\n\nfix: https://github.com/flutter/flutter/issues/187764"
    },
    {
      "commit": "5e6ac217a14e35554e922f59607efc5647aa0ffd",
      "tree": "3c33e22e00a4673bf0edc28a3b21739d4dcec5b9",
      "parents": [
        "eb605563185f5b0cf50b4bf75d3b87c521997f32"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu Jun 04 12:33:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 12:33:30 2026 -0700"
      },
      "message": "show markdown for log analysis (#5059)\n\nfix: https://github.com/flutter/flutter/issues/187577"
    },
    {
      "commit": "eb605563185f5b0cf50b4bf75d3b87c521997f32",
      "tree": "4a42452e44813afd0923848f7f114fb79194df5c",
      "parents": [
        "adbeb316fb3c8888053b5eaada13e20ace89eaeb"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu Jun 04 12:32:37 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 12:32:37 2026 -0700"
      },
      "message": "unlock merge queue for cocoon (#5060)\n\nfix: https://github.com/flutter/flutter/issues/187582"
    },
    {
      "commit": "adbeb316fb3c8888053b5eaada13e20ace89eaeb",
      "tree": "4d795db00121be1160093d4bc3cc38e4ee73a26e",
      "parents": [
        "d0b57da7e0e7144c73c94cba1c635012932430dd"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Tue Jun 02 14:00:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 21:00:41 2026 +0000"
      },
      "message": "Do not immediately unlock `Flutter Presubmits` on non-fusion repos for unified check run flow (#5058)\n\nModified `triggerPresubmitTargets` event handler logic to do not immediately unlock `MergeQueueGuard` for non-fusion repositories if the unified check run flow is enabled\r\n\r\nfix: https://github.com/flutter/flutter/issues/187458"
    },
    {
      "commit": "d0b57da7e0e7144c73c94cba1c635012932430dd",
      "tree": "a107561483be99b98ffdc2bfd9669be8f5bbb8e4",
      "parents": [
        "b596b13d361670c5e6039adf65669d6e86b4d510"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Mon Jun 01 12:55:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 19:55:17 2026 +0000"
      },
      "message": "Check-runs statuses are not updated for flutter/packages (#5057)\n\nFix: https://github.com/flutter/flutter/issues/187387\r\n\r\n1. Match Scheduled Stage: Conditionally set the stage argument passed to scheduleTryBuilds to match the repository type.\r\n2. Do Not Bypass Completed Unified Check Runs: Modified the early return condition in processCheckRunCompleted so that unified checkrun events for non-fusion repositories are processed.\r\n3. Unlock Merge Queue Guard on genericTests Completion: When the stage is CiStage.genericTests and the unified check run completes successfully, close/unlock the merge queue guard."
    },
    {
      "commit": "b596b13d361670c5e6039adf65669d6e86b4d510",
      "tree": "3304174ff84bdce6a36f83e4e6d70915e0705318",
      "parents": [
        "200915d86d64884f56ad5a1352443ed55f073bf8"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu May 28 16:00:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 23:00:22 2026 +0000"
      },
      "message": "updated sign_in_button version (#5056)\n\n1. Updated sign_in_button version to 5.0.0 to fix error: \r\n\r\n```\r\n/builder/home/.pub-cache/hosted/pub.dev/font_awesome_flutter-10.12.0/lib/src/icon_data.dart:28:31:\r\nStep #0: Error: The class \u0027IconData\u0027 can\u0027t be extended outside of its library because it\u0027s a final class.\r\nStep #0: class IconDataRegular extends IconData {\r\n```\r\n\r\n2. Added unit test to make sure `presubmit_guard` document created for `flutter/packages` when unified check run enabled for user."
    },
    {
      "commit": "200915d86d64884f56ad5a1352443ed55f073bf8",
      "tree": "955318a9798230b815ce083644c07249a69e54f8",
      "parents": [
        "1abc9863af7f7c3ff488fb88a23876b77ad58d39"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Wed May 27 10:27:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 17:27:55 2026 +0000"
      },
      "message": "create presubmit_guard for non flutter repos in unified check run flow (#5055)\n\nfix: https://github.com/flutter/flutter/issues/186485"
    },
    {
      "commit": "1abc9863af7f7c3ff488fb88a23876b77ad58d39",
      "tree": "c484d93cf29c83b9277a530dd61370dba97db73f",
      "parents": [
        "80a6c47b6fed985e94769a55684f2f8f8cd1d0d6"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu May 21 14:18:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 21:18:27 2026 +0000"
      },
      "message": "Changed buildId type to Int64 (#5054)\n\nChanged buildId type to Int64 to correspond with Build.id type"
    },
    {
      "commit": "80a6c47b6fed985e94769a55684f2f8f8cd1d0d6",
      "tree": "d1b20ade4eee144e0bfd944226a1fe3046977d40",
      "parents": [
        "b5fde752e164040188a25c7f162a10dd3eeadfe2"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Mon May 18 15:42:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 15:42:56 2026 -0700"
      },
      "message": "Add more checks to JWTs (#5053)\n\nRequires RS256 in alg field\nRejects other headers (paranoid)"
    },
    {
      "commit": "b5fde752e164040188a25c7f162a10dd3eeadfe2",
      "tree": "7d19e75a735593562a44c60c2f78b87d4fd87960",
      "parents": [
        "ae834c235b06262f7120fd5a85ed08d181e1dc99"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu May 14 14:31:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 14:31:46 2026 -0700"
      },
      "message": "Added Evan to unified checkrun beta testers (#5052)\n\nAdded Evan to unified check run beta testers"
    },
    {
      "commit": "ae834c235b06262f7120fd5a85ed08d181e1dc99",
      "tree": "36ec1397e421808829b16d243f36337d7700ba69",
      "parents": [
        "f34e34b70ee12837ee49dff15140ab2aab3b2de4"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Wed May 13 12:35:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 12:35:33 2026 -0700"
      },
      "message": "removed Justin from beta testers (#5051)\n\nremoved Justin from beta testers unless test flutter/packages flow"
    },
    {
      "commit": "f34e34b70ee12837ee49dff15140ab2aab3b2de4",
      "tree": "d7ef1332b659055688e5526b8d0a2b44e5ab09f4",
      "parents": [
        "c8e3ba5e0bd2a75e3b06a4e2b17ba4c666ea637c"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Fri May 08 15:29:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 22:29:23 2026 +0000"
      },
      "message": "[Gemini Log Analyzer] Part 4: Frontend Integration (Dashboard UI) (#5044)\n\nThis is Part 4 of the stacked Pull Request series implementing the Gemini Log Analyzer feature.\n\n**Depends on Part 3:** #5043 (Note: Targets `main` due to GitHub cross-repo limits, but chains to #5043 via description).\n\nThis PR integrates the feature into the Cocoon Dashboard UI:\n- Adds \"Log Analysis\" tab to display the Gemini log analyzer results when available.\n- Adds \"Analyze Logs with Gemini\" action button to trigger the API from the presubmit dashboard.\n- Implements spellchecking, permission-checking, and error-handling for the trigger action.\n\n### Stacked PR Series:\n- Part 1: Backend Foundation (Models \u0026 Setup) (Merged)\n- Part 2: Backend Infrastructure (Config \u0026 Database Data Flow) (#5045)\n- Part 3: Backend Core API (Genkit Logic \u0026 Handlers) (#5043)\n- **Part 4: Frontend Dashboard UI** (This PR)"
    },
    {
      "commit": "c8e3ba5e0bd2a75e3b06a4e2b17ba4c666ea637c",
      "tree": "c0cf4d7ba248257c8dfbf9a1b41796b6462e6fde",
      "parents": [
        "6f645b46451b156c348dfcae98ba0f4f4a511b43"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu May 07 10:39:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 17:39:12 2026 +0000"
      },
      "message": "Added Andy, Camille and Justin to unified check run users (#5041)\n\nAdded Andy, Camille and Justin to unified check run users"
    },
    {
      "commit": "6f645b46451b156c348dfcae98ba0f4f4a511b43",
      "tree": "759e4e57049efa5e66f6b64be72cbd103b2daf0f",
      "parents": [
        "915cf5fd42bb4905568b44afb82d3a05b0eced69"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Thu May 07 08:48:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 15:48:20 2026 +0000"
      },
      "message": "[Gemini Log Analyzer] Part 3: Backend Core (Analyze Logs API \u0026 Service) (#5043)\n\nThis is Part 3 of the stacked Pull Request series implementing the Gemini Log Analyzer feature.\r\n\r\n**Part 1 \u0026 Part 2 Backend Infrastructure have been merged!** This PR now contains only the core API implementation on top of main.\r\n\r\nThis PR implements the core backend service and API request handlers for analyzing logs:\r\n- Instantiates the Genkit client and configures plugins (using `googleAI`) in `gae_server.dart`.\r\n- Implements `LogAnalyzer` and its Genkit integration to fetch and parse LUCI build logs.\r\n- Adds the `analyze_logs` request handler and exposes it as the `/api/analyze-logs` endpoint.\r\n\r\n### Stacked PR Series:\r\n- Part 1: Backend Foundation (Models \u0026 Setup) (Merged)\r\n- Part 2: Backend Infrastructure (Config \u0026 Database Data Flow) (Merged)\r\n- **Part 3: Backend Core API (Genkit Logic \u0026 Handlers)** (This PR)\r\n- Part 4: Frontend Dashboard UI"
    },
    {
      "commit": "915cf5fd42bb4905568b44afb82d3a05b0eced69",
      "tree": "1c0afc34c435f5284a38f90b1999a6821f1ce0af",
      "parents": [
        "02d2850fe05d628ab68ecd57ef1cfaf4194ee39f"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed May 06 15:27:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 15:27:23 2026 -0700"
      },
      "message": "fix: make some APIs cron-only (#5049)\n\nThe biggest part of this change is trying to keep\nDashboardAuthentication somewhat flexible. You can extract a \"cron only\"\nauthentication from the chain of responsibility."
    },
    {
      "commit": "02d2850fe05d628ab68ecd57ef1cfaf4194ee39f",
      "tree": "f5bbf9950755e3aa66cebbcc6f2375f6e948a148",
      "parents": [
        "70d12d440e67fcdd1dd4183b8c5b520d8d80d7b8"
      ],
      "author": {
        "name": "Jason Simmons",
        "email": "jason-simmons@users.noreply.github.com",
        "time": "Wed May 06 22:25:51 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 15:25:51 2026 -0700"
      },
      "message": "When properties are extracted from a target configuration, exclude properties that affect source locations used by LUCI recipes (#5050)\n\nThese properties should only be set by Cocoon\u0027s build scheduler.\n\nSee http://b/509842706"
    },
    {
      "commit": "70d12d440e67fcdd1dd4183b8c5b520d8d80d7b8",
      "tree": "a2850f36a62a71b1f6c2cd907f5b6fa708ef2293",
      "parents": [
        "e34a5ab3f07a4c32a4419d26522aecff93f508e3"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Wed May 06 13:09:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 20:09:07 2026 +0000"
      },
      "message": "on refresh fetch shas and guards even if pr and sha not changed (#5048)\n\nfix: https://github.com/flutter/flutter/issues/184529"
    },
    {
      "commit": "e34a5ab3f07a4c32a4419d26522aecff93f508e3",
      "tree": "ffb0f88de9d1c39fd25d32b89f82e88ca0a893b8",
      "parents": [
        "926e2c1982168b7d24eac135eea054e5a0ac54bf"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed May 06 10:22:37 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 10:22:37 2026 -0700"
      },
      "message": "fix: check allowed repositories in vacuum commit api. (#5047)\n\ncc: @straka"
    },
    {
      "commit": "926e2c1982168b7d24eac135eea054e5a0ac54bf",
      "tree": "20021f2591a6f421a2bc3a02db0c991656d8e41c",
      "parents": [
        "9cf4c69d35eeb3da55d8a3271950605ad2fbc300"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Wed May 06 09:53:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 09:53:51 2026 -0700"
      },
      "message": "fix: add extra verifications to JWT checks. (#5046)"
    },
    {
      "commit": "9cf4c69d35eeb3da55d8a3271950605ad2fbc300",
      "tree": "53ff88ff00999ab69ae2cf2d72a2e55f65a2862c",
      "parents": [
        "348ac7e4bacd026273e5a67765afa43d0880fdeb"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Tue May 05 16:29:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 23:29:06 2026 +0000"
      },
      "message": "[Gemini Log Analyzer] Part 2: Backend Infrastructure (Config, Models, \u0026 Database Flow) (#5045)\n\nThis is Part 2 of the stacked Pull Request series implementing the Gemini Log Analyzer feature.\n\n**Depends on Part 1 (already merged):** #5042\n\nThis PR extracts the backend data flow, configuration, dynamic config flags, and serialization models from the API implementation branch into a clean infrastructure layer:\n- Configures AppEngine service config and flags in `config.yaml` and generated dynamic config files.\n- Implements database storage interface `storeLogAnalysis` in `UnifiedCheckRun`.\n- Adds the `logAnalysis` field to the `PresubmitJobResponse` RPC models to serialize results.\n\n### Stacked PR Series:\n- Part 1: Backend Foundation (Models \u0026 Setup) (Merged)\n- **Part 2: Backend Infrastructure (Config \u0026 Database Data Flow)** (This PR)\n- Part 3: Backend Core API (Genkit Logic \u0026 Handlers)\n- Part 4: Frontend Dashboard UI"
    },
    {
      "commit": "348ac7e4bacd026273e5a67765afa43d0880fdeb",
      "tree": "1fc8648c3f98d11eb31e95c19ac1e9f3bbf07d45",
      "parents": [
        "6df3c8f5cb7c04e3330eea4aefe88ad1b1038763"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Tue May 05 14:54:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 21:54:16 2026 +0000"
      },
      "message": "[Gemini Log Analyzer] Part 1: Backend Foundation (Models, Config, \u0026 Setup) (#5042)\n\nThis is Part 1 of a stacked PR series implementing the Gemini Log Analyzer feature: https://github.com/flutter/flutter/issues/185700\r\n\r\nThis PR establishes the required foundation:\r\n- Adds `APP_DART_GEMINI_LOG_ANALYZER_KEY` secret config property to `Config`.\r\n- Adds `log_analysis` and `build_id` fields to Firestore `PresubmitJob` model.\r\n- Adds `build_id` to `PresubmitJobResponse` RPC model in `cocoon_common`.\r\n\r\n### Stacked PR Series:\r\n- **Part 1: Backend Foundation** (This PR)\r\n- Part 2: Backend Core API\r\n- Part 3: Frontend Dashboard UI"
    },
    {
      "commit": "6df3c8f5cb7c04e3330eea4aefe88ad1b1038763",
      "tree": "2d45f76890ae46a28c56af54daece9f9152d5158",
      "parents": [
        "0e1244eee81badf4dbfc3b9ac505bcd1599d7c7b"
      ],
      "author": {
        "name": "Kate Lovett",
        "email": "katelovett@google.com",
        "time": "Tue May 05 12:52:56 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 17:52:56 2026 +0000"
      },
      "message": "De-duplicate GitHub check runs by name and keep latest result (#5040)\n\nFixes https://github.com/flutter/flutter/issues/185898\r\n\r\nWhen a workflow runs multiple times on the same commit (e.g. when triggered repeatedly by labeling events), superseded failures can unintentionally block pull requests during Auto-Submit validations.\r\n\r\nThis PR updates the CiSuccessful.validateCheckRuns validation logic to:\r\n\r\n- Group checkRuns by checkRun.name.\r\n- De-duplicate check runs of the same name by evaluating their startedAt timestamp.\r\n- Exclusively retain and validate the latest result per check run name when proceeding with PR validation."
    },
    {
      "commit": "0e1244eee81badf4dbfc3b9ac505bcd1599d7c7b",
      "tree": "a8d34bbbe50609faa597f526f5b50804222dc72d",
      "parents": [
        "22eeee3338982c35b8d902dc1acf910d0f3529ab"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Fri May 01 08:37:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 08:37:20 2026 -0700"
      },
      "message": "update golang (#5039)"
    },
    {
      "commit": "22eeee3338982c35b8d902dc1acf910d0f3529ab",
      "tree": "52b4ce8ed12e0c2b4685687cf6d12222e513182d",
      "parents": [
        "93db417d688244741a0640d0b76ce154258c7bd3"
      ],
      "author": {
        "name": "John \"codefu\" McDole",
        "email": "codefu@google.com",
        "time": "Fri May 01 08:25:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 15:25:57 2026 +0000"
      },
      "message": "remove gemini-cli-action workflows for now. (#5038)"
    },
    {
      "commit": "93db417d688244741a0640d0b76ce154258c7bd3",
      "tree": "793c0ff3c560ff6350ec84929164bb9c7fcd1f54",
      "parents": [
        "b375de7ee27124a45c41cd2c3adf9f0da0fa6a9b"
      ],
      "author": {
        "name": "Kate Lovett",
        "email": "katelovett@google.com",
        "time": "Thu Apr 30 16:33:39 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 14:33:39 2026 -0700"
      },
      "message": "[flutter-gold] Consider neutral checks completed (#5036)\n\nFixes https://github.com/flutter/flutter/issues/185832\n\nThis PR improves how Flutter Gold status updates are computed by\naccounting for completed checks that end in a `NEUTRAL` conclusion\n(alongside `SUCCESS`). It also streamlines logging and fortifies the\ncheck status evaluation.\n\n* Updates the evaluation logic so that PR checks ending in NEUTRAL are\nno longer grouped alongside incomplete or failing tests.\n* Added explicit status verification for check runs. If a check run does\nnot have the status \u0027COMPLETED\u0027, it is now safely and reliably\nclassified as incomplete.\n* Moved the log.debug statement to only capture check runs that are\ntruly incomplete or failing, significantly reducing log output noise.\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read the [Flutter Style Guide] _recently_, and have followed its\nadvice.\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] All existing and new tests are passing.\n\nIf you need help, consider asking for advice on the #hackers-new channel\non [Discord].\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#overview\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#tests\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md\n[CLA]: https://cla.developers.google.com/\n[flutter/tests]: https://github.com/flutter/tests\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Discord]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md\n\n---------\n\nCo-authored-by: John \"codefu\" McDole \u003cjohn@mcdole.org\u003e\nCo-authored-by: John McDole \u003ccodefu@google.com\u003e"
    },
    {
      "commit": "b375de7ee27124a45c41cd2c3adf9f0da0fa6a9b",
      "tree": "517150279ffa8a6dd51d7a774ac02453b7612773",
      "parents": [
        "45be26a06d2a973d669308c2f24c612fe5b123c1"
      ],
      "author": {
        "name": "gaaclarke",
        "email": "30870216+gaaclarke@users.noreply.github.com",
        "time": "Mon Apr 27 18:26:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 01:26:22 2026 +0000"
      },
      "message": "Made it so dismissed approvals don\u0027t block the autosubmit bot. (#5025)\n\nfixes https://github.com/flutter/flutter/issues/185224"
    },
    {
      "commit": "45be26a06d2a973d669308c2f24c612fe5b123c1",
      "tree": "5fa7426e996a33d33ddb510fc1b4e04e2766975b",
      "parents": [
        "e642968955b980eb6c8ade0bd0051f6cf7d2c4bf"
      ],
      "author": {
        "name": "Jackson Gardner",
        "email": "jacksongardner@google.com",
        "time": "Mon Apr 27 13:46:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 20:46:21 2026 +0000"
      },
      "message": "Unlock Flutter Presubmits and Merge Queue Guard when emergency label is added. (#5033)\n\nThis addresses https://github.com/flutter/flutter/issues/185628"
    },
    {
      "commit": "e642968955b980eb6c8ade0bd0051f6cf7d2c4bf",
      "tree": "f36f23e7482a901139e82b697d6730af089d8002",
      "parents": [
        "11e416d62629e8371c76bee8da266a187d50c425"
      ],
      "author": {
        "name": "Dmitry Grand",
        "email": "dmgr@google.com",
        "time": "Mon Apr 27 13:20:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 20:20:24 2026 +0000"
      },
      "message": "Ensure sequential fetch and refetch available sha if PR is not provided (#5032)\n\nfix: https://github.com/flutter/flutter/issues/185631"
    }
  ],
  "next": "11e416d62629e8371c76bee8da266a187d50c425"
}
