<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>dependabot on tomrochette.com</title>
    <link>https://tomrochette.com/tags/dependabot/</link>
    <description>Recent content in dependabot on tomrochette.com</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>tom@tomrochette.com (Tom Rochette)</managingEditor>
    <webMaster>tom@tomrochette.com (Tom Rochette)</webMaster>
    <copyright>© 2026 Tom Rochette</copyright>
    <lastBuildDate>Sun, 20 Sep 2026 04:51:49 -0400</lastBuildDate><atom:link href="https://tomrochette.com/tags/dependabot/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Agentic Maintenance at Scale: Best Practices for a Fleet of Repositories</title>
      <link>https://tomrochette.com/agentic-maintenance-at-scale/</link>
      <pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agentic-maintenance-at-scale/</guid>
      <category>ai</category><category>llm</category><category>agents</category><category>software-engineering</category><category>maintenance</category><category>automation</category><category>dependabot</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category>
      <description>&lt;p&gt;When agents do the maintenance, every repository you keep is a subscription to future work, and the subscription is paid in tokens.&#xA;The instinct at scale is to automate harder, Dependabot on everything, a scheduled agent per repository, alerts routed to a bot.&#xA;That instinct treats each repository as its own problem, and at fleet scale the fleet itself is the problem.&#xA;&lt;strong&gt;Agentic maintenance is fleet management: deciding which repositories deserve work at all, deciding what work they deserve, and reusing every decision across as many repositories as it applies to.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Every repository is a standing work order&#xA;    &lt;div id=&#34;every-repository-is-a-standing-work-order&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#every-repository-is-a-standing-work-order&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A repository that sits active in an organization is never neutral.&#xA;Its Dependabot config opens version-bump pull requests on a schedule.&#xA;Its security alerts accumulate.&#xA;Any scheduled agent that sweeps the fleet reads all of it as a backlog.&#xA;A repository that humans would quietly ignore, agents cannot, because an agent&amp;rsquo;s correct behavior when pointed at a repository full of signals is to act on them.&lt;/p&gt;&#xA;&lt;p&gt;When I maintained five repositories, ignoring a dead one cost me a guilty glance once a month.&#xA;With fifty, ignoring is no longer possible, because the automation keeps generating work regardless of whether anyone wants it.&#xA;The cost is not per decision anymore, it is per repository per unit of time, whether or not anyone looks.&#xA;&lt;strong&gt;Adding a repository to the fleet is adding a standing order for future work, and canceling that order is a maintenance task in itself.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Automation does not read intent&#xA;    &lt;div id=&#34;automation-does-not-read-intent&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#automation-does-not-read-intent&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Dependabot has no strategy.&#xA;It does not know that the library it wants to bump was superseded by another one, that the project is in maintenance mode, or that the product behind the repository was deprecated last quarter.&#xA;It opens the pull request because a newer version exists, and it will keep opening them until someone makes it stop.&#xA;The same is true for every scheduled agent: an agent that finds dependency alerts in a repository treats them as its work queue, because that is what it was told work looks like.&lt;/p&gt;&#xA;&lt;p&gt;A dependency bump in a repository nobody is investing in is pure waste.&#xA;It costs tokens to generate, CI minutes to validate, attention to review, and merge effort, and the value delivered is zero because nobody is deploying the result.&#xA;Multiply by the number of dead repositories and the number of updates per year, and the fleet is running a small factory that manufactures unneeded pull requests.&#xA;&lt;strong&gt;Bots generate work at a fixed rate per repository, independent of that repository&amp;rsquo;s value, so the value decision has to be made somewhere else, by you, before the bots run.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Archiving is the off switch&#xA;    &lt;div id=&#34;archiving-is-the-off-switch&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#archiving-is-the-off-switch&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The cheapest way to stop work on a repository is to &lt;a href=&#34;https://docs.github.com/en/repositories/archiving-a-github-repository/archiving-repositories&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=docs.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;archive it&lt;/a&gt;.&#xA;An archived repository becomes read-only: issues, pull requests, and code can no longer be changed, which means Dependabot has nowhere to open its pull requests, alerts have nowhere to be fixed, and scheduled agents have no work to perform.&#xA;The archive state is also a legible signal.&#xA;GitHub describes it as marking a repository as no longer actively maintained, so bots, agents, and humans all read the same message: no future work here.&lt;/p&gt;&#xA;&lt;p&gt;I used to think of archiving as an admission of failure, a small funeral for a project.&#xA;That framing is what keeps dead repositories alive, because nobody schedules funerals.&#xA;When I finally ran this pass over my own fleet, most of the repositories went straight to the archive, and the guilt I had been carrying about them turned out to be a bug in my process, not a flaw in my priorities.&#xA;The better framing is mechanical: archiving is the off switch for automated work, and a repository that will not receive maintenance should be switched off.&#xA;&lt;strong&gt;A repository that is archived cannot waste tokens, and a repository that is merely neglected wastes them on schedule.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If the project matters again later, GitHub supports unarchiving, so the downside of a wrong archive decision is small.&#xA;The downside of the opposite mistake, keeping a dead repository live, compounds every week the bots keep running.&lt;/p&gt;&#xA;&lt;p&gt;The lifecycle has three tiers, and the automation should differ on each one:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    A[&amp;#34;Active&amp;lt;br/&amp;gt;full automation: Dependabot, scheduled agents, alerts&amp;#34;] --&amp;gt;|fewer users, less investment| B[&amp;#34;Maintenance mode&amp;lt;br/&amp;gt;security updates only, batched and infrequent&amp;#34;]&#xA;    B --&amp;gt;|no users, no fixes planned| C[&amp;#34;Archived&amp;lt;br/&amp;gt;read-only, no automation, zero token spend&amp;#34;]&#xA;    C -.-&amp;gt;|a reason returns| A&lt;/pre&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Write the policy where the agents will read it&#xA;    &lt;div id=&#34;write-the-policy-where-the-agents-will-read-it&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#write-the-policy-where-the-agents-will-read-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Not everything belongs in the archive, and not everything active deserves full service.&#xA;A library with real users but no development might deserve security bumps only, batched monthly.&#xA;A template repository might deserve updates once a quarter.&#xA;The tier matters only if the machines can read it.&lt;/p&gt;&#xA;&lt;p&gt;The Dependabot config can encode part of the policy: &lt;a href=&#34;https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/configure-version-updates&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=docs.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;version update schedules&lt;/a&gt; can be set to daily, weekly, or monthly, with per-dependency ignore rules for anything the policy declines.&#xA;But the part that matters most to agents lives in the repository&amp;rsquo;s agent instructions, the AGENTS.md layer, because that is the file agents actually obey.&#xA;&amp;ldquo;Dependency pull requests: security alerts only, otherwise close with a pointer to the maintenance policy&amp;rdquo; is a sentence an agent can execute.&#xA;No policy at all is also an instruction, and the instruction it gives is &amp;ldquo;everything here is worth maintaining&amp;rdquo;.&#xA;&lt;strong&gt;An agent faced with an unannotated repository will invent a policy, and the invented policy is always maximum effort.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Sweep the portfolio, do not fight per-repository fires&#xA;    &lt;div id=&#34;sweep-the-portfolio-do-not-fight-per-repository-fires&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#sweep-the-portfolio-do-not-fight-per-repository-fires&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The wrong way to run maintenance agents at scale is one agent per repository on a timer.&#xA;That design multiplies cost by the repository count and makes the agent re-learn the same context on every run.&#xA;The right granularity is the portfolio sweep: one scheduled run that walks every repository, collects the signals, and produces a ranked list of what deserves action this week.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The sweep output is a triage report, not a pile of pull requests.&lt;/strong&gt;&#xA;Agents then get dispatched only at the top of the list, where the value is, and everything below the line gets a note instead of a token budget.&#xA;A sweep also sees what per-repository agents cannot: the same change suggested everywhere.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The same suggestion everywhere is one change&#xA;    &lt;div id=&#34;the-same-suggestion-everywhere-is-one-change&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-same-suggestion-everywhere-is-one-change&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Dependabot does not coordinate across repositories.&#xA;It will open the same GitHub Actions version bump in thirty repositories, each one arriving as an independent pull request that looks like independent work.&#xA;Read as a pile, that is thirty tasks.&#xA;Read as a list, it is one upgrade.&#xA;&lt;strong&gt;Aggregating the suggestions before acting on any of them is what turns the pile into a list, and the list is where the economies live.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The decision is the expensive part, and the decision does not often change per repository.&#xA;Deciding whether actions/upload-artifact should move from v3 to v4 costs the same investigation whether you run it once or thirty times: what breaks, which workflows depend on the old behavior, what the migration needs.&#xA;The per-repository work is the applying, and applying a decided change is mechanical, cheap, and fully delegable to an agent.&#xA;So decide once, write the rationale once, and send the same answer to all thirty pull requests, applying the change in every repository and flagging the few that need an exception.&#xA;&lt;strong&gt;The application happens once per repository either way, the saving comes from paying the decision once across all of them.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A suggestion that keeps returning is also a design signal.&#xA;If every repository carries its own copy of the same workflow steps, every upstream action bump becomes thirty pull requests again next quarter, and the decision cost recurs with them.&#xA;Move the repeated piece into a shared component, a reusable workflow or a composite action that lives in one repository and is called by all the others, and the next bump happens in one place by construction.&#xA;&lt;strong&gt;The best fix for a maintenance task that repeats across the fleet is to stop repeating it, by giving the change exactly one home.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Measure maintenance in tokens&#xA;    &lt;div id=&#34;measure-maintenance-in-tokens&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#measure-maintenance-in-tokens&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Human-scale maintenance was measured in hours, and hours were scarce enough to force triage on their own.&#xA;Agentic maintenance is measured in tokens, and tokens are cheap enough that the waste hides until the invoice arrives.&#xA;So make the bill visible: track tokens spent per repository per month, alongside how much of that spend produced merged work.&lt;/p&gt;&#xA;&lt;p&gt;The numbers feed the pruning loop.&#xA;A repository that burns a large share of the budget while producing no merges is either misconfigured or dead, and either way the fix is the same conversation: what is this repository for, who uses it, and should it still be in the fleet.&#xA;&lt;strong&gt;The token ledger is the portfolio review, and the portfolio review is where the fleet decisions come from: what to keep active, what to demote to maintenance, and what to archive.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What to Do Next&#xA;    &lt;div id=&#34;what-to-do-next&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#what-to-do-next&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;List every repository you maintain and mark each one with the tier it deserves: active, maintenance mode, or archive.&lt;/li&gt;&#xA;&lt;li&gt;Archive everything in the third bucket today, and turn off its dependency automation before you do.&lt;/li&gt;&#xA;&lt;li&gt;For every repository that stays, write its maintenance policy into its agent instructions: what kinds of updates are wanted, at what cadence, and what should be declined automatically.&lt;/li&gt;&#xA;&lt;li&gt;Replace per-repository scheduled agents with one portfolio sweep that produces a ranked list, and dispatch agents only at the top of the list.&lt;/li&gt;&#xA;&lt;li&gt;Aggregate the open suggestions across repositories before acting on any of them: group identical changes, make the decision once, and apply it everywhere with the same rationale.&lt;/li&gt;&#xA;&lt;li&gt;Centralize the pieces that repeat, such as shared workflows and composite actions, so the next change lands in one place.&lt;/li&gt;&#xA;&lt;li&gt;Track tokens per repository per month, and let the biggest spenders with the fewest merged outcomes lead the next round of archive decisions.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;Maintenance at scale is not a stack of per-repository chores, it is the management of a fleet: admit work deliberately, decide once where the same change repeats, and keep the automation pointed at the repositories that matter.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;See also&#xA;    &lt;div id=&#34;see-also&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#see-also&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../too-many-agent-sessions-archiving-is-cleanup-admission-is-the-fix/index.md&#34; &gt;Too Many Agent Sessions: Archiving Is Cleanup, Admission Is the Fix&lt;/a&gt; - the session-list version of the archive decision, where admission control beats cleanup&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/what-needs-updating-when-agents-do-the-work/&#34; &gt;What Needs Updating When Agents Do the Work&lt;/a&gt; - the maintenance loop agents run after a change lands, the machinery this article says to point only at repositories that matter&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../i-specify-open-source-projects-i-dont-maintain/index.md&#34; &gt;I Specify Open Source Projects I Don&amp;rsquo;t Maintain&lt;/a&gt; - a deliberate answer to which upstream work deserves attention, the dependency-side version of portfolio triage&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../every-decision-you-change-pays-once-per-file/index.md&#34; &gt;Every Decision You Change Pays Once Per File&lt;/a&gt; - the same decision-copy economics inside one project, where centralizing a decision is the fix for shotgun-surgery maintenance&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt; - the end state where a repository maintains itself, which only makes sense to build for repositories that earned a place in the fleet&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; - why maintenance is gardening rather than construction, and why gardens need beds retired, not just watered&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;References&#xA;    &lt;div id=&#34;references&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#references&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.github.com/en/repositories/archiving-a-github-repository/archiving-repositories&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=docs.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub Docs, &amp;ldquo;Archiving repositories&amp;rdquo;&lt;/a&gt; - the read-only semantics of archived repositories and the unarchive path, which ground the claim that archiving stops automated work&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/configure-version-updates&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=docs.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub Docs, &amp;ldquo;Configuring Dependabot version updates&amp;rdquo;&lt;/a&gt; - the scheduling and per-ecosystem controls that encode maintenance tiers in the Dependabot config&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
  </channel>
</rss>
