)]}'
{
  "log": [
    {
      "commit": "0501fd505e2811963d83942ba9f6308565e38d47",
      "tree": "7fcdf290248a71be89915101bf4b59dfc3373924",
      "parents": [
        "bf6684c3991d604ef82354c8ea3f33170dfe8331"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Aug 27 21:55:25 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Aug 27 21:56:29 2026 -0700"
      },
      "message": "Fix 1 ClangTidyLegacy finding:\n* inclusion of forwarding header \u0027util/task/status_macros.h\u0027; use \u0027third_party/gloop/util/status/status_macros.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyLegacy if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-legacy-forwarding-headers\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 972340118\nChange-Id: Iaffd62eb348c3eab9fe38be6cc25d447ce20ee56\n"
    },
    {
      "commit": "bf6684c3991d604ef82354c8ea3f33170dfe8331",
      "tree": "979a1c123b77a66f4d49d34b8e06c8ce26ea4bd9",
      "parents": [
        "82e369a578d119964de9409a66369e04bcbd2387"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Thu Aug 27 12:14:56 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Aug 27 12:16:48 2026 -0700"
      },
      "message": "safepower: Limit saved actions files to two in ping-pong fashion\n\nThis change restricts the persistent storage to use only two files:\n`savedactions_0` and `savedactions_1`.\n\nWe introduce a `sequence_number` to the `SavedActions` proto. The file\nwith the higher sequence number is considered the active (latest) state.\nWhen writing, we append to the active file. When it exceeds the size\nlimit, we compress the state and write it to the other (inactive) file\nwith an incremented sequence number, effectively rotating them.\n\nWe also implement migration: if neither `savedactions_0` nor\n`savedactions_1` exists, but older files (with IDs \u003e 1) exist, we find\nthe largest one, read it as the base state, and then delete all old\nfiles.\n\nIf one of the files is corrupt, we fall back to the other one.\n\nBug: 455973485\nPiperOrigin-RevId: 972087773\nChange-Id: I4240b850eee1ae54f470fd239fb8bbe2a30bc449\n"
    },
    {
      "commit": "82e369a578d119964de9409a66369e04bcbd2387",
      "tree": "2baac9728c460425bafbfcf6f3ca6aabc85d4f43",
      "parents": [
        "428d989f6d17d0410434f55ca7a8076fc49a7a51"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Aug 25 10:27:40 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Aug 25 10:28:38 2026 -0700"
      },
      "message": "Cloned from CL 968062044 by \u0027hg patch\u0027.\nOriginal change by shounak@shounak:fig-export-fix_bug_v5_support-534134-change-1:535334:citc on 2026/08/20 14:37:53.\n\n#gpowerd - Support v5 vEEPROM telemetry for safe_to_shutdown in GnicMonitor\n\nIn version 5 of the vEEPROM telemetry layout (cl/929606823), safe_to_shutdown\nis contained within v5_fields instead of v3_fields.\n\nUpdate GnicMonitor::CheckImpl to extract safe_to_shutdown from either\nv3_fields (for v3/v4 layouts) or v5_fields (for v5 layout). Also add\nunit test coverage for v5 telemetry handling, checksum retry, and timeout\ntransitions.\n\nTested:\n  blaze test //production/borg_mgmt/node_proxy/safepower/safepower_agent/bmc:gnic_monitor_test\nPiperOrigin-RevId: 970641693\nChange-Id: If554d00e1ca3ff1ffb9e12176bb92ce9cd46210e\n"
    },
    {
      "commit": "428d989f6d17d0410434f55ca7a8076fc49a7a51",
      "tree": "00662f5306a8d2a08883a0273ba464e54e73d3a5",
      "parents": [
        "6f8975f889ba1021c90f0c1f2646dcbcdda99ff6"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Aug 20 15:39:06 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Aug 20 15:39:44 2026 -0700"
      },
      "message": "Fix timer registration collision in ActionContext\n\nDisambiguate the task names for initialization (init_task_name) and\nfinal state persistence (final_state_task_name) from execution_task_name\nto prevent ALREADY_EXISTS collisions in SchedulerAgent when a precondition\nmatches immediately at startup.\n\nFor detailed root cause analysis and state transitions, see:\nhttps://docs.google.com/document/d/1iDeQ3h9eynJKDAR9yyt0HFGLlTExTbYv-i02x04jAw4/edit\n\nPiperOrigin-RevId: 968097005\nChange-Id: Ife7ca4c46e7f6a33bcefe702301ddefecaed1aa4\n"
    },
    {
      "commit": "6f8975f889ba1021c90f0c1f2646dcbcdda99ff6",
      "tree": "c8481bf7b301f351fe977d8e5c4c4767cd293453",
      "parents": [
        "6380505ec19743eda6d18e763da4c0973a31fec5"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Aug 18 16:52:58 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Aug 18 16:53:41 2026 -0700"
      },
      "message": "safepower: Incorporate EventQueue and event loop into ServiceImpl\n\nThis CL introduces the EventQueue into ServiceImpl and implements the basic start/stop lifecycle.\n- ServiceImpl now owns the EventQueue and exposes Run() and Stop() methods.\n- ScaffoldingServiceImpl (host) manages a thread::Fiber to execute the ServiceImpl::Run() loop, hooking into the ServerContext lifecycle.\n- gpowerd (BMC) manages a std::thread to execute the ServiceImpl::Run() loop, hooking into the SIGTERM handler.\n- Gated build dependencies to ensure host targets use the fiber implementation and BMC targets use the thread implementation.\n\nAll relevant tests pass.\n\nPiperOrigin-RevId: 966879492\nChange-Id: I0d90d1cfce198b805cad7e36ac9b2fb3cd268b9b\n"
    },
    {
      "commit": "6380505ec19743eda6d18e763da4c0973a31fec5",
      "tree": "eac5762ef8cfd8f304c153c16e0f126bfd2f29e1",
      "parents": [
        "a77584143646268fab13c7c2896e96eda775f39a"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Fri Aug 14 13:52:30 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Aug 14 13:53:26 2026 -0700"
      },
      "message": "safepower: Reuse CompressLogs in WriteSavedActionsChange\n\nRefactored PersistentStorageManagerImpl::WriteSavedActionsChange to reuse\nCompressLogs by adding a prune parameter to CompressLogs. This removes duplicate\ncode that was converting the map back to the proto list after pruning.\n\nPiperOrigin-RevId: 964872532\nChange-Id: I6da9257f00c3b2928bda86aa1f186f3a86cdf871\n"
    },
    {
      "commit": "a77584143646268fab13c7c2896e96eda775f39a",
      "tree": "bbb018aab41c0e55b4169b1cd1117661dee5d1bf",
      "parents": [
        "fb28deb41fdf7e79218d1dbd589333533e8369ed"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Aug 04 15:29:15 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Aug 04 15:29:34 2026 -0700"
      },
      "message": "Add event queue structures for one-loop refactor.\n\nThis change implements both fiber-safe and thread-safe implementations of the EventQueue for NodeOS and gBMC environments.\n\n- Implement event.h skeleton structure.\n- Implement event_queue.h interface.\n- Implement event_queue_fiber.cc using google3 fiber primitives.\n- Implement event_queue_thread.cc under bmc/ using standard C++ synchronization.\n- Implement unit tests for both implementations, placing the thread-based test under bmc/.\n- Configure BUILD and meson.build to include event queue targets and tests.\n- Update copy.bara.sky to export thread-safe event queue files to gBMC.\n\nPiperOrigin-RevId: 959263007\nChange-Id: I4342334c5846376b2a3ade6910d194e95f49dcf9\n"
    },
    {
      "commit": "fb28deb41fdf7e79218d1dbd589333533e8369ed",
      "tree": "cc5d21f55b1e7351759fb24aa7d2dcfe4ba317f2",
      "parents": [
        "52d47f1f15685979a7c9f562495b26640bf9d74b"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sat Aug 01 14:15:22 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Aug 01 14:15:39 2026 -0700"
      },
      "message": "Fix 2 ClangTidyLegacy findings:\n* inclusion of forwarding header \u0027base/init_google.h\u0027; use \u0027third_party/gloop/base/init_google.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers\n* inclusion of forwarding header \u0027util/task/status_macros.h\u0027; use \u0027third_party/gloop/util/status/status_macros.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyLegacy if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-legacy-forwarding-headers\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 957711351\nChange-Id: Ic134ed7f999d95db57e7cf1616e8b2ff8f12242e\n"
    },
    {
      "commit": "52d47f1f15685979a7c9f562495b26640bf9d74b",
      "tree": "91f473468976ff8e9396ed2b675cba7d16ed7671",
      "parents": [
        "c13559f51a13d37e2c7c9b76ebc22410c156ed02"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sat Aug 01 00:06:07 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Aug 01 00:06:26 2026 -0700"
      },
      "message": "Fix 10 ClangTidyLegacy findings:\n* inclusion of forwarding header \u0027util/task/status_macros.h\u0027; use \u0027third_party/gloop/util/status/status_macros.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers (4 times)\n* inclusion of forwarding header \u0027thread/fiber/channel.h\u0027; use \u0027third_party/gloop/thread/fiber/channel.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers (2 times)\n* inclusion of forwarding header \u0027thread/fiber/fiber.h\u0027; use \u0027third_party/gloop/thread/fiber/fiber.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers (2 times)\n* inclusion of forwarding header \u0027thread/fiber/select.h\u0027; use \u0027third_party/gloop/thread/fiber/select.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers\n* inclusion of forwarding header \u0027base/context.h\u0027; use \u0027third_party/gloop/base/context.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyLegacy if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-legacy-forwarding-headers\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 957522523\nChange-Id: I1281dbfb53a09d2ae19ec0eef875a3d68fbb4883\n"
    },
    {
      "commit": "c13559f51a13d37e2c7c9b76ebc22410c156ed02",
      "tree": "fd608440d235179285d465b89aba82ec2eaa772e",
      "parents": [
        "41ddf56031b59cbbfe10f4442aae86e50dd27400"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Jul 30 03:27:16 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jul 30 03:27:38 2026 -0700"
      },
      "message": "Fix 3 ClangTidyLegacy findings:\n* inclusion of forwarding header \u0027util/task/status_macros.h\u0027; use \u0027third_party/gloop/util/status/status_macros.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers (3 times)\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyLegacy if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-legacy-forwarding-headers\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 956412512\nChange-Id: I5cbdf8d4ccb4d851ec724c1391ad1441642a8ed9\n"
    },
    {
      "commit": "41ddf56031b59cbbfe10f4442aae86e50dd27400",
      "tree": "7d1f817ef39d6ee7d9cd92e1e32c45604f2fbd4e",
      "parents": [
        "3845019b49a8e7d612fdb3df23907c805ebb92c3"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Mon Jul 27 16:33:44 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Jul 27 16:34:06 2026 -0700"
      },
      "message": "#gpowerd - Clean up ConvertStatus.\n\nRemove `std::move` on `grpc::Status::error_message()` within `safepower_agent::ConvertStatus`.\n\nThis fixes a -wpessimizing-move warning.\n\nPiperOrigin-RevId: 954895438\nChange-Id: Ifda758ffe68af7a8fee6bfa589f30be7865a7155\n"
    },
    {
      "commit": "3845019b49a8e7d612fdb3df23907c805ebb92c3",
      "tree": "f572df7b44e3ddce96039e845891204e8b3535a5",
      "parents": [
        "6121efa94a32cf33ba99c2a968beca6643ecf3e3"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Fri Jul 24 09:29:46 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jul 24 09:31:58 2026 -0700"
      },
      "message": "Update status_macros.h path in safepower_agent Copybara config.\n\nUpdates the source path for status_macros.h from util/task/status_macros.h to third_party/gloop/util/status/status_macros.h in the Copybara replacement rules.\n\nPiperOrigin-RevId: 953406719\nChange-Id: I41cab099b23f3c99ba626e8bf0391d0175463317\n"
    },
    {
      "commit": "6121efa94a32cf33ba99c2a968beca6643ecf3e3",
      "tree": "5f5bc3897eb372dcf333fe9102b39d1e72204592",
      "parents": [
        "d89006afaf6cf00b5acc1cfb1913f9e0cb8474c6"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Fri Jul 24 03:22:32 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jul 24 03:22:52 2026 -0700"
      },
      "message": "Fix 1 ClangTidyLegacy findings:\n\nDetails for what is fixed can be found at the top of each file.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyLegacy if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-legacy-forwarding-headers\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 953268728\nChange-Id: Icf94e26858bf3fc0ae85d034ceb7d778d24822e6\n"
    },
    {
      "commit": "d89006afaf6cf00b5acc1cfb1913f9e0cb8474c6",
      "tree": "03e736a9c16303bac7ccac879a13f2238ca55184",
      "parents": [
        "f5742479f882a1a3272852fe2d056c960de5d783"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Fri Jul 24 03:19:28 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jul 24 03:19:47 2026 -0700"
      },
      "message": "Fix 2 ClangTidyLegacy findings:\n* inclusion of forwarding header \u0027util/task/status_macros.h\u0027; use \u0027third_party/gloop/util/status/status_macros.h\u0027 instead. For more info, see go/clang_tidy/checks/google3-legacy-forwarding-headers (2 times)\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyLegacy if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-legacy-forwarding-headers\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 953267702\nChange-Id: I10192e4ae92df6b509836bb451f0a790697351cd\n"
    },
    {
      "commit": "f5742479f882a1a3272852fe2d056c960de5d783",
      "tree": "d8c9de7ee78aa6ddf69fb5914ba986b9b816e10a",
      "parents": [
        "21f8ab231d0f6993c1ff0d3415cb71e247c2a9c1"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Jul 22 16:26:23 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jul 22 16:26:43 2026 -0700"
      },
      "message": "Fix silent localhost fallback on IP parse failure in HttpConnection.\n\nEnsure that if boost::asio::ip::make_address fails to parse the IP, we abort the connection immediately and return InvalidArgumentError via the callback, preventing silent fallbacks to loopback (0.0.0.0).\n\nPiperOrigin-RevId: 952395310\nChange-Id: I345228b83c0e08d8fcda222de91eeef6f5eb20e8\n"
    },
    {
      "commit": "21f8ab231d0f6993c1ff0d3415cb71e247c2a9c1",
      "tree": "53b725df58a914f730d6a00247cd33e3b58ae5bd",
      "parents": [
        "99093e831cac4b4d3d714c65657ac284f13409d9"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Jul 22 16:18:30 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jul 22 16:18:54 2026 -0700"
      },
      "message": "Fix mTLS verification out-of-bounds memory read.\n\nIn auth_loas3.h, peer verification parses the verified root cert subject. However, request-\u003everified_root_cert_subject().data() returns a pointer to a grpc::string_ref, which might not be null-terminated. This can lead to an out-of-bounds read when security::ValidatePeer expects a null-terminated string or a string_view but instead gets a pointer which is treated as a null-terminated C-style string.\nWe fix this by explicitly constructing an absl::string_view from the data pointer and size of request-\u003everified_root_cert_subject().\n\nPiperOrigin-RevId: 952391808\nChange-Id: I96a2d82d93c6fa42cbabcb14b5ec548c82407862\n"
    },
    {
      "commit": "99093e831cac4b4d3d714c65657ac284f13409d9",
      "tree": "d31e1fc3d908710f4e97d4bf0bdb56458643468e",
      "parents": [
        "5680efbb9520b39d9fe2a14c802f8ba921905c9b"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Jun 25 10:34:13 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jun 25 10:34:32 2026 -0700"
      },
      "message": "Update TlsServerCredentialsOptions creation in safepower_agent.\n\nUse the new TlsServerCredentialsOptions::Create factory method and explicitly set the root certificate provider. The watch_* calls are no longer needed with the updated API.\n\nPiperOrigin-RevId: 938065631\nChange-Id: I657b0b2d668499d8b993e51cd7c9f535664f5394\n"
    },
    {
      "commit": "5680efbb9520b39d9fe2a14c802f8ba921905c9b",
      "tree": "4c8db55a6d4bd24596aa1e832ebadd37530fc2dc",
      "parents": [
        "e0578fcbe3b3c066fde0f05bbdd6140a5cd420af"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sun Jun 21 02:16:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Jun 21 02:16:44 2026 -0700"
      },
      "message": "Included header \u003coptional\u003e is not used directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL. If need approval immediately, ask in go/global-rollbacks-chat.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #UnusedInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 935559813\nChange-Id: Icefd16a538172b2e7689f72645e4d06d14f0aef6\n"
    },
    {
      "commit": "e0578fcbe3b3c066fde0f05bbdd6140a5cd420af",
      "tree": "891651941e02481c3cd8bfbed94f968517b9677a",
      "parents": [
        "1bd457820703149c310244ebe6738cacbf5546fb"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sun Jun 21 01:11:16 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Jun 21 01:11:33 2026 -0700"
      },
      "message": "Fix 4 IncludeCleaner findings:\n* Included header \"third_party/absl/functional/bind_front.h\" is not used directly\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/system_state.proto.h\" is not included directly\n* Used header \"third_party/absl/log/log.h\" is not included directly\n* Used header \"third_party/absl/status/status.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL. If need approval immediately, ask in go/global-rollbacks-chat.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #UnusedInclude #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 935541371\nChange-Id: Ia408f41f0a05ba55ec3d4083635e38286ce86b01\n"
    },
    {
      "commit": "1bd457820703149c310244ebe6738cacbf5546fb",
      "tree": "3e7240e4a8031cd14d223f7f167964ed106f55d1",
      "parents": [
        "e8b005293f57d3e9ad132ff31ed62769c491f50e"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Fri Jun 19 22:55:19 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jun 19 22:55:38 2026 -0700"
      },
      "message": "Fix 1 IncludeCleaner finding:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/action.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL. If need approval immediately, ask in go/global-rollbacks-chat.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 935176648\nChange-Id: I77f1b240d4e494846fbb5f5bb576820e922b33fe\n"
    },
    {
      "commit": "e8b005293f57d3e9ad132ff31ed62769c491f50e",
      "tree": "e81f9e429052087439c3f72bc179401381c96edb",
      "parents": [
        "a12e096856f6ccaf186df887506e8a9b3d380767"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Jun 18 03:25:48 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jun 18 03:26:08 2026 -0700"
      },
      "message": "Fix 12 IncludeCleaner findings:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/system_state.proto.h\" is not included directly (9 times)\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/action.proto.h\" is not included directly (3 times)\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL. If need approval immediately, ask in go/global-rollbacks-chat.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 934244186\nChange-Id: Iae87a739dd07e9357a2e59628aaf5c3b92257dae\n"
    },
    {
      "commit": "a12e096856f6ccaf186df887506e8a9b3d380767",
      "tree": "6db588f283a7387a41efc029f91ab34a363c2c08",
      "parents": [
        "3be094e3db8d1020caaec04999d8e682d78761d8"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Jun 18 01:58:43 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jun 18 01:59:05 2026 -0700"
      },
      "message": "Fix 5 IncludeCleaner findings:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/action.proto.h\" is not included directly (3 times)\n* Used header \"production/borg_mgmt/node_proxy/safepower/utils.proto.h\" is not included directly\n* Used header \"third_party/protobuf/repeated_ptr_field.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL. If need approval immediately, ask in go/global-rollbacks-chat.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 934207748\nChange-Id: I5a2dc2d43a480282165567109fc07e1920d20497\n"
    },
    {
      "commit": "3be094e3db8d1020caaec04999d8e682d78761d8",
      "tree": "12c0906116eab3d360690bedb15983815e3a32f4",
      "parents": [
        "a593bce052e62f08b18c42863862c502037d1871"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Jun 18 01:04:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jun 18 01:04:26 2026 -0700"
      },
      "message": "Fix 7 IncludeCleaner findings:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/action.proto.h\" is not included directly (4 times)\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/system_state.proto.h\" is not included directly (2 times)\n* Used header \"production/borg_mgmt/node_proxy/safepower/utils.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL. If need approval immediately, ask in go/global-rollbacks-chat.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 934183958\nChange-Id: I7454118e7b88d5178503eb37326b33262a26214a\n"
    },
    {
      "commit": "a593bce052e62f08b18c42863862c502037d1871",
      "tree": "0b6e23ecc9639d96f55ac445b8bdaa6f102bc57c",
      "parents": [
        "50ee4668af9ec07e575c87ead15a1c217b6d1531"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Jun 17 13:46:34 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jun 17 13:46:57 2026 -0700"
      },
      "message": "Refactor SystemdTargetMonitor to use PollingScheduler\n\nMove the polling logic from SystemdTargetMonitor into a new SystemdTargetMonitorState class that inherits from PollingState.\nRefactor SystemdTargetMonitor to be a wrapper that owns the state class and manages the polling via PollingScheduler.\nUpdate safepower_agent_common.cc to hold SystemdTargetMonitor in a std::optional instead of a std::unique_ptr.\n\nPiperOrigin-RevId: 933902228\nChange-Id: I3c20064ac52f64b9dda1ff6583889ecdc649634f\n"
    },
    {
      "commit": "50ee4668af9ec07e575c87ead15a1c217b6d1531",
      "tree": "a43415eca0bd5b669fa9c2fd65209cb75d7d497c",
      "parents": [
        "448c980f5095472ceba4460d85baf9822f5bc7c3"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Jun 17 12:05:47 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jun 17 12:06:07 2026 -0700"
      },
      "message": "Add PollingScheduler and PollingState classes.\n\nPollingState is an abstract base class for components that need to perform periodic checks.\n\nPollingScheduler manages the execution of a PollingState instance, scheduling its Check() method at a given interval. It integrates with StateUpdater to pause polling when the system is idle and resume when active.\n\nPiperOrigin-RevId: 933852614\nChange-Id: I3a560fee20e8a9191be603a7dac6baf4d282b2d6\n"
    },
    {
      "commit": "448c980f5095472ceba4460d85baf9822f5bc7c3",
      "tree": "bb38278825a31cffbeb7aa2a5273d8d0d22da82e",
      "parents": [
        "5ba6bf65c9dc68eaf6ad3c75e2486edafb06d5fa"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Jun 17 10:47:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jun 17 10:48:10 2026 -0700"
      },
      "message": "Unify scheduler implementations using TaskSession to resolve UAF and data races.\n\nBring SchedulerBMC and SchedulerAgent closer together by transitioning both to use a std::shared_ptr\u003cTaskSession\u003e model. This resolves:\n- Data races on thread execution tracking (current_task_).\n- Use-After-Free (UAF) bugs caused by orphaned/rescheduled timers leaking past destructor.\n- Unsynchronized writes to session cancellation flags.\n- Task rescheduling after cancellation.\n\nPiperOrigin-RevId: 933810684\nChange-Id: I527b61b162fb8f418393f171ae6d3ce939c51d29\n"
    },
    {
      "commit": "5ba6bf65c9dc68eaf6ad3c75e2486edafb06d5fa",
      "tree": "e98b7f0c51f94d9dc9cdc929f2f7bfc0b50a1f14",
      "parents": [
        "9ca1b2906bcda1efb55a7ea1879cbd1f427efebb"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Jun 16 14:27:22 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jun 16 14:27:43 2026 -0700"
      },
      "message": "Fix Heap Use-After-Free in StaticStateLoader async callbacks.\n\nResolve a Use-After-Free (UAF) vulnerability in StaticStateLoader where a raw `this` pointer was captured in an asynchronous callback. If the loader is destroyed before the callback completes, it results in a UAF crash.\n\n* Refactor StaticStateLoader to use a static `Create()` factory pattern to enforce `shared_ptr` ownership and prevent calling `weak_from_this()` in the constructor.\n* Capture a `weak_ptr` in the async callback, checking/locking it before accessing the object.\n\nPiperOrigin-RevId: 933301024\nChange-Id: I7bf65ed77cac54e9ce4a6bd08aacbd88163b0669\n"
    },
    {
      "commit": "9ca1b2906bcda1efb55a7ea1879cbd1f427efebb",
      "tree": "064345562ee0e7eeb36f8c700b708f9cf70ad43d",
      "parents": [
        "9eca99a63bf8ac545e66cc9055b648bb7d6f9233"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Jun 16 10:39:03 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jun 16 10:39:21 2026 -0700"
      },
      "message": "Redesign CallbackManager cancellation and execute callbacks outside lock\n\nExecute callbacks outside of `HandleImpl::mutex` to prevent lock inversion deadlocks with external components\n\nAdd `CancelAndWait()` and `Wait()` methods provide explicit synchronization on callback completion.\n\nAdditionally, update `PollingStateMonitor` and `StateChangeWriteReactor` destructors\nto use `CancelAndWait()`. This ensures any actively executing background callbacks fully complete before the owning objects are destroyed, preventing Use-After-Free vulnerabilities during daemon teardown or state transitions.\n\nPiperOrigin-RevId: 933172921\nChange-Id: If3a6c3df788736e6dc0f881ed9fcfe4137514edf\n"
    },
    {
      "commit": "9eca99a63bf8ac545e66cc9055b648bb7d6f9233",
      "tree": "71912eb33960c58eb2e4598115c517b58fa1f649",
      "parents": [
        "b5701a8f2a7a3455b03a7d9082d4954f86e8b334"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Mon Jun 15 13:35:55 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Jun 15 13:36:14 2026 -0700"
      },
      "message": "Fix test pollution in `state_monitor_bmc_test`\n\n- Add `GetUniqueTempDir()` helper to `bmc/test_util.h` to allow tests to write to isolated directories.\n- Update `state_monitor_bmc_test` to use `GetUniqueTempDir()` for persistent storage directories.\n- Decouple `InternalBootnumIncreasesWhenHashChanges` from `InternalBootnumIsReported`.\n\nPiperOrigin-RevId: 932640204\nChange-Id: I7aa01840244cb177e75f96f9b3e14a4aec747293\n"
    },
    {
      "commit": "b5701a8f2a7a3455b03a7d9082d4954f86e8b334",
      "tree": "fe20223e2dcb952987603c9b1886711887e873da",
      "parents": [
        "fe3b0be59576ce846130b90431cdd1615b17616d"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Fri Jun 12 05:53:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jun 12 05:54:30 2026 -0700"
      },
      "message": "Fix 1 IncludeCleaner finding:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/system_state.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 931106797\nChange-Id: I5dcc2d0d4fdb28e5e3d09487e8a93e1456f33a72\n"
    },
    {
      "commit": "fe3b0be59576ce846130b90431cdd1615b17616d",
      "tree": "18996221e462493dc91915bc3526a86572e885ae",
      "parents": [
        "16d8ba9b731ab1486780e881211f2b8e0f35bba1"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Mon Jun 08 09:39:56 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Jun 08 09:40:13 2026 -0700"
      },
      "message": "Reimplement CallbackManager to use shared_ptr/weak_ptr for handle\n\nAll functionality is identical, but the following race condition picked up\nby msan has been fixed:\n\nPreviously, there was a race condition that led to a use-after free.\nA handle owner called `TryCancel` in it\u0027s destructor after the callback\nhad been copied out but before it got executed in `RunCallbacks`. The\ndestructor finished, and then the callback executed and referenced\nthe destructed object.\n\nPiperOrigin-RevId: 928612448\nChange-Id: Ibf5353464590ef07c64162dac736b2cf51d3c379\n"
    },
    {
      "commit": "16d8ba9b731ab1486780e881211f2b8e0f35bba1",
      "tree": "6724a5235149eac72a2a6b20b0c684a28d833b87",
      "parents": [
        "a66f0471254feb725fac981dd33ff5a03c86e68b"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Fri Jun 05 19:45:22 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Jun 05 19:45:48 2026 -0700"
      },
      "message": "Fix 2 ClangInliner findings:\n* The use of this symbol has been deprecated and marked for inlining. The function being deprecated is absl::MutexLock::MutexLock. (2 times)\n\nSee go/inliner-lsc for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/inliner-bug for category ClangInliner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #third_party-absl-synchronization-mutex.h\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 927592598\nChange-Id: I6acd38f6d595f4031115f44a08472739ce5e02cb\n"
    },
    {
      "commit": "a66f0471254feb725fac981dd33ff5a03c86e68b",
      "tree": "3f92346d13076656b32dd6c02ae96f81e18e401f",
      "parents": [
        "3a59d9b9eb8aff087ce1062a6ffde17c9010adca"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Thu Jun 04 11:07:07 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Jun 04 11:07:28 2026 -0700"
      },
      "message": "#gpowerd - Version reporting: Yocto/Copybara build time automation\n\nImplement build-time version and Piper CL injection for gpowerd.\nInstead of manual bump tools, Copybara dynamically writes the Piper CL\nto `piper_cl.txt` during export, and Meson reads it using `fs` at build time.\n\nThis requires https://gbmc-review.git.corp.google.com/c/meta-gbmc-staging/+/89858 to report the version correctly.\n\nTested:\nhttps://fusion2.corp.google.com/85636490-2e49-3659-b6e2-74727cd7d8f5\nPiperOrigin-RevId: 926782906\nChange-Id: I6b4e6342d570972c7a3f73e8d055de712a717d72\n"
    },
    {
      "commit": "3a59d9b9eb8aff087ce1062a6ffde17c9010adca",
      "tree": "47ec8531b875c735e9b09948a5666c9c118671e3",
      "parents": [
        "e4b7e5ddffbf5dcc1c0c588169dbdeae21c25a20"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Wed Jun 03 05:01:57 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Jun 03 05:02:18 2026 -0700"
      },
      "message": "Fix 4 IncludeCleaner findings:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/system_state.proto.h\" is not included directly (3 times)\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/action.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 925947960\nChange-Id: Ic4f6dc026c32b7cb7f9ce89106cb2a06719546e2\n"
    },
    {
      "commit": "e4b7e5ddffbf5dcc1c0c588169dbdeae21c25a20",
      "tree": "17c45e1c5ca732b3dc1a492d3963b7b8596a39c3",
      "parents": [
        "9dbc1640bb4182532902b41cd5f42680484ab171"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Tue Jun 02 13:22:06 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jun 02 13:22:26 2026 -0700"
      },
      "message": "#gpowerd - Version reporting: Implement GetFeatures RPC\n\nImplement the C++ handlers for the GetFeatures RPC (both gRPC and scaffolding).\nThe RPC retrieves and returns the supported actions, build CL/version, and the actual typed agent config.\nMap the new RPC in the central security policy bundle and add unit tests in safepower_agent_test, safepower_scaffolding_service_test, and safepower_agent_service_test.\n\nPiperOrigin-RevId: 925542857\nChange-Id: I1e16ff66d153c5a0c984e5f3c16b4e10493612a7\n"
    },
    {
      "commit": "9dbc1640bb4182532902b41cd5f42680484ab171",
      "tree": "c42a1399f9d8877c234432217ba9e634c74fb63a",
      "parents": [
        "a69288dd3cb29c01eb6bddb7fd9ddb1148161ef7"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Tue Jun 02 05:12:52 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Jun 02 05:13:58 2026 -0700"
      },
      "message": "Add missing include for absl/flags/parse.h.\nThe `absl/flags/parse.h` header is needed for flag parsing in the gpowerd binary.\n\nPiperOrigin-RevId: 925287058\nChange-Id: Ibf4c30da7ee47650e926104017dad1c8d4a196d1\n"
    },
    {
      "commit": "a69288dd3cb29c01eb6bddb7fd9ddb1148161ef7",
      "tree": "dfb356d2dec8cc3d01b333a845522fdaed97e8d1",
      "parents": [
        "1beeb2eb2ad27353949391f44b66f961c25d775d"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sat May 30 08:49:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat May 30 08:49:27 2026 -0700"
      },
      "message": "Fix 2 IncludeCleaner findings:\n* Included header \"third_party/absl/flags/parse.h\" is not used directly\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/safepower_agent.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude #UnusedInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 923940958\nChange-Id: I30905ed8b6fe6d430afe02023e8b062a84cc309b\n"
    },
    {
      "commit": "1beeb2eb2ad27353949391f44b66f961c25d775d",
      "tree": "6f0cbf80ad7fee311ac606efcf65dd2613933cf2",
      "parents": [
        "caf51f51ecaeebdb4c70c94c0229d7d34420a46c"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Thu May 28 16:49:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 28 16:49:49 2026 -0700"
      },
      "message": "#gpowerd - Version reporting: Proto definition\n\ngo/gpowerd-version-reporting\n\nDefine the BuildInfo message in system_state.proto and add the GetFeatures RPC to SafepowerLocalAgent in safepower_agent.proto.\nAdd build_info field to SafePowerAgentConfig.\nThis exposes features and version reporting for the Safepower agent.\n\nPiperOrigin-RevId: 923048480\nChange-Id: I17b4bc21b744df6ece50bf45ceb1dbabd105cf22\n"
    },
    {
      "commit": "caf51f51ecaeebdb4c70c94c0229d7d34420a46c",
      "tree": "dec3ab66ddc8fab998ae688b7a373f1cd2097124",
      "parents": [
        "bf2eb355879cae2ef26a7f4f493465fa826fc913"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Thu May 28 12:52:54 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 28 12:53:16 2026 -0700"
      },
      "message": "#gpowerd - Split safepower_agent proto to resolve circular dependency\n\nSplit the monolithic safepower_agent.proto into:\n- system_state.proto (leaf)\n- action.proto (depends on system_state.proto)\n- safepower_agent.proto (depends on action.proto and system_state.proto)\n\nThis prevents circular dependencies between safepower_agent.proto and safepower_agent_config.proto.\n\nPiperOrigin-RevId: 922925421\nChange-Id: I4c32db1ceb3e9c75cba0c9a8a9c2706c2ac0d7e3\n"
    },
    {
      "commit": "bf2eb355879cae2ef26a7f4f493465fa826fc913",
      "tree": "fb4c210c957062e73f43c192e7815db5f5fae078",
      "parents": [
        "270bb22b7c0a9aede7b74a4744902d96a4885f04"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Thu May 28 11:01:19 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 28 11:01:41 2026 -0700"
      },
      "message": "#gpowerd Clean up `AddListener` variables\n\nPiperOrigin-RevId: 922867344\nChange-Id: I2b47b19683df202546b5eaac415e353013ac0e56\n"
    },
    {
      "commit": "270bb22b7c0a9aede7b74a4744902d96a4885f04",
      "tree": "3b2f4f15d5eb31f139ee1b4868696570e9cebcff",
      "parents": [
        "06d18d8e1c52e9895b0b29999491ddc2c7f379b0"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Wed May 27 06:49:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed May 27 06:49:56 2026 -0700"
      },
      "message": "Used header \u003cutility\u003e is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 922100701\nChange-Id: I31dda44a9c03a3892ee798c44ca77849c7a31742\n"
    },
    {
      "commit": "06d18d8e1c52e9895b0b29999491ddc2c7f379b0",
      "tree": "6e3098e8de78d01290bdb6d31e329f2709730421",
      "parents": [
        "634fd5f9c2426b55dd5d4107c5d987387c8db243"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Fri May 22 14:58:02 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri May 22 14:58:25 2026 -0700"
      },
      "message": "Reorder state persistence in FinishAction.\n\nThis fixes a race condition bug that happens during the action state change process; what was happening, in order:\n1. we notify all listeners of the state change.\n2. we persist the change\n\nAfter notifying the listeners, but before the change is persisted, we start another action. The intent is, when our limit for the number of actions persisted is reached, is to evict the oldest completed actions first, then the oldest pending actions. However, because of this race, we started an action before the change was persisted, so we evicted the second oldest, not the oldest action.\n\nThe solution in this change is to persist the change before updating the state and notifying the listeners. And in the case where the action-context is completing, persist the state also before the action is re-enabled\n\nPiperOrigin-RevId: 919874464\nChange-Id: I2392e1e19cbacb859678a44672fa8b8cfca71334\n"
    },
    {
      "commit": "634fd5f9c2426b55dd5d4107c5d987387c8db243",
      "tree": "2e1cfd604df2dffbc2e03457d940d3ffb9e49177",
      "parents": [
        "dece052e2a22f67828f0b5548c3c6f839b56dd43"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Fri May 22 13:42:22 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri May 22 13:42:46 2026 -0700"
      },
      "message": "Add listener to state updater atomically\n\n* We start Inserting a listener\n* We add the listener to the state updater, which triggers callbacks\n* The callbacks note that we\u0027re done, so they tell the listener to call Done\n* But the listener can\u0027t find the state updater (hasn\u0027t been added yet)\n\nPiperOrigin-RevId: 919839795\nChange-Id: Id12f90fbc37c72e829070dd92a47a9db9f4ce227\n"
    },
    {
      "commit": "dece052e2a22f67828f0b5548c3c6f839b56dd43",
      "tree": "f595c1f20f0dadf96f378de19a024c496bd99deb",
      "parents": [
        "94963e5f9556b128312066236ce9918fdaa1b39a"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Fri May 22 11:43:41 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri May 22 11:44:01 2026 -0700"
      },
      "message": "Change locking order in AddListener.\n\nThis fixes a time-of-check to time-of-use bug:\n1) Monitor listener thinks it is not final\n2) State gets updated to final, all listeners except the monitor listener that is not yet added are notified\n3) Monitor listener never realizes that a final update happened\n\nPiperOrigin-RevId: 919782727\nChange-Id: I1ce1347e9b7795569a05a0f0de113220efea0ecd\n"
    },
    {
      "commit": "94963e5f9556b128312066236ce9918fdaa1b39a",
      "tree": "cb11b6f9366711cda13752a8e2591bb535d7a83a",
      "parents": [
        "418f5a1aef197efd7de2ee111bec73457571ab07"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Thu May 21 12:23:21 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 21 12:23:43 2026 -0700"
      },
      "message": "#gpowerd - Propagate active state to local state updater in ActionContextManager\n\nThis CL fixes a bug where gnic_monitor (or other polling monitors in safepower_agent) stop polling when a gracepower cycle action starts, causing the power cycle to hang.\n\n- Cause: ActionContext registers its preconditions on the global state updater. But ActionContextManager\u0027s Forwarder (which forwards updates from local updater to global updater) is registered as a passive listener. Thus, when global updater becomes active due to the action precondition listener, this active status is never propagated to the local updater, causing GnicMonitor to think there are no active listeners and pause.\n- Fix: Implement active state propagation in ActionContextManager by dynamically managing a DummyActiveListener on the local state updater when the global state updater becomes active, and removing it when the global updater becomes idle.\n- Added state machine to ActionContextManager to handle multiple active/idle transitions correctly since state updater callbacks are one-shot.\n- Explicitly stop listening to precondition and validation conditions in ActionContext once they are satisfied or failed to avoid listener leaks.\n- Added unit test ActivePreconditionKeepsLocalStateUpdaterActive in action_context_test.cc to verify this behavior.\n\nPiperOrigin-RevId: 919191825\nChange-Id: Idcecebedddf7869488f914f0bb1b692ee15e629d\n"
    },
    {
      "commit": "418f5a1aef197efd7de2ee111bec73457571ab07",
      "tree": "86e7cd9d034a228a740f68a9109df6a6b6882a35",
      "parents": [
        "904d766f84db9f3bb7ae1074bbc497c12cc2029a"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue May 19 12:04:30 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue May 19 12:04:52 2026 -0700"
      },
      "message": "Safepower agent to follow totw/181\n\nPiperOrigin-RevId: 917955097\nChange-Id: Ie1e8c374eb0c132341868afd4b65bedcf0aa79e9\n"
    },
    {
      "commit": "904d766f84db9f3bb7ae1074bbc497c12cc2029a",
      "tree": "f9e609cc442f98614fd484d55f60fd7915e8251d",
      "parents": [
        "b477808042c285cc39e1d18ded9934d7c3230a3c"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sun May 17 11:45:05 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun May 17 11:45:22 2026 -0700"
      },
      "message": "Fix 2 IncludeCleaner findings:\n* Included header \"third_party/absl/functional/bind_front.h\" is not used directly (2 times)\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #UnusedInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 916858551\nChange-Id: I1056c256e5ef85c7e0ec25e4d8b65959809c2353\n"
    },
    {
      "commit": "b477808042c285cc39e1d18ded9934d7c3230a3c",
      "tree": "463c991607028f089b5de9bf6fb80a5202e9f12e",
      "parents": [
        "93be6a24fc009b747500af54a6411e42ceb1a94a"
      ],
      "author": {
        "name": "Sruthi Ganti",
        "email": "sruthiganti@google.com",
        "time": "Wed May 13 10:19:37 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed May 13 10:20:01 2026 -0700"
      },
      "message": "Add workflow_id field to FlightRecordRequest proto\n\nAdded a new field workflow_id to FlightRecordRequest in utils.proto.\nThis field is used by the client for their workflow and passed to Safepower for logging purposes.\n\nPiperOrigin-RevId: 914931901\nChange-Id: I888dd5987fc4804bf35645300cb45ad1fdcd3058\n"
    },
    {
      "commit": "93be6a24fc009b747500af54a6411e42ceb1a94a",
      "tree": "604cef74f433e20f38cae35996d814c748adb1a1",
      "parents": [
        "1818e44cad50d5e3bd951ac6745cdbb3439c7f72"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue May 12 11:54:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue May 12 11:55:11 2026 -0700"
      },
      "message": "Prevent race when async processing results with remote state monitor\n\nBefore this change, the child classes of remote state monitor, ping state monitors in particular, could process states out of order. In the ping state monitor case, the remote state monitor will call `Check` at regular intervals. Then, the ping state monitor launches a `boost::async_system` to call `ping`, and then the result of that gets processed in `ProcessPingResult` which calls `UpdateReachableState`.\n\nThe race: We could have two results (e.g. can ping, cannot ping) in flight at the same time, and then we process them out of order, then broadcasting the states out of order.\n\nWith this change: If a check is in flight, no other check will be launched. Instead, ping states monitor will just rely on the next call `Check`.\n\nAn alternative design would be to have the remote state ping monitor only launch a check after the last `UpdateReachableState` is called. I attempted to implement this solution, but noticed a race condition in the pausing logic and decided not to pursue it further.\n\nTested:\n  ran `remote_state_ping_test` 1k times ([link](http://sponge2/b61554b0-6f7b-4792-a796-425f40f2bd46)) as well as `state_monitor_bmc_test` ([link](http://sponge2/2a177bf9-bf7f-4eca-a401-ef7eda53110f)).\nPiperOrigin-RevId: 914403148\nChange-Id: I597027cd0b0692b3c4ffe1acae1014d60203da50\n"
    },
    {
      "commit": "1818e44cad50d5e3bd951ac6745cdbb3439c7f72",
      "tree": "b9288d7212d06c4fc9cdc56cbeb5618e59cccfe9",
      "parents": [
        "c7e7dd3cf5c8b9f5065110cef3bdb5a843c18fe6"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Fri May 08 11:48:40 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri May 08 11:48:58 2026 -0700"
      },
      "message": "#gpowerd - Add safe to shutdown valid bit\n\nAdd a new field `safe_to_shutdown_valid` in the `BootState` proto and extract it from telemetry.\nTo support system states where the `safe_to_shutdown` bit is set to 0, but the daemon that sets it to 1 is missing, we export this extra bit that tells us if this bit is valid.\n\nTested:\n- Built and installed gBMC image with this change\n- Installed gsys that reports the valid bit\n- Verified valid is false without imc_safetoshutdown package\n- Verified valid changes to true when the package is installed\n- Verified that changes to false with old gsys\nPiperOrigin-RevId: 912622795\nChange-Id: If5c2ae701c4bf481de40a1b13a76504ca871e6ba\n"
    },
    {
      "commit": "c7e7dd3cf5c8b9f5065110cef3bdb5a843c18fe6",
      "tree": "c4dc8bd3fc0973d8b3f6f22644abfc7c85903517",
      "parents": [
        "5149130c1898e00ae9460615900301e4516135c5"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu May 07 06:14:21 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu May 07 06:14:42 2026 -0700"
      },
      "message": "Fix 1 IncludeCleaner finding:\n* Used header \"third_party/absl/base/thread_annotations.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 911924804\nChange-Id: Ie5a6dfea4387b0afb653bdbf53546e610a4e68ac\n"
    },
    {
      "commit": "5149130c1898e00ae9460615900301e4516135c5",
      "tree": "f2525f9da1402f7821e51325cf783e4382adad42",
      "parents": [
        "48a6382070f3fdfebc73e484cd5eb8ce17ab0f6a"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Wed May 06 11:47:59 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed May 06 11:48:18 2026 -0700"
      },
      "message": "#gpowerd - Implement `WithState` in StateUpdater to improve thread safety.\n\nReplace most usages of StateUpdater::state() with a new template method\n`WithState(Func f)` that executes the given function `f` with the state lock held.\nThis ensures that state access is performed safely under the lock, preventing\npotential data races when returning references to the state.\n\nPiperOrigin-RevId: 911460138\nChange-Id: Id60418ac3157dc6ea1441b1d6cb22659c573c69e\n"
    },
    {
      "commit": "48a6382070f3fdfebc73e484cd5eb8ce17ab0f6a",
      "tree": "26833d60d228324bb18fbe7d44a5ab7480162c72",
      "parents": [
        "e6424c17591e4bf8ee0806b45cb6158eb1f2fb8c"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Mon May 04 11:49:49 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon May 04 11:50:05 2026 -0700"
      },
      "message": "Safepower Agent: Preserve ABORTED state across restarts\n\nThis change ensures that actions in the ACTION_STATE_ABORTED state are not interpreted as malformed persistent state, which would cause loading a new and empty persistent state.\n\nPiperOrigin-RevId: 910154977\nChange-Id: I88203c562935a360eb528d6fae5de6611c47fb33\n"
    },
    {
      "commit": "e6424c17591e4bf8ee0806b45cb6158eb1f2fb8c",
      "tree": "ca77331e42916dc9ad79b747ce9ffe7660d336d6",
      "parents": [
        "314513a25f741c2e1671d3c4f8cca9830d7f75af"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Apr 29 14:37:03 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 29 14:37:23 2026 -0700"
      },
      "message": "Improve logging for boot ID changes in safepower_agent.\n\nPiperOrigin-RevId: 907783853\nChange-Id: Ibc00b256ddcabab657af32ab4f691596fe453f31\n"
    },
    {
      "commit": "314513a25f741c2e1671d3c4f8cca9830d7f75af",
      "tree": "16df4ae6ae3a51e6d72ad4f38a4b7f54387263e2",
      "parents": [
        "ca0a4fdf2aa6b07a6bed2ec99a8345120ca66ff3"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Apr 29 11:59:10 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 29 11:59:29 2026 -0700"
      },
      "message": "Prevent use-after-free in StateUpdater listeners during destruction.\n\nThe previous fix cl/903325378 made it so that we don\u0027t crash when this occurs; this fix prevents the tsan and undefined error.\n\nIntroduces a StopListening() method in StateUpdater::Listener and moves the listener unregistration logic into it. Derived classes now call StopListening() at the beginning of their destructors. This ensures that no more UpdateState callbacks are received after the derived class\u0027s members start being destroyed, preventing potential use-after-free issues. Updates Condition, StreamAdapter, and StateChangeWriteReactor to call StopListening() in their destructors.\n\nPiperOrigin-RevId: 907707936\nChange-Id: Id0ea6926e905c2d42bec1e470259386fb8200942\n"
    },
    {
      "commit": "ca0a4fdf2aa6b07a6bed2ec99a8345120ca66ff3",
      "tree": "cb7c43531d0d226b1bd59196b24f0d729e7e5c6a",
      "parents": [
        "8e0f54252c2976fc663ac6d87e3c086f3e70bf1d"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Tue Apr 28 17:03:53 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 28 17:04:12 2026 -0700"
      },
      "message": "#gpowerd - Add SystemdTargetMonitor\n\nImplement monitor for tracking Systemd target states.\n\nWe will use this to detect when IMCs have reached `unmount.target`. It also provides general monitoring to help analyze shutdown progress and timing.\n\nPiperOrigin-RevId: 907252658\nChange-Id: I2ad2faf5083f55d9e7ebe2b3a279fa9a7043e7af\n"
    },
    {
      "commit": "8e0f54252c2976fc663ac6d87e3c086f3e70bf1d",
      "tree": "19c17a941daa3971186b997664cc48b66354d9e3",
      "parents": [
        "f5c7fa3012a4faf66aa391dd01b0a64cac924bad"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Tue Apr 28 16:09:02 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 28 16:11:14 2026 -0700"
      },
      "message": "#s4v2 - Allow sending system state updates during a disruption\n\nNode agents (including #gpowerd) will now allow stream requests while a disruption is pending (e.g. the node is about to shut down). This is needed to report q-state, and is also useful to report daemon states during shutdown for monitoring.\n\nNote that we will _still_ drop the stream when a disruption starts. This allows future retries to connect to the correct instance of the service when we are shutting down.\n\nPiperOrigin-RevId: 907229009\nChange-Id: I74ae9c44670ce47a8b622e41b156d7ce3e8af676\n"
    },
    {
      "commit": "f5c7fa3012a4faf66aa391dd01b0a64cac924bad",
      "tree": "277fdecb161ccd4bc26ef7bf3e7627049b2aafd2",
      "parents": [
        "d9d2fb7130b49981774ebc879da1e5f475ad96c7"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Tue Apr 28 16:03:54 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 28 16:04:11 2026 -0700"
      },
      "message": "#gpowerd - Throttle log spam on EEPROM read errors in GnicMonitor\n\nUse LOG_EVERY_N_SEC(ERROR, 60) to prevent logging on every polling interval if there is an EEPROM read error, reducing log spamming.\n\nPiperOrigin-RevId: 907226743\nChange-Id: I351754dd99d400bbc9506a7cc20b3603b638abda\n"
    },
    {
      "commit": "d9d2fb7130b49981774ebc879da1e5f475ad96c7",
      "tree": "0cdff7645571daa1f5d9211ddfa9ca87d50f0539",
      "parents": [
        "6c5839ddeee183790aafdd41f2c0663ab6dfa7d0"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Tue Apr 28 13:01:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 28 13:01:25 2026 -0700"
      },
      "message": "Stop #gpowerd polling when idle\n\nThe change to make the local state and global state in series made it so that we _always_ have a listener. This means monitors are never idle.\n\nIntroduce IsIdleListener() to StateUpdater so that we can specify listeners that do not prevent the updater from being considered idle.\nOverride it in ActionContextManager::Forwarder to allow gPowerD to be considered idle when there are no active actions or clients monitoring the state.\n\nPiperOrigin-RevId: 907135819\nChange-Id: Ifec12cd410905c377a726d20222f3ec7039db58e\n"
    },
    {
      "commit": "6c5839ddeee183790aafdd41f2c0663ab6dfa7d0",
      "tree": "4cdb531e89710698b0c3d22cd65d2d5b417e594b",
      "parents": [
        "20dc70333b75f4be87727afac4ad536a1e6ef7d5"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Mon Apr 27 23:41:10 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Apr 27 23:41:31 2026 -0700"
      },
      "message": "Fix 1 ClangTidyBuild finding:\n* #includes not formatted according to style guide. For more info, see go/clang_tidy/checks/google3-build-include-order\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/clang-tidy-bug for category ClangTidyBuild if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/production/borg_mgmt/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #google3-build-include-order\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 906764551\nChange-Id: I3f4468c5dd0d5ebfb6a893f97d1c0dc5e2fe6252\n"
    },
    {
      "commit": "20dc70333b75f4be87727afac4ad536a1e6ef7d5",
      "tree": "3b7c8e8c33a45d765bf53c32512cd2cd01cdc86b",
      "parents": [
        "989d03e562b3d7cd7adc8493b6a2a13b5e4f8a89"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Thu Apr 23 17:10:15 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Apr 23 17:10:37 2026 -0700"
      },
      "message": "#s4v2 - Make sure we don\u0027t write to persistent storage during shutdown\n\nWith this change we will:\n- Return an error in case of _any_ write attempt in shutdown mode\n- Not activate any loaded actions\n- Start up with a disruption pending. This also ensures that we don\u0027t allow new actions to be started.\n\nPiperOrigin-RevId: 904709710\nChange-Id: Id6975ce375c815846cd3d6ea2cbf1c51cd903370\n"
    },
    {
      "commit": "989d03e562b3d7cd7adc8493b6a2a13b5e4f8a89",
      "tree": "de97245ffc7fbf526df0ed73e89898fd359df8ef",
      "parents": [
        "7227143e74d6f0fd9089e01a13996bd63c04697a"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Wed Apr 22 21:08:29 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 22 21:09:06 2026 -0700"
      },
      "message": "#gpowerd - Add system state for systemd target monitoring\n\nAdd SystemdUnitState to NodeState to track target states.\n\nPiperOrigin-RevId: 904203691\nChange-Id: I3382375f12c957fe5a4cb04c306d292340ad6dc3\n"
    },
    {
      "commit": "7227143e74d6f0fd9089e01a13996bd63c04697a",
      "tree": "cbd220abee111533e87c4925b69140473417346b",
      "parents": [
        "62aa23a4665781476805cd9786cc97851c870a04"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Wed Apr 22 21:02:29 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 22 21:02:47 2026 -0700"
      },
      "message": "Fix 3 IncludeCleaner findings:\n* Used header \"production/borg_mgmt/node_proxy/safepower/safepower_agent/proto/safepower_agent_config.proto.h\" is not included directly (2 times)\n* Used header \"platforms/uhm/node_entities/proto/offline_node_entities.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 904201461\nChange-Id: I22de70c63b4e285cf7ca76c1594e8d03bf33289f\n"
    },
    {
      "commit": "62aa23a4665781476805cd9786cc97851c870a04",
      "tree": "0bef14862371972e3d1f44ae0e91fa1b6c8a8403",
      "parents": [
        "ff37cc4fc79751983f625453facfabff2e3d324e"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Wed Apr 22 17:42:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 22 17:42:27 2026 -0700"
      },
      "message": "#gpowerd - Move PollingStateMonitor\n\nMove PollingStateMonitor from bmc/ to parent directory to allow use by non-BMC components.\n\nPiperOrigin-RevId: 904140417\nChange-Id: Ic9513ba6fa0fb4db71ae2d9e948c36d2b1920e95\n"
    },
    {
      "commit": "ff37cc4fc79751983f625453facfabff2e3d324e",
      "tree": "927ee750562d4a5a2f4b6d61bcc6b5d8173ce295",
      "parents": [
        "84d6a9c6dc1eb58feab5a86b1ae174a7f98a7e8f"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Apr 22 09:48:15 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 22 09:48:34 2026 -0700"
      },
      "message": "Add mutex to persistent storage\n\nPiperOrigin-RevId: 903898081\nChange-Id: I1d5904265d621f4870deb00a237d9069c83a640b\n"
    },
    {
      "commit": "84d6a9c6dc1eb58feab5a86b1ae174a7f98a7e8f",
      "tree": "cc7818932cb5cc2a9f36ed86547459b41e0ed162",
      "parents": [
        "a285b044ebe68e76701167814c08300b95e9ac77"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Apr 21 11:08:00 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Apr 21 11:09:33 2026 -0700"
      },
      "message": "Gpowerd: Fix Listener child class destruction\n\nThis change prevents Gpowerd from crashing during the sequence where a listener child class object is being destructed. It was possible that after the child class\u0027s destructor is called, but before the base class\u0027s destructor runs, another thread would call a child method, causing a panic.\n\nTested:\n  (Failed before, passes after)\n  blaze test //production/borg_mgmt/node_proxy/safepower/safepower_agent:state_change_reactor_destruction_test --runs_per_test\u003d1000\nPiperOrigin-RevId: 903325378\nChange-Id: I8a8633d6003578552d6596da46d09896808e9e94\n"
    },
    {
      "commit": "a285b044ebe68e76701167814c08300b95e9ac77",
      "tree": "414cfaffe96612abadd97b5006384806b305f2fa",
      "parents": [
        "76c94db1e30533df74c9a735b8f2e80de6a646b4"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sun Apr 19 21:01:11 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Apr 19 21:01:28 2026 -0700"
      },
      "message": "Fix 16 ViewTypeMigrations findings:\n* This is a change required to migrate proto string accessors to return absl::string_view instead of const std::string\u0026.  See ​go/proto-string-view-accessors-cpp-lsc for more details. (12 times)\n* This is a change required to migrate function parameters to absl::Span from const std::vector (3 times)\n* This is a change required to migrate function parameters to absl::string_view from const std::string\u0026\n\nSee go/view-types-migrations for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just grant approval!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/string-view-params-bug for category ViewTypeMigrations if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #string-view-params #string-view-accessors #span-params\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 902389854\nChange-Id: Ic79fe78d5fad430ddcbab364a2965f44ac5e2f06\n"
    },
    {
      "commit": "76c94db1e30533df74c9a735b8f2e80de6a646b4",
      "tree": "893e2a729ff8a6ddb0d70ddfcdd761636f6ea41a",
      "parents": [
        "cfbfe269950cc78c4cf155c5b9acdb1ad9cb28ea"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Mon Apr 13 22:39:23 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Apr 13 22:39:47 2026 -0700"
      },
      "message": "#gpowerd - Report IMC boot state using the EEPROM\n\nThis change adds a dependency on gbmc HAL.\n\nIt also refactors `RemoteStateMonitor` to separate polling from reachability updates. The new `GnicMonitor` class _is_ polling, but it isn\u0027t reachability check. We may consider moving the redfish based polling to use this class as well, since it will inherit the ability to pause when unused.\n\nPiperOrigin-RevId: 899364514\nChange-Id: I2996a29b7eeaf1f4bc5c89f735091c756bd1875a\n"
    },
    {
      "commit": "cfbfe269950cc78c4cf155c5b9acdb1ad9cb28ea",
      "tree": "d09264d62b0bacddbb27ebbf07892205b2fc2b65",
      "parents": [
        "b11f9883b496870ac23db1f1974bbc7e57b00d45"
      ],
      "author": {
        "name": "Peter Foley",
        "email": "pefoley@google.com",
        "time": "Fri Apr 10 13:24:10 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Apr 10 13:24:34 2026 -0700"
      },
      "message": "Update references to production/msv/node_entities/proto\n\nAll these protos have moved to platforms/uhm/node_entities/proto.\nUpdate references to the legacy forwarding headers.\n\n#codehealth(pefoley)\n\nTested:\n    TAP --sample ran all affected tests and none failed\n    http://test/OCL:897739192:BASE:897696097:1775839706256:a3d03efa\nPiperOrigin-RevId: 897857259\nChange-Id: I94c8b205191dbc4b47bbf56799e8a6f64f88ca57\n"
    },
    {
      "commit": "b11f9883b496870ac23db1f1974bbc7e57b00d45",
      "tree": "53cc944b4d7998b4b119f71f7ae7ecdec0974cda",
      "parents": [
        "e830b6cbbd9d070e3696c9d913f2a6dd57a6aa16"
      ],
      "author": {
        "name": "Rishabh Jain",
        "email": "jainrish@google.com",
        "time": "Wed Apr 08 13:58:23 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 08 13:58:47 2026 -0700"
      },
      "message": "Introduce and handle ACTION_STATE_ABORTED in Safepower Agent.\n\nThis change adds a new `ACTION_STATE_ABORTED` to the safepower agent\u0027s action states. This state is used when precondition or validation checks fail with an aborted status, distinguishing it from general errors. The gPowerD and proxyv2 components are updated to recognize and handle this new terminal state.\n\nPiperOrigin-RevId: 896685132\nChange-Id: I5c471da29140da5f43ecac3fa0636dcea772dfbc\n"
    },
    {
      "commit": "e830b6cbbd9d070e3696c9d913f2a6dd57a6aa16",
      "tree": "ef61c3f6098ffa30a9472a3d2264f0d857407740",
      "parents": [
        "f77a0f9d54c82dcbc2c0e40699b779cebdd36578"
      ],
      "author": {
        "name": "Rishabh Jain",
        "email": "jainrish@google.com",
        "time": "Mon Apr 06 17:48:29 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Apr 06 17:48:47 2026 -0700"
      },
      "message": "Remove initial validation check in ActionContext::EnterStateRunningAction\n\nRemoving the check in `ActionContext::EnterStateRunningAction` that skips running the action if the validation condition is met at the start. This logic was left over from a time when we used to retry actions after a restart, and it was causing false successes on some machines.\n\nAlso added a unit test in `action_context_test.cc` to verify that the action is run even if the validation condition is met initially.\n\nPiperOrigin-RevId: 895584876\nChange-Id: Id49542a30b452d5ca363adec9500ac031280c13c\n"
    },
    {
      "commit": "f77a0f9d54c82dcbc2c0e40699b779cebdd36578",
      "tree": "725aa2cd21322f60969b1c9a0bc72ba769644df9",
      "parents": [
        "854d482d6bf5ddfd2353693f350443e6d60395da"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Thu Apr 02 13:09:02 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Apr 02 13:09:20 2026 -0700"
      },
      "message": "Resolve \"@self\" entity tag in Redfish state monitors.\n\nThe Redfish state monitor creation now resolves the \"@self\" node entity tag to the actual entity tag from OfflineNodeEntityInformation. If the OfflineNodeEntityInformation\u0027s entity tag is empty, \"@self\" is kept and a warning is logged.\n\nPiperOrigin-RevId: 893659704\nChange-Id: I5111654432a2430d42d61f4f0684e6a1cecf9f6b\n"
    },
    {
      "commit": "854d482d6bf5ddfd2353693f350443e6d60395da",
      "tree": "c6a22817c390a1e6788767be1ab7d2d51eb89831",
      "parents": [
        "382dbf818356cac17c4a5a36f45352c4475f99c4"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Thu Apr 02 08:50:21 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Apr 02 08:50:39 2026 -0700"
      },
      "message": "Update Copybara ownership and contact for safepower_agent.\n\nThe owner_prod_group and contact_email in the copy.bara.sky configuration for safepower_agent are updated to \"safepower-dev-team\" and \"safepower-dev+copybara@google.com\" respectively.\n\nThis will make it so that when safepower-dev-team modifies the copybara config, the copybara will be updated.\n\nPiperOrigin-RevId: 893533589\nChange-Id: Ibd16ce2325d5eed3af3caba05836a85be6b4bdff\n"
    },
    {
      "commit": "382dbf818356cac17c4a5a36f45352c4475f99c4",
      "tree": "16fb574b09d12d5afaf8bc3f11e494a44c3630ad",
      "parents": [
        "e037afd9535b7cf06f846a7e9a19956709b9da29"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Wed Apr 01 20:25:01 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 01 20:25:29 2026 -0700"
      },
      "message": "Add proto matchers to test_util.h and simplify register_actions_bmc_test.\n\nThis change introduces `EqualsProto` and `IgnoringRepeatedFieldOrderingEqualsProto` to `test_util.h` for use in open-source builds. The `register_actions_bmc_test.cc` is updated to use these new matchers, making the assertions on `GetSupportedActionsResponse` more concise and readable. `#ifndef` guards are also added to existing macros in `test_util.h`.\n\nPiperOrigin-RevId: 893249103\nChange-Id: I61cabf6fd5bd6f673d0810c926d138b2c35e2a43\n"
    },
    {
      "commit": "e037afd9535b7cf06f846a7e9a19956709b9da29",
      "tree": "7974bfb5e74c88ffeb39804f3b36a506b13112ca",
      "parents": [
        "9381d32e75daceb727233404998b8a37b076cfd8"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Wed Apr 01 18:23:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 01 18:23:48 2026 -0700"
      },
      "message": "Use error_code overloads for std::filesystem functions.\n\nThis change modifies the usage of std::filesystem functions like exists, is_directory, remove, and directory_iterator to use their overloads that accept an std::error_code. This prevents exceptions from being thrown on errors and allows for explicit error handling.\n\nPiperOrigin-RevId: 893209819\nChange-Id: I4e4d704624f1cea817ffa66ae79aa3aac6caefb1\n"
    },
    {
      "commit": "9381d32e75daceb727233404998b8a37b076cfd8",
      "tree": "c40d38214ae9ebf80a70d17362e415c0e482af5e",
      "parents": [
        "c14399b42c639fc3d6a9e4192a313b7cc75f5e1e"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Apr 01 15:23:06 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 01 15:23:30 2026 -0700"
      },
      "message": "gpowerd: Remove upstream_flags from copy.bara.sky\n\nPiperOrigin-RevId: 893140545\nChange-Id: Ided269cef443049c2358d8bceea72d162f8fa392\n"
    },
    {
      "commit": "c14399b42c639fc3d6a9e4192a313b7cc75f5e1e",
      "tree": "28660455adbb8403179bbc35e90676ca373b8c81",
      "parents": [
        "f39d8c0e79beb1bdc465528bcc22af2f682d0794"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Apr 01 10:23:55 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 01 10:24:39 2026 -0700"
      },
      "message": "Add Copybara service config to watch utils proto and datapol scrubbing\n\n* Add a Copybara service config. The deprecated service config fields on piper_sot_to_gerrit are moved into the get_service_config\n* Added datapol scrubbing for utils.proto\n* Added watcher for utils.proto to the service config\n\nAfter this change goes through, I will manually verify that we are indeed watching utils.proto\n\nPiperOrigin-RevId: 892998184\nChange-Id: Iaf4420763a30c007a3c7dffec10f4155cb33f3d1\n"
    },
    {
      "commit": "f39d8c0e79beb1bdc465528bcc22af2f682d0794",
      "tree": "83205537ad866631af818cfa41fa55aad9c35b39",
      "parents": [
        "59b40fef6fd4b39aed51c7da1aa98fe41df2fa19"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Tue Mar 31 13:49:56 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Apr 01 10:24:22 2026 -0700"
      },
      "message": "#S4Mendel Add safepower_logging.proto to Logs ProtoDB and add Datapol annotations\n\nPiperOrigin-RevId: 892522328\nChange-Id: Id5cdaa82e08c4fbd600210291f82b9fde0cf45c8\n"
    },
    {
      "commit": "59b40fef6fd4b39aed51c7da1aa98fe41df2fa19",
      "tree": "04b25ceec5299968088e8b36aacd152a478a20a2",
      "parents": [
        "90f6fc9c06a10bca4148d1d07bdf706d3c816a35"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Mon Mar 30 11:39:34 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Mar 30 11:39:51 2026 -0700"
      },
      "message": "#gpowerd Track actions that are still validating during startup\n\n* In MonitorAction, when an action is still validating,\n  return an unavailable error instead of a not found error\n* Adds a validating_actions_ set to the ActionContextManager\n  and updates loading actions into the context manager accordingly\n\nPiperOrigin-RevId: 891824774\nChange-Id: I4ab2e1ca492cfcc04052c1fb79484058f120454b\n"
    },
    {
      "commit": "90f6fc9c06a10bca4148d1d07bdf706d3c816a35",
      "tree": "f2825a621712830e052e427986f4ceadc205c9b4",
      "parents": [
        "1500eda773295b1c349396d331a2523a38dcf813"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Mon Mar 30 11:36:40 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Mar 30 11:36:59 2026 -0700"
      },
      "message": "Resolve \"@self\" node entity tag in SafePowerAgentConfig.\n\nThis change modifies the BMC action registration process to support using \"SELF\" as a node entity tag in the SafePowerAgentConfig. When an action config specifies \"SELF\", the system will look up the actual entity tag from the OfflineNodeEntityInformation and replace \"SELF\" with it. This allows for more portable configurations.\n\nPiperOrigin-RevId: 891823124\nChange-Id: I12f446a04490b26a38f4d53fcac9c862820d6ffa\n"
    },
    {
      "commit": "1500eda773295b1c349396d331a2523a38dcf813",
      "tree": "04db289648b9c4ac8442a57e3191fb4f8bd0358b",
      "parents": [
        "36ea7890904fb37eb7dd4ffbe57aba62062b957d"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Thu Mar 19 18:27:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 19 18:27:26 2026 -0700"
      },
      "message": "Improve gPowerD graceful shutdown on SIGTERM\n\nThis change shuts down the gRPC server before canceling the io context.\n\nTested:\n```\n  blaze test //production/borg_mgmt/node_proxy/safepower/safepower_agent/testing:blaze_gpowerd_instance_test \\\n    --test_filter\u003dBlazeGpowerdInstanceTest.GetSupportedActions \\\n    --runs_per_test\u003d100 \\\n    --test_timeout\u003d100\n```\nPiperOrigin-RevId: 886482055\nChange-Id: Ia42f48d0dd2179de9bda2da73d1a431cd5742627\n"
    },
    {
      "commit": "36ea7890904fb37eb7dd4ffbe57aba62062b957d",
      "tree": "ce1aa520d39ec1c00de0b4238830c63f806665eb",
      "parents": [
        "0c647d41f34d21dd35bf4cb8907dad8475815a17"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Mar 19 15:51:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 19 15:52:03 2026 -0700"
      },
      "message": "Make gPowerD remain running while system goes down.\n\nThis change makes it so that gPowerD stays running along HMA and link-mgmt\nafter the root FS has been unmounted.\n\nWe respin safepower_agent right before issuing reboot-cli command. The new\ndaemon will bind to the same port. This is OK as google3 binaries seem to\ncreate sockets with SO_REUSEPORT.\n\nTested: Manually verifed on a IMC node. Console logs:\n\n```\n[ 3041.992272] systemd[1]: Stopped target network-pre.target.\n[ 3042.049022] systemd[1]: mountfsck-post.service: Deactivated successfully.\n[  OK  ] Stopped mountfsck-post.service.\n[ 3042.051340] systemd[1]: Stopped mountfsck-post.service.\n         Stopping udev.service...\n[ 3042.080463] systemd[1]: Stopping udev.service...\n[ 3042.536289] systemd[1]: udev.service: Deactivated successfully.\n[  OK  ] Stopped udev.service.\n[ 3042.540697] systemd[1]: Stopped udev.service.\n[ 3043.616551] sendsigs[25202]: Asking all remaining processes to terminate...\n[ 3043.685383] sendsigs[25186]: done.\nloasd[8840]: LOAS2 credential ID usages:own_credential_id:\u00274179340458098055277:campus-hen,3098491936816949705:campus-hen,3026434342779021769:campus-hen\u0027 check_count:\u0027115,115,115\u0027 number_of_dropped_serials:\u00270\u0027 dropped_serials_usage:\u00270\u0027 in_hwops:\u0027false\u0027\n[ 3055.270278] sendsigs[25186]: Currently running processes (pstree):\n[ 3055.396622] sendsigs[25247]: systemd-+-highlanderd---61*[{highlanderd}]\n[ 3055.397367] sendsigs[25247]:         |-hmad---43*[{hmad}]\n[ 3055.398387] sendsigs[25247]:         |-link_mgmt---42*[{link_mgmt}]\n[ 3055.398973] sendsigs[25247]:         |-sendsigs---pstree\n[ 3055.399277] sendsigs[25247]:         `-systemd-journal\n[ 3055.434988] sendsigs[25248]: Killing all remaining processes...\n[ 3055.435498] sendsigs[25186]: failed.\n[  OK  ] Stopped sendsigs.service.\n[ 3055.439650] systemd[1]: sendsigs.service: Deactivated successfully.\n[ 3055.440547] systemd[1]: Stopped sendsigs.service.\n         Stopping systemd-journald.service...\n[  OK  ] Stopped systemd-journald.service.\n[  OK  ] Reached target shutdown.target.\n         Starting umountnfs.service...\n[  OK  ] Finished umountnfs.service.\n         Starting before-umountfs.service...\n[  OK  ] Finished before-umountfs.service.\n         Starting dioreboot-reboot-wait.service...\n         Starting record-shutdown-end-time.service...\n[  OK  ] Finished dioreboot-reboot-wait.service.\n[  OK  ] Finished record-shutdown-end-time.service.\n         Starting umountroot.service...\n[  OK  ] Finished umountroot.service.\n[  OK  ] Reached target umount.target.\n[  OK  ] Reached target final.target.\n         Starting systemd-reboot.service...\nWill now restart.\nChecking /var/google/session/initscripts/power_cycle to see if we should power-cycle or reboot.\nAttempting power_cycle\nShutdown IMC NVMe controller, wait for tray powercycle\nIMC tray powercycle wait 300 seconds to provide networking to BMC\n[3303.436644] N: imc_2nd_fw_update_perst_counter:159 2ND FW: PERST detected, counter \u003d 7, time since last PERST \u003d 0 us\nPERST# is asserted\n[3303.449022] N: PERST# interrupt took 12322 us. Bandaid: -1, -1. OpMode: 2\n\u003c\u003c\u003c--- Power cycle here ---\u003e\u003e\u003e\n```\n\nPiperOrigin-RevId: 886417126\nChange-Id: I62b1e0796da4288f638e2292dde3d7ed279152be\n"
    },
    {
      "commit": "0c647d41f34d21dd35bf4cb8907dad8475815a17",
      "tree": "c3b6589bf7f9a373aab2258ae5b6d39477e8d245",
      "parents": [
        "e03b22ac99210c954c794150f8ad308a9116f13c"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Tue Mar 17 13:40:39 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 17 13:41:04 2026 -0700"
      },
      "message": "Add an insecure gRPC port to gpowerd.\n\nThis change removes the INSECURE_MODE build flag and instead makes gpowerd listen on both a secure port (using the auth manager) and insecure port, if configured.\n\nThe insecure port will normally be disabled, and blocked by the firewall rules\n\nPiperOrigin-RevId: 885187763\nChange-Id: Ic1f430352a30d21b0ee55d92afad618461650ae4\n"
    },
    {
      "commit": "e03b22ac99210c954c794150f8ad308a9116f13c",
      "tree": "d740e982b74d8de46b7db2b44eb63c011d7adaef",
      "parents": [
        "c282b86be709dcee2c70d8e14f870e5721c6ef6d"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sat Mar 14 08:21:53 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Mar 14 08:22:15 2026 -0700"
      },
      "message": "Fix 2 IncludeCleaner findings:\n* Used header \"platforms/uhm/node_entities/proto/offline_node_entities.proto.h\" is not included directly (2 times)\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just LGTM and Approve it!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 883658645\nChange-Id: I7c2c3c856fb481cf3b7fbe0bca0ff8de9dc6c092\n"
    },
    {
      "commit": "c282b86be709dcee2c70d8e14f870e5721c6ef6d",
      "tree": "dbc5526df7787b2887759a93adab5c48ebb84e30",
      "parents": [
        "e3a195402a08eaa8379252f1a8d28cf6bbd99a33"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Sat Mar 14 02:57:28 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Mar 14 02:57:44 2026 -0700"
      },
      "message": "Fix 1 IncludeCleaner finding:\n* Used header \"platforms/uhm/node_entities/proto/offline_node_entities.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just LGTM and Approve it!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 883574469\nChange-Id: I3ddcb0018683d4395e553770c38cc6d2e5498e1e\n"
    },
    {
      "commit": "e3a195402a08eaa8379252f1a8d28cf6bbd99a33",
      "tree": "a1f61af645d38ef2b18e90176cb9cddaa7b7827a",
      "parents": [
        "4d4776bdf13d962a78ad18926b695e91a2f29f33"
      ],
      "author": {
        "name": "Shounak Mitra",
        "email": "shounak@google.com",
        "time": "Fri Mar 13 21:17:37 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Mar 13 21:17:54 2026 -0700"
      },
      "message": "#gpowerd - Fix compare behavior when some state is missing\n\nWith this change, compare will return Unavailable when any abort condition\u0027s state is missing while we test the condition. Note that if _any_ abort does match, the result will still be an immediate abort.\n\nWhen checking conditions, we will continue waiting when an unavailable state is reported.\n\nThis change also serializes local -\u003e global state updaters: Previously, we had some listeners listening to state changes on both global and local, but now each listener listens to one or the other, and the global state accumulates all local state as well. This prevents unavailable state when the global state doesn\u0027t have the entire local state in it. This isn\u0027t expected during nominal s4v2 actuations, but may happen when we insert events etc. and during tests. The result of this is that we may end up with duplicate events on the global state updater, but this should not cause problems.\n\nThis fix doesn\u0027t correctly address handling situations where the pre-run validation check is unavailable.\n\nPiperOrigin-RevId: 883480038\nChange-Id: Ie7ae92a0c67ea4fc645ae574d9e878f28da02681\n"
    },
    {
      "commit": "4d4776bdf13d962a78ad18926b695e91a2f29f33",
      "tree": "3c8d49d6ec73bc30a63545f873b20832c08323ab",
      "parents": [
        "62f8f64acb4d289048af8c26a4aa15e35a34970e"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Fri Mar 13 10:43:59 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Mar 13 10:44:20 2026 -0700"
      },
      "message": "Flush the output stream before fsync() in persistent storage.\n\nThis ensures that all buffered data is written to the underlying file descriptor before calling fsync() to guarantee persistence.\n\nPiperOrigin-RevId: 883236264\nChange-Id: Ic664ba841165e7de5310f223095fbbdb373e8738\n"
    },
    {
      "commit": "62f8f64acb4d289048af8c26a4aa15e35a34970e",
      "tree": "990150328f8d6f2c7932aadc995814e5b47c737d",
      "parents": [
        "6b4cdb59a06bbeae0901fb8c69c9701f27055734"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Mar 12 16:06:54 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 12 16:07:12 2026 -0700"
      },
      "message": "Refactor Boost.Asio usage in safepower_agent/bmc.\n\nThis CL updates several Boost.Asio calls to use more modern or standard APIs, including `boost::asio::post`, `boost::asio::ip::make_address`, and `boost::asio::basic_waitable_timer::expires_after`.\n\nPiperOrigin-RevId: 882826842\nChange-Id: I7afe29ecd1e87a1b2b26431b42e35b9fdd84d746\n"
    },
    {
      "commit": "6b4cdb59a06bbeae0901fb8c69c9701f27055734",
      "tree": "221972c04f05854e82fc21c626d28dc2b1670bbe",
      "parents": [
        "72c353d43ab8815c7af22e9d3f13dff70dcb2bc5"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Thu Mar 12 13:07:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 12 13:07:25 2026 -0700"
      },
      "message": "Remove redundant boost/asio/io_service.hpp includes.\n\nThese files already include boost/asio/io_context.hpp, which is the modern equivalent of io_service.hpp. The io_service.hpp header is no longer necessary.\n\nPiperOrigin-RevId: 882740071\nChange-Id: Ifcafb8c0b61a430c7578157ade50bde045f1630c\n"
    },
    {
      "commit": "72c353d43ab8815c7af22e9d3f13dff70dcb2bc5",
      "tree": "63c4a997a4ad691ae8bfb926183d330d4c6a11bf",
      "parents": [
        "a7cbc5788159fdcd11c4617ae571602b38775e25"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Wed Mar 11 00:12:21 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Mar 11 00:14:06 2026 -0700"
      },
      "message": "Fix 1 IncludeCleaner finding:\n* Used header \"platforms/uhm/node_entities/proto/offline_node_entities.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just LGTM and Approve it!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 881835657\nChange-Id: I1bd4e0e63139a6aceaf7d27605e01181d98656cb\n"
    },
    {
      "commit": "a7cbc5788159fdcd11c4617ae571602b38775e25",
      "tree": "ef97cff6515fdb3904fffe3d373da4585e3d138c",
      "parents": [
        "bf974681d67e96ecae6bc15e2994044951735a69"
      ],
      "author": {
        "name": "gBMC Team",
        "email": "gbmc-core@google.com",
        "time": "Tue Mar 10 20:36:41 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 10 20:36:59 2026 -0700"
      },
      "message": "Fix 3 IncludeCleaner findings:\n* Used header \"platforms/uhm/node_entities/proto/offline_node_entities.proto.h\" is not included directly (2 times)\n* Used header \"platforms/uhm/node_entities/proto/resolved_entities.proto.h\" is not included directly\n\n ⚠️ Did submitting this CL break you?\n Click the \"Roll back\" button above, write a description of the problem (ideally with supporting logs/dashboards/screenshots) and a human global approver will be assigned to review the generated rollback CL.\n* See go/include-cleaner for more information about the tool that generated this change.\n* The global approvers for this change category are currently piloting the go/reviewbot tool so you may see global-review-bot-composite as the approver. Please contact code-health-team@google.com if you have any questions/concerns about the approval process.\n\nSee go/include-cleaner-lsc-approval for more information on why you\u0027ve received this change and why it is important.\n\nThis CL looks good? Just LGTM and Approve it!\nThis CL doesn’t look good? This is what you can do:\n* Revert this CL, by replying \"REVERT: \u003cprovide reason\u003e\"\n* File a bug under go/include-cleaner-bug for category IncludeCleaner if there\u0027s an issue with the CL content.\n* File a bug under go/rosie-bug if there\u0027s an issue with how the CL was managed.\n* For all other issues such as the formatting of the CL, please file a bug under\ngo/clrobot-bug.\n* Revert this CL and not get a CL that cleans up these paths in the future by\nreplying \"BLOCKLIST: \u003cprovide reason\u003e\". This is not reversible! We recommend to\nopt out the respective paths in your CL Robot configuration instead:\ngo/clrobot-opt-out.\n\nThis CL was generated by CL Robot - a tool that cleans up code findings\n(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/METADATA by\nfollowing go/clrobot#how-to-opt-in. Anything wrong with the signup? File a bug\nat go/clrobot-bug.\n\n#clrobot #MissingInclude\n\nTested:\n    Local presubmit tests passed.\nPiperOrigin-RevId: 881759308\nChange-Id: I5425f3d433bcf143a790e4ae17085de46bab6355\n"
    },
    {
      "commit": "bf974681d67e96ecae6bc15e2994044951735a69",
      "tree": "fcc0f4ffe90dc362038b272e24b82e1461b531de",
      "parents": [
        "eedb6db01a4af2e6b325cc5b94716b440e76ba42"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Mar 10 14:46:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Mar 10 14:46:42 2026 -0700"
      },
      "message": "Lightweight testing: Add gRPC client creation\n\nThis change introduces a method to create a gRPC client stub for the gpowerd instance launched in tests. A new test case is added to verify the gRPC connection by calling the GetSupportedActions RPC. The main function of gpowerd is also updated to use InitGoogle for google3 builds.\n\nPiperOrigin-RevId: 881632597\nChange-Id: Iee756fe057c3aa76e1d695c135d93059ff12a183\n"
    },
    {
      "commit": "eedb6db01a4af2e6b325cc5b94716b440e76ba42",
      "tree": "a5aaaf0fe42bb7a211c97721de46ded3547d34a4",
      "parents": [
        "97ad49f85f7415dc443051f058a158ebcfb0c761"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Thu Mar 05 20:24:17 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 05 20:24:37 2026 -0800"
      },
      "message": "Reduce log spam in safepower_agent BMC modules.\n\nChange frequent error logs to VLOG(1) or LOG_EVERY_N_SEC to avoid excessive logging, especially for transient or expected errors during BMC interactions.\n\nPiperOrigin-RevId: 879390866\nChange-Id: I46f9dc7e44b75e4eba712c0362244a5f7aa1c6ca\n"
    },
    {
      "commit": "97ad49f85f7415dc443051f058a158ebcfb0c761",
      "tree": "7612b9daa830e06ffa6442aa9cb8a0ca329c5398",
      "parents": [
        "4b20e95e3a9344684a57ef8a4987bf37eac405aa"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Thu Mar 05 19:41:00 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 05 19:41:17 2026 -0800"
      },
      "message": "Stop printing all task when cancel fails\n\nWhen I wrote this, I was expecting callers to only cancel task that exist. However, there is a now we use this to cancel a potential task every second. So printing the list of task does not have any value.\n\nPiperOrigin-RevId: 879375713\nChange-Id: Ib6093b50af55b2c29e5f7f9ad2a1fa9d304fd549\n"
    },
    {
      "commit": "4b20e95e3a9344684a57ef8a4987bf37eac405aa",
      "tree": "23c6d992ccbdd1dea6837c8f4f5808ec9d1c2b62",
      "parents": [
        "c72638c9e24b54293349ff2349662922247af7d0"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Thu Mar 05 19:19:29 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 05 19:19:46 2026 -0800"
      },
      "message": "Strip whitespace from BMC health check responses.\n\nThe BMC health check now strips ASCII whitespace from the received response before comparing it to the expected value. Additionally, all successful health check responses are logged periodically for debugging purposes.\n\nPiperOrigin-RevId: 879367415\nChange-Id: I2c44a918a34b8a556aef899a396a174946d6355f\n"
    },
    {
      "commit": "c72638c9e24b54293349ff2349662922247af7d0",
      "tree": "70b429dba0a28cad3274f5063babfd03c98d5d40",
      "parents": [
        "a11c801e08d58c551cb0e2d7342928ad0103bcdc"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Thu Mar 05 19:01:01 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Mar 05 19:01:19 2026 -0800"
      },
      "message": "prevent name collision: Use prefix at construction time\n\nThis change introduces a new member variable in `RemoteStateMonitor`, and the both sub classes populate it differently when they constructed the base class\n\nPiperOrigin-RevId: 879362207\nChange-Id: If454c0b25dab69b3ede1b563762b5ee6278c7685\n"
    },
    {
      "commit": "a11c801e08d58c551cb0e2d7342928ad0103bcdc",
      "tree": "f5020fa5afbf23392ac16e8a8380995a30362df3",
      "parents": [
        "4f3a34f1a19435359bf9c212011e2056aa4ffb0b"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Tue Feb 24 10:39:48 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Feb 24 10:40:05 2026 -0800"
      },
      "message": "#gpowerd BMC address lookup to separate explicit and prefix-based resolution\n\nPiperOrigin-RevId: 874687420\nChange-Id: Ib1175c2d148fa01b00dfec3d5a631817ad5ae67e\n"
    },
    {
      "commit": "4f3a34f1a19435359bf9c212011e2056aa4ffb0b",
      "tree": "487f00b3bcc6dc7d9a83a1baf80397a06d6537ab",
      "parents": [
        "a328331e7d0db5da6da2eb84eb212ef1515b8991"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Mon Feb 23 10:54:17 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Feb 23 10:54:39 2026 -0800"
      },
      "message": "Make gRPC port configurable in gpowerd\n\nPiperOrigin-RevId: 874156510\nChange-Id: I690621580b80a6f086710b57f34da0a7a3867c36\n"
    },
    {
      "commit": "a328331e7d0db5da6da2eb84eb212ef1515b8991",
      "tree": "197ef639a33e39cef34482a7849beac5f66d7e17",
      "parents": [
        "885d5ce77b78f340a1959721f880a27b02bee7dd"
      ],
      "author": {
        "name": "John Broadbent",
        "email": "jebr@google.com",
        "time": "Thu Feb 19 11:25:17 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Feb 19 11:25:38 2026 -0800"
      },
      "message": "Prioritize explicit IPv6 addresses from network interfaces in AddressLookup.\n\nThe AddressLookup::Resolve method now checks the network_interfaces field in the ResolvedNodeEntity. If an IPv6 address is explicitly provided in any network interface, that address is used. Otherwise, it falls back to deriving the address from the machine\u0027s IPv6 prefix and the node\u0027s ip_low64.\n\nPiperOrigin-RevId: 872486982\nChange-Id: I7996cd2a0eeabe289f17b84bdf36f5b416de24c6\n"
    },
    {
      "commit": "885d5ce77b78f340a1959721f880a27b02bee7dd",
      "tree": "7c6e076ad2d5f7915131c308f27f0a8b3aae1708",
      "parents": [
        "b7d2a74b19a0fa4bb007e43e8c4e63460d952c9e"
      ],
      "author": {
        "name": "Daniel Bourgeois",
        "email": "dcbourgeois@google.com",
        "time": "Wed Feb 18 12:11:15 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Feb 18 12:11:45 2026 -0800"
      },
      "message": "Allow configurable offline node entities path in safepower agent\n\nPiperOrigin-RevId: 871984315\nChange-Id: Ifc7419590e1a93744e9ecf70e43e21435d4d37b7\n"
    }
  ],
  "next": "b7d2a74b19a0fa4bb007e43e8c4e63460d952c9e"
}
