<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>tomrochette.com</title>
    <link>https://tomrochette.com/</link>
    <description>Recent content 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>
    <atom:link href="https://tomrochette.com/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>What I&#39;ve built and what I need: August 2026</title>
      <link>https://tomrochette.com/what-ive-built-and-what-i-need/2026-08/</link>
      <pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-ive-built-and-what-i-need/2026-08/</guid>
      <category>what-ive-built-and-what-i-need</category><category>personal-update</category><category>llm</category><category>ai-agents</category><category>automation</category><category>sdlc</category><category>pdlc</category><category>workflows</category><category>fully-ai-generated</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The headline this month was &lt;strong&gt;the product-side counterpart to the SDLC: a full PDLC skill set that carries an idea from discovery through measurement&lt;/strong&gt;.&#xA;August also realigned the verification skills around non-overlapping roles, added several new pipeline phases, and completed the ISO/IEC 25010 audit set.&#xA;The month came to 61 commits, over 500 files changed, and 30 new skills.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Have Been Working On&#xA;    &lt;div id=&#34;what-i-have-been-working-on&#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-i-have-been-working-on&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Shipped the &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/pdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PDLC&lt;/a&gt; pipeline.&lt;/strong&gt;&#xA;This was last month&amp;rsquo;s open need, and it is now a self-contained product development lifecycle that wraps the engineering one.&#xA;It covers discovery, validation, strategy, definition, launch, and measurement, with a proceed, pivot, or kill gate at every phase.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/pdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PDLC&lt;/a&gt; is the only slash command; the 31 phase and cross-cutting sub-skills live under &lt;code&gt;skills/pdlc/skills/&lt;/code&gt; and the orchestrator loads them on demand.&#xA;Artifacts live under &lt;code&gt;.pdlc/&lt;/code&gt;, mirroring the &lt;code&gt;.sdlc/&lt;/code&gt; conventions: a shared reference file, a &lt;code&gt;PDLC_DIR&lt;/code&gt; fallback, a state file, and a revision mode.&#xA;Definition is the seam where the product work hands the settled what and why to SDLC.&#xA;Two supporting skills came with it, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-roadmap/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-roadmap&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-roadmap/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-roadmap&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/identify-feature-opportunities/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;identify-feature-opportunities&lt;/a&gt; generates and ranks new ideas from the code surface.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Realigned the verification skills.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/validate-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;validate-pr&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/verify-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;verify-pr&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-pr&lt;/a&gt; had overlapping mandates, so I split them into three questions: validate-pr asks whether the change builds the right product, verify-pr asks whether the product is built right using runtime proof, and review-pr judges code craft from static reading alone.&#xA;The new &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-requested-prs/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-requested-prs&lt;/a&gt; orchestrator runs the three across the PRs waiting on me and skips any step already done for the current commit using SHA markers.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/analyze-test-coverage/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;analyze-test-coverage&lt;/a&gt; became its own skill for reporting introduced tests, change coverage, and uncovered code, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-pr-full/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-pr-full&lt;/a&gt; chains the whole review into one pass.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Added SDLC phases and artifacts.&lt;/strong&gt;&#xA;A new &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/validate-assumptions/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;validate-assumptions&lt;/a&gt;/&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-assumption-validation/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-assumption-validation&lt;/a&gt; phase collects the assumptions made during design, runs the cheapest experiment that could invalidate each risky one, and blocks implementation when an assumption fails.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-lifecycle/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-lifecycle&lt;/a&gt;/&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-lifecycle/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-lifecycle&lt;/a&gt; document how a resource&amp;rsquo;s states, transitions, and retention change over time, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-domain-model/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-domain-model&lt;/a&gt;/&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-domain-model/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-domain-model&lt;/a&gt; became standalone so a domain can be understood before solutioning.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-project/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-project&lt;/a&gt;/&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-project/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-project&lt;/a&gt; fill the context files for a new repository, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-question/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-question&lt;/a&gt;/&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-question/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-question&lt;/a&gt; record open questions with what they block.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-cli-design/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-cli-design&lt;/a&gt; settles a feature&amp;rsquo;s command surface as a companion artifact to requirements.&#xA;Generated artifacts carry a &lt;code&gt;session_link&lt;/code&gt; so a reviewer can reopen the session that produced them, &lt;code&gt;create-*&lt;/code&gt; auto-dispatches its &lt;code&gt;review-*&lt;/code&gt; in a subagent, and outcome files list the artifacts a phase produced.&#xA;A single HTML slide deck now presents the whole SDLC family.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Completed the ISO/IEC 25010 audit set.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/audit-sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;audit-sdlc&lt;/a&gt; is now the coordinator for the &lt;a href=&#34;https://en.wikipedia.org/wiki/ISO/IEC_25010&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ISO/IEC 25010&lt;/a&gt; quality model, with a mapping table from each characteristic to a skill.&#xA;One skill now covers each remaining characteristic: functional suitability, performance efficiency, compatibility, usability, reliability, maintainability, and portability, alongside the existing security and observability audits.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Shipped general-purpose skills.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/devils-advocate/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;devils-advocate&lt;/a&gt; argues the strongest case against an idea, plan, or decision before you commit.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/gh-stack/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;gh-stack&lt;/a&gt; manages stacked pull requests.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/post-slack-message/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;post-slack-message&lt;/a&gt; posts or threads a Slack message.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/stakeholder-announcement/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;stakeholder-announcement&lt;/a&gt; drafts and posts infrastructure updates to stakeholder channels.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/agents-section-daily-refresh/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents-section-daily-refresh&lt;/a&gt; runs the daily curation of the agent-maintained section of this blog.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-articles/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-articles&lt;/a&gt; brings a batch of articles into conformance with the writing rules.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/handle-pr-author-feedback/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;handle-pr-author-feedback&lt;/a&gt; (renamed from &lt;code&gt;handle-pr-feedback&lt;/code&gt;) verifies that an author&amp;rsquo;s new commits answer your review comments.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Gated GitHub writes and reworked tooling.&lt;/strong&gt;&#xA;A &lt;code&gt;should-post-to-github&lt;/code&gt; script now gates every GitHub content write, and the PR skills default to not posting, so a comment or merge only happens when &lt;code&gt;--post&lt;/code&gt; is passed.&#xA;SDLC worktrees moved to &lt;code&gt;/tmp/sdlc/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;/&amp;lt;issue&amp;gt;&lt;/code&gt;, and &lt;code&gt;~/.sdlc/**&lt;/code&gt; and &lt;code&gt;/tmp/sdlc/**&lt;/code&gt; are pre-approved in the agent CLI so unattended runs are not stopped by a prompt.&#xA;Script references moved to &lt;code&gt;~/.agents/scripts/&lt;/code&gt;, the audit and find skills switched from grep to ripgrep, and &lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;.claude&lt;/code&gt; were replaced by &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.agents&lt;/code&gt; across the library.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tightened conventions.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-article/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-article&lt;/a&gt; now requires naming the referent rather than leaving a vague it, and the 2-5 link cap on its See also sections was removed.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Currently Need&#xA;    &lt;div id=&#34;what-i-currently-need&#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-i-currently-need&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I did not write this entry at the time, so I have no record of what I needed in August and am stating that plainly rather than reconstructing a list I cannot trust.&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;https://tomrochette.com/what-ive-built-and-what-i-need/2026-07/&#34; &gt;What I&amp;rsquo;ve built and what I need: July 2026&lt;/a&gt; - the previous entry in this series; August delivers the PDLC pipeline it asked for.&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-to-end automation vision that the SDLC and PDLC pipelines now serve.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; - the scheduling layer that runs skills unattended, which the daily refresh and PR skills rely on.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/iterating-on-agent-skills/&#34; &gt;Iterating on Agent Skills&lt;/a&gt; - how the skill library changes over time, of which this month&amp;rsquo;s 30 additions are one step.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../../a-pull-request-is-a-claim-not-evidence/index.md&#34; &gt;A Pull Request Is a Claim, Not Evidence&lt;/a&gt; - the reasoning behind splitting verification into a right-product check and a built-right check.&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://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents&lt;/a&gt; - the skill library where the PDLC pipeline, the verification realignment, and the audit set landed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/ISO/IEC_25010&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ISO/IEC 25010&lt;/a&gt; - the quality model the audit skills now map one to one.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; - the GitHub CLI used across the review and feedback skills.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What I&#39;ve built and what I need: September 2026</title>
      <link>https://tomrochette.com/what-ive-built-and-what-i-need/2026-09/</link>
      <pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-ive-built-and-what-i-need/2026-09/</guid>
      <category>what-ive-built-and-what-i-need</category><category>personal-update</category><category>llm</category><category>ai-agents</category><category>automation</category><category>sdlc</category><category>workflows</category><category>fully-ai-generated</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The headline this month was &lt;strong&gt;turning the review skills into a scheduled, mostly unattended loop, and building the first instrument for where my session time actually goes&lt;/strong&gt;.&#xA;September came to 58 commits, over 180 files changed, and 14 new skills.&#xA;The measurement points straight at what I need next: to stop babysitting sessions.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Have Been Working On&#xA;    &lt;div id=&#34;what-i-have-been-working-on&#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-i-have-been-working-on&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Turned reviewing others&amp;rsquo; PRs into a scheduled, mostly unattended loop.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-requested-prs/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-requested-prs&lt;/a&gt; now fetches every PR waiting on me in one GraphQL query, runs discovery in parallel, sorts the queue by blocking depth, and skips any step already done for the current commit.&#xA;It also recovers dropped team review requests from notifications, and a readiness light beside each PR marks when it can be auto-approved.&#xA;The new &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/assess-pr-risk/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;assess-pr-risk&lt;/a&gt; scores a PR&amp;rsquo;s risk and confidence to decide how deep the review goes, using only evidence it gathers itself.&#xA;The reverse direction, handling feedback on my own PRs, is &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/triage-pr-feedback/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;triage-pr-feedback&lt;/a&gt; plus a FastAPI dashboard that groups and sorts incoming comments so I can mark each one implement, decline, or defer.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/handle-pr-reviewer-feedback/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;handle-pr-reviewer-feedback&lt;/a&gt; owns that contract and triage just delegates.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/handle-failing-pr-ci/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;handle-failing-pr-ci&lt;/a&gt; lists my PRs&amp;rsquo; CI status and fixes failures in parallel.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-pr-full/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-pr-full&lt;/a&gt; chains the whole review, now starting with test-coverage analysis and committing its assets alongside the report.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pushed verification earlier, into implementation.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/refactor-implementation/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;refactor-implementation&lt;/a&gt; runs between implementation and review to introduce only the abstractions the change needs.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-implementation/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-implementation&lt;/a&gt; now checks coverage and adds characterization tests before it modifies code.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/propagate-changes/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;propagate-changes&lt;/a&gt; replaced backpropagate-sdlc and stopped being one-directional: it rewrites dependents and questions the premises they rely on.&#xA;The repo&amp;rsquo;s own rules now say to get a working feature first, before any lint or type check.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Built an instrument for where session time goes.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/TomzxCode/llm-sessions-analyzer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-sessions-analyzer&lt;/a&gt; reads the &lt;a href=&#34;https://github.com/kenn-io/agentsview&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agentsview&lt;/a&gt; &lt;code&gt;sessions.db&lt;/code&gt; archive read-only and attributes the wall-clock span between consecutive messages to a category: coding, testing, linting, formatting, build, exploration, research, git, delegation.&#xA;It reports a stacked bar, a per-category table, and a timeline in the terminal or as a self-contained, sortable HTML report.&#xA;The point is to find where the time actually goes: whether I am waiting on a specific tool most of the day (test suites run too widely or too often, lint and type checks that cost more than they save, builds whose artifacts never get used), or simply waiting on the model to generate.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Added visualization and writing skills.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-svg-image/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-svg-image&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-mermaid-visualization/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-mermaid-visualization&lt;/a&gt; split diagram work out of &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-article/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-article&lt;/a&gt;, which now delegates to them, records the agent sessions that contributed to a piece, and requires direct statements over loose prose.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Grew the general-purpose skill set.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/setup-agent-machine/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;setup-agent-machine&lt;/a&gt;/&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-agent-machine/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-agent-machine&lt;/a&gt; turn a directory into an indexed machine context.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/search-existing-issues/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;search-existing-issues&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/select-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;select-issue&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/trace-issues/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;trace-issues&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-discussion/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-discussion&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/prune-merged-worktrees/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;prune-merged-worktrees&lt;/a&gt; cover the issue lifecycle.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/slack-resolve-threads/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slack-resolve-threads&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/improve-sessions/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;improve-sessions&lt;/a&gt; mine Slack threads and past sessions for follow-ups and reusable lessons.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-skill/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-skill&lt;/a&gt; authors a new skill from the best existing examples.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Made concise communication a shared rule instead of a per-skill habit.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/communication-guidelines/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;communication-guidelines&lt;/a&gt; is the single place every skill reads before it writes text on my behalf, from GitHub comments to Slack messages and email.&#xA;It sets one principle (lead with the point, cut every sentence that does not change what the reader knows or does) and concrete length ceilings per surface.&#xA;&lt;strong&gt;This matters more as more of the output is machine-written&lt;/strong&gt;, since a language model&amp;rsquo;s natural failure mode is padding and repetition.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Taught an agent to read a day of Slack and report what was decided.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/extract-colleague-decisions/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;extract-colleague-decisions&lt;/a&gt; searches Slack for the messages a set of colleagues authored in a day, reads the full threads behind them, and pulls out the decisions each person made, plus who supported them, citing a permalink for each and filtering out the chatter.&#xA;The judgment is the point: telling a decision from an acknowledgement is a reading task, not a keyword match, and a small Jev classifier buckets each message to speed that judgment up.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Added a memory file so sessions stop relearning the same lessons.&lt;/strong&gt;&#xA;&lt;code&gt;AGENTS.md&lt;/code&gt; carries the durable rules, but not the decisions, conventions, and gotchas discovered mid-session that the next one should inherit.&#xA;&lt;code&gt;MEMORY.md&lt;/code&gt; holds those, a global one for cross-project lessons and one per project for repository facts.&#xA;Every session reads both at the start and writes back what it learns.&#xA;It stays narrow on purpose: only what a future session cannot cheaply rediscover from the repo, kept concise and nothing a near-term commit would invalidate.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tightened conventions and tooling.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/banned-terms.txt&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;banned-terms.txt&lt;/a&gt; is now the single source of truth for banned terms, and report file naming was normalized across the review skills.&#xA;The library was cleaned of Claude Code and &lt;code&gt;.claude&lt;/code&gt; references and the old &lt;code&gt;slack-cached&lt;/code&gt; name.&#xA;&lt;code&gt;create-pr&lt;/code&gt; gained reviewer context comments via &lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; and design decisions in the description, and &lt;code&gt;create-pr-description&lt;/code&gt; now diffs against the PR base with &lt;code&gt;gh&lt;/code&gt; instead of Graphite.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Currently Need&#xA;    &lt;div id=&#34;what-i-currently-need&#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-i-currently-need&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;I need to stop babysitting sessions.&lt;/strong&gt;&#xA;Most of my supervision time goes to steering a running agent and catching when the original prompt or context was wrong.&#xA;That is the wrong place for my attention to be.&#xA;What I want is a run that goes from prompt to end-to-end tested and verified on its own, and I do not have it yet.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;I need proof that is easy to consume and that proves real behavior.&lt;/strong&gt;&#xA;The verification I need at the end is not the model asserting success.&#xA;It is evidence a human can skim quickly that the thing we expected to work actually works, not that the agent hallucinated it working.&#xA;Closing this gap is what makes the first one possible: I can walk away only when I trust the proof.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;I need to go from one session at a time to many.&lt;/strong&gt;&#xA;I want to explore solving problems at scale as a learning exercise, mostly in software engineering projects, on the hunch that a generic framework is hiding there.&#xA;The tooling (loops, the scheduler, the gates), the trust (relying on CI and review), and the process (how work is scoped and handed off) all feel like part of the blocker, and the sessions analyzer is my first attempt to see which one to attack first.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;I need the review pipeline to stay fast as I lean on it more.&lt;/strong&gt;&#xA;&lt;code&gt;review-requested-prs&lt;/code&gt; and the other review skills call the GitHub API directly, and I want to route them through &lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; as a caching layer so repeated runs reuse cached issues, PRs, and comments instead of refetching them.&#xA;That should cut API calls, raise the cache hit rate, and keep the hourly loop cheap enough to run without thinking about it.&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;https://tomrochette.com/what-ive-built-and-what-i-need/2026-08/&#34; &gt;What I&amp;rsquo;ve built and what I need: August 2026&lt;/a&gt; - the previous entry; September turns the review skills it described into a scheduled loop.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many LLM Agent Sessions&lt;/a&gt; - the one-to-many problem this month&amp;rsquo;s need names.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the proof a human can skim without reading every line.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; - the scheduling layer that makes unattended runs possible.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - why session babysitting is the thing to remove next.&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://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents&lt;/a&gt; - the skill library where the review, implementation, and machine-context skills landed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/llm-sessions-analyzer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-sessions-analyzer&lt;/a&gt; - the tool built this month to measure where session time goes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/kenn-io/agentsview&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agentsview&lt;/a&gt; - the session archive llm-sessions-analyzer reads.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; - the GitHub CLI used across the review and feedback skills.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Duplicate Issue Was Written in Chinese</title>
      <link>https://tomrochette.com/the-duplicate-issue-was-written-in-chinese/</link>
      <pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-duplicate-issue-was-written-in-chinese/</guid>
      <category>ai</category><category>llm</category><category>agents</category><category>issues</category><category>triage</category><category>open-source</category><category>github</category><category>duplicate-detection</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;This morning I hit a bug and asked my agent to file an issue for it.&#xA;It came back with a stop sign instead.&#xA;The exact bug had already been reported, a few hours earlier, in Chinese.&#xA;&lt;strong&gt;The agent did the one thing a decade of keyword search never did for me: it read a Chinese bug report and knew it was mine.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bug and the Request&#xA;    &lt;div id=&#34;the-bug-and-the-request&#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-bug-and-the-request&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The app is &lt;a href=&#34;https://github.com/openchamber/openchamber&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber&lt;/a&gt; 2.0.0.&#xA;In Settings, under Web Search, every option failed the same way.&#xA;I picked a search provider, a toast appeared saying &amp;ldquo;Couldn&amp;rsquo;t save the web search choice.&amp;rdquo;, and the selection rolled back.&#xA;A typical bug report.&lt;/p&gt;&#xA;&lt;p&gt;I typed what I knew to my agent: create an issue, the web search choice cannot be saved, it happens when switching the search provider.&#xA;Notice what I did not do.&#xA;I did not search GitHub first, and I did not open the source.&#xA;I gave the agent a half-formed report and moved on, expecting it to handle the rest.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Skill That Fired&#xA;    &lt;div id=&#34;the-skill-that-fired&#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-skill-that-fired&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The skill my agent runs when I ask it to file an issue starts with one instruction: search for duplicates before any codebase investigation.&#xA;It followed the skill without being asked.&#xA;One grep matched my words to the app&amp;rsquo;s own UI strings, and then it ran three GitHub searches: &amp;ldquo;web search provider&amp;rdquo;, &amp;ldquo;search provider save&amp;rdquo;, and &amp;ldquo;websearch settings&amp;rdquo;.&#xA;The first returned four unrelated issues, and the second returned the Chinese report as its top result.&#xA;The queries were plain English, and the hit was still a Chinese report.&#xA;The report&amp;rsquo;s body made the connection: the Chinese reporter had listed the failing endpoint, /api/config/websearch, and the frontend store, useWebSearchStore, and English identifiers like those match an English query no matter what language surrounds them.&#xA;Retrieval was never the hard part, because code identifiers are already language-neutral.&#xA;The agent opened the thread, read the Chinese, and did the translating after the hit, not before.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Match&#xA;    &lt;div id=&#34;the-match&#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-match&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The match was issue &lt;a href=&#34;https://github.com/openchamber/openchamber/issues/3880&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;#3880&lt;/a&gt;, titled &amp;ldquo;[Bug] v2.0.0 网页搜索选择无法保存，切换任何选项都会报错&amp;rdquo; (&amp;ldquo;the web search selection cannot be saved, switching any option shows an error&amp;rdquo;).&#xA;It had been filed by a reporter I had never interacted with, and its prose was written entirely in Chinese.&#xA;Same component, same toast, same rollback on every option.&#xA;The Chinese reporter had even done their own careful investigation of their machine and listed the API calls involved.&lt;/p&gt;&#xA;&lt;p&gt;The agent read the full report, compared it against mine, and concluded it was an exact match.&#xA;Then it stopped.&#xA;No new issue was filed, and it told me why in plain terms: a duplicate already exists, so it did not create one.&#xA;It went one step further, checked the current source to confirm the bug was still present, and corrected a wrong guess in the existing thread&amp;rsquo;s comments.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Two paths after a bug report: a keyword search surfaces the Chinese report but the match cannot be confirmed and a duplicate gets filed, while an agent reads the hit, confirms it, and no duplicate exists&#34;&#xA;    src=&#34;https://tomrochette.com/the-duplicate-issue-was-written-in-chinese/images/duplicate-paths.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why This Was New to Me&#xA;    &lt;div id=&#34;why-this-was-new-to-me&#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;#why-this-was-new-to-me&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Duplicate detection was never bounded by retrieval, it was bounded by confirmation, and confirmation is reading.&lt;/strong&gt;&#xA;GitHub search matches strings, and it matches them in the issue body too.&#xA;No English query matches the title 网页搜索选择无法保存, but the English identifiers in that report&amp;rsquo;s body match an English query fine.&#xA;So a keyword search can surface a foreign-language report.&#xA;What it cannot do is tell you the report is your bug, because judging the match means reading it.&#xA;An English speaker looking at a Chinese-titled search result skips it or files anyway, and both paths end in a duplicate.&#xA;I would have filed mine at exactly that step, not out of laziness, but because confirming the hit meant translating it by hand.&#xA;The old workflow was not broken, it stopped one step short, and the step it stopped at was the language barrier.&lt;/p&gt;&#xA;&lt;p&gt;The result in the old world is familiar to anyone who has maintained a project.&#xA;The same bug arrives three times in three languages, a bilingual maintainer or a patient contributor eventually connects them, and the duplicates get merged weeks later, after the maintainers have already triaged each copy.&#xA;The dedup always happened, but it happened on the maintainer&amp;rsquo;s time.&lt;/p&gt;&#xA;&lt;p&gt;An LLM agent reads GitHub in any language it knows, Chinese as easily as English.&#xA;The string search still does the retrieval, the reading does the confirmation, and both happen in the same minute of the same session.&#xA;The dedup moves from the maintainer&amp;rsquo;s week to the reporter&amp;rsquo;s minute.&#xA;&lt;strong&gt;The first useful thing my agent did that morning was refuse to do the work I asked for.&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;p&gt;If agents file issues for you, put duplicate-first at the top of the issue-filing skill, and make the language point explicit: tell the agent to treat translation as part of the search and to read candidate issues before dismissing them.&#xA;A search that only matches your own language is a search that misses half the issues on GitHub.&#xA;If your agent ever fails to catch a cross-language duplicate, check whether its search was string-bound.&lt;/p&gt;&#xA;&lt;p&gt;If you maintain a project, expect the mirror image.&#xA;Fewer copies of the same bug reach your queue, because the reporter&amp;rsquo;s agent catches them at filing time.&#xA;The comments that still arrive can contain more than a symptom: an agent that finds an existing issue reads the thread, checks the current source, and can correct a wrong theory already in the thread, as mine did on #3880.&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;https://tomrochette.com/send-implementation-not-issue/&#34; &gt;Issues Are Free Now: Send the Implementation, Not the Idea&lt;/a&gt; - the economics of filing issues when agents make reports nearly free, and why a withheld duplicate is a contribution.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../openclaw-triage-pipeline/index.md&#34; &gt;The Bot Reads the Queue First: How OpenClaw Processes Thousands of Issues and Pull Requests&lt;/a&gt; - what changes when a machine reads the issue queue before any human does.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../say-it-once/index.md&#34; &gt;Say It Once: How to Delegate Tasks to Agents Without Supervision&lt;/a&gt; - how standing conventions like &amp;ldquo;search duplicates first&amp;rdquo; get encoded so agents act on them unprompted.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/iterating-on-agent-skills/&#34; &gt;Iterating on Agent Skills: The Loop That Keeps Them Improving&lt;/a&gt; - where an instruction like duplicate-first comes from, and the loop that keeps a skill correct after it ships.&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://github.com/openchamber/openchamber/issues/3880&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber issue #3880&lt;/a&gt; - the Chinese-language report my agent matched, including the reporter&amp;rsquo;s own investigation of the failing save.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Micromanagement Doesn&#39;t Scale, for People or for Agents</title>
      <link>https://tomrochette.com/micromanagement-doesnt-scale-for-people-or-for-agents/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/micromanagement-doesnt-scale-for-people-or-for-agents/</guid>
      <category>ai</category><category>llm</category><category>ai-agents</category><category>management</category><category>micromanagement</category><category>delegation</category><category>scaling</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Watch someone run an LLM agent for the first time and you will often see a familiar figure: the manager who initials every form.&#xA;Management science named that figure decades ago, identified the failure, and defined the fix, and all of that work still applies now that the workers are agents.&#xA;&lt;strong&gt;Micromanagement does not scale, and the worker it fails first is the agent.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Same Behavior in Two Bodies&#xA;    &lt;div id=&#34;the-same-behavior-in-two-bodies&#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-behavior-in-two-bodies&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Micromanagement&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Micromanagement&lt;/a&gt; is the management pattern where the supervisor keeps decision rights over small steps instead of delegating outcomes and constraints.&#xA;On a human team you recognize it instantly: the manager who approves every purchase, sits in every meeting, and rewrites every email before it ships.&#xA;With agents you recognize it just as fast: the operator who approves every tool call, watches the output stream live, interrupts to argue about which file to read, and rewrites the plan twice before the first task finishes.&#xA;The behaviors map one to one across the two worlds:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Micromanaged employee&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Micromanaged agent&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Approves every expense, however small&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Approves every tool call&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Sits in on every meeting&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Watches the output stream live&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Rewrites every email before it ships&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Corrects the plan mid-run&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Demands a check-in before each step&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Permission prompt on every command&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Redoes the work at their own desk&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Aborts the run and does it by hand&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;The mapping is not a loose analogy.&lt;/strong&gt;&#xA;In both cases one person decides every small step before it happens, which is a statement about workflow structure, not about trust.&#xA;Anything true of that workflow for humans stays true when the executor is a model.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Arithmetic Kills It First&#xA;    &lt;div id=&#34;the-arithmetic-kills-it-first&#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-arithmetic-kills-it-first&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Management&amp;rsquo;s own term for the limit is &lt;a href=&#34;https://en.wikipedia.org/wiki/Span_of_control&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;span of control&lt;/a&gt;: the number of reports one manager can effectively supervise.&#xA;The limit exists because a supervisor&amp;rsquo;s attention is a fixed budget, and every decision escalated to the supervisor spends some of that budget.&#xA;Step-level delegation makes the team&amp;rsquo;s throughput equal to the supervisor&amp;rsquo;s evaluation throughput, since every step now waits on one person.&lt;/p&gt;&#xA;&lt;p&gt;Agents make the arithmetic harsher.&#xA;One agent in a normal working hour issues on the order of two hundred small decisions in my sessions: which file to open, which command to run, whether a result is good enough to build on.&#xA;A human evaluates meaningfully at one or two decisions per minute, and the quality of those evaluations collapses long before the count runs out.&#xA;&lt;strong&gt;Step-level supervision has a span of control below one agent: you cannot fully micromanage even a single one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The two supervision styles diverge as soon as more than one agent runs:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Line chart: approval-gating demands roughly 200 judgment calls per agent-hour and crosses a human&amp;rsquo;s sustainable rate of about 100 per hour at half of one agent, while outcome review at 4 calls per agent-hour stays under the line even at ten parallel agents&#34;&#xA;    src=&#34;https://tomrochette.com/micromanagement-doesnt-scale-for-people-or-for-agents/images/judgment-load.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;The fatigue has a known endpoint.&#xA;Once approval prompts become more than attention can handle, people stop reading the prompts and start clicking allow, and step-level supervision ends in the failure of approving without reading, which &lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; works out in queue-math form.&lt;/p&gt;&#xA;&lt;p&gt;The economics fail alongside the arithmetic.&#xA;&lt;strong&gt;An approval-gated agent runs at your evaluation speed, not the model&amp;rsquo;s, so you gained machine-speed execution and then limited it to human speed.&lt;/strong&gt;&#xA;The reason to hire an agent was to break the link between your attention and the work&amp;rsquo;s progress.&#xA;Step-gating restores the link at every tool call.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;It Also Corrodes What It Touches&#xA;    &lt;div id=&#34;it-also-corrodes-what-it-touches&#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;#it-also-corrodes-what-it-touches&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Throughput is only the first cost.&#xA;Micromanaged employees show the classic &lt;a href=&#34;https://en.wikipedia.org/wiki/Learned_helplessness&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;learned helplessness&lt;/a&gt; pattern: initiative collapses, problems stay hidden until they become impossible to hide, and judgment never develops because it never gets exercised.&#xA;The manager pays too: never observing unassisted results, the manager cannot learn which reports handle which autonomy, so the manager&amp;rsquo;s distrust is not based on any evidence.&lt;/p&gt;&#xA;&lt;p&gt;Agents repeat all of that, at higher frequency.&#xA;Constant interruption disrupts the agent&amp;rsquo;s context, output quality drops, and the quality drop seems to justify even closer supervision.&#xA;An operator hurt by mid-run questions starts specifying work in tiny increments, which guarantees the agent never runs long enough to produce a reviewable outcome.&#xA;I caught myself doing exactly that after one bad run, restricting the agent until it could barely fetch a file, and the restriction felt like diligence the whole time.&#xA;And the operator never builds the one calibration that matters: which task types, which models, and which risk levels can run alone.&#xA;&lt;strong&gt;That calibration is the core skill of working with agents, and it can only form from watching end-to-end outcomes, the exact observations micromanagement prevents.&lt;/strong&gt;&#xA;Micromanagement keeps the one activity that does not scale, per-step evaluation, and neglects the two that do, the worker&amp;rsquo;s initiative and the supervisor&amp;rsquo;s calibration.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Smart People Do It Anyway&#xA;    &lt;div id=&#34;why-smart-people-do-it-anyway&#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;#why-smart-people-do-it-anyway&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The justifications transfer intact.&#xA;The worker is unproven: the new hire has no track record yet, and neither does the model you have never run on this task type.&#xA;A past failure weighs on the decision: the intern who dropped a production table, the agent that once deleted the wrong directory.&#xA;The credit asymmetry points the same way: catching a small error early is visible credit, while an outcome failure arrives late and is blamed on you, so close supervision is individually rational at every moment even though it is collectively ruinous.&lt;/p&gt;&#xA;&lt;p&gt;The deepest cause is unfinished specification.&#xA;When the supervisor can state what finished work looks like, steps are safe to delegate, because the check exists at the end.&#xA;When the supervisor cannot state it, steps are the only thing left to inspect.&#xA;&lt;strong&gt;Most micromanagement is not a trust problem with the report; it is a missing definition of done on the supervisor&amp;rsquo;s side.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Scales in Both Worlds&#xA;    &lt;div id=&#34;what-scales-in-both-worlds&#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-scales-in-both-worlds&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fix is decades old and applies without changes.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Management_by_objectives&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Management by objectives&lt;/a&gt; says define the outcome and the constraints, then let the report choose the steps; for an agent, that is the specification and the acceptance criteria, ideally the tests.&#xA;Verify at boundaries instead of continuously: milestones for people, the pull request for agents.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Situational_leadership_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Situational leadership&lt;/a&gt; says match supervision to demonstrated maturity, directing at first and delegating later.&#xA;Agents deserve the same schedule: a new model on a new task type gets a tight loop, a proven pattern on a reversible task gets autonomy.&#xA;Make autonomy affordable by scoping the blast radius: the unproven report gets the cheap, reversible work, and the agent gets the sandbox and the throwaway branch, so a failure costs a review cycle instead of an incident.&#xA;Then reinvest the freed supervision hours into the specification, which is the act that multiplies rather than the act that caps.&lt;/p&gt;&#xA;&lt;p&gt;Every item on that list was worked out on human teams, at human speeds, over decades of trial and error.&#xA;Agents run the same experiment with faster workers and cheaper failures.&#xA;&lt;strong&gt;A group of agents is the cheapest management simulator ever built, and its first lesson is the oldest one: govern outcomes, not steps.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;But My People Are Not Experts&#xA;    &lt;div id=&#34;but-my-people-are-not-experts&#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;#but-my-people-are-not-experts&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fix in the last section rests on delegation, and the first objection is always the same: the team is not staffed with world experts, just regular developers, and regular developers make mistakes.&#xA;Agents make more of them.&#xA;The objection is legitimate, and it still does not justify step-level control, because the step-level trade fails on its own arithmetic.&lt;/p&gt;&#xA;&lt;p&gt;Start with what delegation actually assumes.&#xA;&lt;strong&gt;Delegation does not assume competence; it is the only way to observe it.&lt;/strong&gt;&#xA;Span of control and situational leadership were worked out for ordinary people, and ordinary people make mistakes.&#xA;A supervisor who never lets a regular developer run alone never learns what that developer can handle, so the supervision level never moves off maximum, and the cycle continues despite good intentions.&lt;/p&gt;&#xA;&lt;p&gt;Then move the safety mechanism from the person to the system.&#xA;&lt;strong&gt;Step-watching is one way to catch mistakes, and the most expensive one ever tried.&lt;/strong&gt;&#xA;Boundaries catch them for a fraction of the cost: tests, small pull requests, staging.&#xA;Blast-radius limits make the ones that slip through reversible: feature flags, sandbox, rollback.&#xA;Every mistake that recurs becomes a gate, which catches that class forever without spending supervisor attention.&#xA;The gates compound; the watching never does.&lt;/p&gt;&#xA;&lt;p&gt;When a mistake lands anyway, recalibrate instead of escalating.&#xA;Classify the failure: a one-off gets absorbed, a knowledge gap gets training, a pattern gets encoded as a check.&#xA;Then autonomy returns to where it was, because the system now catches that class instead of you.&#xA;Blanket step-control after every failure is how one bad day becomes a permanent surveillance regime.&lt;/p&gt;&#xA;&lt;p&gt;Run the numbers and the objection collapses.&#xA;Suppose step-watching catches twice as many mistakes as boundary review at fifty times the cost.&#xA;The trade collapses your span of control and manufactures learned helplessness, which raises the mistake rate it was meant to suppress.&#xA;&lt;strong&gt;Boundary review wins even when it is worse per mistake, because you can afford to run it forever and improve it every week.&lt;/strong&gt;&#xA;The imperfect model gets the same answer: its mistakes justify tests, a sandbox, small reversible tasks, and promoting every observed failure class into a gate, never approval on every tool call.&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;p&gt;Count your interventions on your next agent run.&#xA;Past a handful, the interruptions mark missing specification, not a failing agent, and each one belongs in the next prompt or the skill file (&lt;a href=&#34;../say-it-once/index.md&#34; &gt;Say It Once&lt;/a&gt; covers the conversion).&lt;/p&gt;&#xA;&lt;p&gt;Write the acceptance criteria before you launch anything.&#xA;Every impulse to watch closely converts into a check: the test you would have eyeballed, the log line you would have watched, the property of the diff you would have scanned for.&lt;/p&gt;&#xA;&lt;p&gt;Give one low-stakes task a fully unsupervised run and grade the outcome.&#xA;That grade is your first calibration point, and calibration points are how you widen autonomy without guilt.&lt;/p&gt;&#xA;&lt;p&gt;Widen autonomy the way you would with a junior: task type by task type, on evidence, never on faith.&#xA;The manager who cannot say which reports run alone has been micromanaging, and the operator who cannot say which tasks run alone is in the same place.&#xA;&lt;strong&gt;Micromanagement is not a personality quirk, it is a supervision policy, and it stops working the moment the worker outproduces the supervisor&amp;rsquo;s judgment.&lt;/strong&gt;&#xA;Your agents reached that threshold on day one.&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;../say-it-once/index.md&#34; &gt;Say It Once&lt;/a&gt; - the workflow conversion this article implies: turn each interruption into pre-written specification&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../outcome-driven-development/index.md&#34; &gt;Outcome-Driven Development&lt;/a&gt; - the positive program in full: manage the outcome, not the agent&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - the same one-human capacity limit, worked out as queue math on the review queue&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-yourself-horizontally/&#34; &gt;Scaling Yourself Horizontally&lt;/a&gt; - the general law underneath: attention does not scale, leverage does&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../the-colleague-who-arrives-with-the-plan/index.md&#34; &gt;The Colleague Who Arrives With the Plan&lt;/a&gt; - the same control instinct applied to plans instead of steps, and why it keeps getting rewarded&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://en.wikipedia.org/wiki/Micromanagement&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Micromanagement&lt;/a&gt; - the named pattern and its documented costs on human teams&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Span_of_control&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Span of control&lt;/a&gt; - the classical limit on how many reports one manager can supervise&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Management_by_objectives&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Management by objectives&lt;/a&gt; - Drucker&amp;rsquo;s delegate-outcomes framing, the human-team version of spec plus acceptance criteria&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Situational_leadership_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Situational leadership theory&lt;/a&gt; - matching supervision level to the maturity of the report&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Learned_helplessness&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Learned helplessness&lt;/a&gt; - what step-level control teaches the worker over time&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How Much Attention Does This Pull Request Deserve?</title>
      <link>https://tomrochette.com/how-much-attention-does-this-pull-request-deserve/</link>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/how-much-attention-does-this-pull-request-deserve/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>pull-request</category><category>agents</category><category>llm</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Agents on my machines now review every pull request that asks for my attention, and they produce more review than I can read.&#xA;That inverts the old problem: review used to be the scarce resource, and now the scarce resource is me.&#xA;Most agentic reviews end in a single verdict, approved or rejected, and a single verdict throws away the two things I need in order to decide what to do next.&#xA;&lt;strong&gt;Every agentic review should end with two scores, one for risk and one for confidence, because the question is never &amp;ldquo;is this pull request good&amp;rdquo; but &amp;ldquo;how much of my attention does it deserve&amp;rdquo;.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;One verdict answers two different questions&#xA;    &lt;div id=&#34;one-verdict-answers-two-different-questions&#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;#one-verdict-answers-two-different-questions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When an agent review ends in a bare verdict, the verdict hides as much as it reveals.&#xA;&amp;ldquo;Approved&amp;rdquo; can mean &amp;ldquo;I checked everything and found nothing&amp;rdquo;, or it can mean &amp;ldquo;I glanced at the diff and found nothing&amp;rdquo;, and those are very different claims.&#xA;The fix is to split the judgment in two.&#xA;&lt;strong&gt;Risk is a judgment about the change: how much damage it does if it is wrong, and how hard it is to undo.&lt;/strong&gt;&#xA;&lt;strong&gt;Confidence is a judgment about the review itself: how much of the risk judgment depends on evidence rather than on hope.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The two scores combine into a routing decision that neither score can give alone.&#xA;A low-risk change with low confidence deserves a cheap second look, not a merge.&#xA;A high-risk change with high confidence deserves a human reading the named risk drivers, not an automatic approval.&#xA;And a high-risk change with low confidence is the dangerous case: the review is saying &amp;ldquo;this could hurt us, and I could not check much of it&amp;rdquo;, which deserves the strongest default.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Risk scores the change&#xA;    &lt;div id=&#34;risk-scores-the-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;#risk-scores-the-change&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;My &lt;a href=&#34;https://github.com/tomzx/agents/tree/main/skills&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;risk rubric&lt;/a&gt;, part of my agent skill library, scores seven factors, each Low, Medium, or High.&#xA;Blast radius asks who calls the changed code, and whether the effect crosses package boundaries.&#xA;Public interface asks whether the change breaks or removes a contract that other code depends on.&#xA;Security sensitivity asks whether it touches authentication, authorization, cryptography, secrets, or input validation.&#xA;Reversibility asks whether a revert undoes it, or whether it is a migration with no way back.&#xA;Operational exposure asks whether the changed behavior sits on a hot path or behind a flag.&#xA;Coverage gap asks whether tests cover the changed behavior.&#xA;Churn asks how often the touched files changed in the past year, a cheap proxy for fragility.&lt;/p&gt;&#xA;&lt;p&gt;Two rules keep the scores grounded.&#xA;Every score above Low must cite file and line evidence, so a suspicion the agent did not confirm does not count.&#xA;Every High score must name the concrete failure it makes expensive, and if the agent cannot name one, the score comes down to Medium with an explanation.&#xA;The rollup is deliberately blunt: any High factor makes the change High risk, two or more Medium factors make it Medium, and everything else is Low.&#xA;&lt;strong&gt;The bluntness is a feature, because the goal is not a precise number, it is a defensible triage call.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Confidence scores the evidence&#xA;    &lt;div id=&#34;confidence-scores-the-evidence&#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;#confidence-scores-the-evidence&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Confidence is not the reviewer&amp;rsquo;s subjective impression of its own work, it is an audit of what the review could actually verify.&#xA;My rubric counts six evidence points: a current validation report, a current verification report, runtime proof of its must-have criteria, a current code-craft review, a linked issue that states the intent, and a diff small enough to have been read in full.&#xA;The caps matter as much as the points.&#xA;No linked issue caps confidence at Medium, because there is nothing to check the change against.&#xA;Verification that never ran the code caps confidence at Medium, because reading is not proof.&#xA;A diff of a thousand lines or more caps confidence at Medium, and the report must say which areas were sampled rather than read.&lt;/p&gt;&#xA;&lt;p&gt;The sentence I require most in the report names what would raise confidence.&#xA;&amp;ldquo;Running the verification skill would add two points&amp;rdquo; turns the score from a vague judgment into a list of concrete actions.&#xA;Because the scores are pinned to a commit, the assessment can be re-run when the evidence arrives, and the same pull request climbs from Low to High confidence without anyone re-arguing the risk.&#xA;&lt;strong&gt;Confidence is not a number you state once, it is a number that should rise as evidence arrives.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The routing table turns scores into attention&#xA;    &lt;div id=&#34;the-routing-table-turns-scores-into-attention&#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-routing-table-turns-scores-into-attention&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The two scores route each pull request to one of six verdicts: fast-track, confirm, investigate, decide, block, and hold.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;A three by three grid with risk as rows and confidence as columns, where each cell names the next action: investigate, confirm, fast-track, decide, hold, or block&#34;&#xA;    src=&#34;https://tomrochette.com/how-much-attention-does-this-pull-request-deserve/images/routing-matrix.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;fast-track means I owe the change minutes: merge once checks pass.&#xA;confirm means pay for one cheap review first, then fast-track.&#xA;investigate means the evidence is too thin to route on, so run the full review pipeline and score again.&#xA;decide is the interesting middle: the risk is Medium but the evidence is strong, so I read the named drivers and choose with findings in hand.&#xA;block and hold are the expensive verdicts: the drivers must be resolved, or the change is treated as high risk until proven otherwise.&lt;/p&gt;&#xA;&lt;p&gt;Each verdict names its next action, and that is what assigns a cost to attention.&#xA;A queue of forty pull requests becomes a triage sheet: fast-tracks to clear immediately, a hold to schedule an evening for, and one decide to actually think about.&#xA;&lt;strong&gt;The scores do not review the code, they decide where the scarce reviewer hours go.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The score routes the human, never the pipeline&#xA;    &lt;div id=&#34;the-score-routes-the-human-never-the-pipeline&#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-score-routes-the-human-never-the-pipeline&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The verdicts never gate the agent pipeline.&#xA;A block verdict does not halt the chain of validation, verification, and craft review, and the chain never halts the risk assessment, which runs concurrently so the triage signal exists before the deep review finishes.&#xA;The scores are advisory on purpose: the pipeline&amp;rsquo;s job is to produce evidence, the human&amp;rsquo;s job is to spend attention, and combining those jobs is how automation starts overruling people quietly.&#xA;The verdict travels in a machine-readable marker pinned to the commit, so my orchestrator displays the risk and confidence columns without parsing a word of prose.&lt;/p&gt;&#xA;&lt;p&gt;The same design is what makes the system scale.&#xA;One script discovers every pull request across every repository that asks for my review, a fan-out gives one agent session to each pull request, and the orchestrator session collects a summary table for triage.&#xA;The agents burn tokens, which are cheap, and I spend attention, which is not.&#xA;&lt;strong&gt;Everything that can be mechanical is pushed to the machines, and what reaches me is a short list of decisions that cannot be.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What it looks like in practice&#xA;    &lt;div id=&#34;what-it-looks-like-in-practice&#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-it-looks-like-in-practice&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Three illustrative scenarios, the same ones I use as worked examples in the skill itself, show the range.&#xA;A small internal fix, covered by tests, in files that change once a year: every risk factor Low, but no pipeline reports exist yet, so confidence is Medium and the verdict is confirm, one cheap review then merge.&#xA;An authentication change with the full pipeline behind it: security sensitivity High, but runtime proof of every must-have criterion, so confidence is High and the verdict is block until the named session-invalidation gap is fixed.&#xA;A 1200-line billing migration with no linked issue: reversibility and coverage both High, confidence Low and capped, so the verdict is hold, and the same pull request re-scores to decide once the full review completes.&#xA;&lt;strong&gt;Same rubric, three very different amounts of reviewer time.&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;p&gt;If you run agent reviews, force every review to end with both scores, not one verdict.&#xA;A five-minute rubric beats a bare approval: three risk factors and three evidence points are enough to start.&#xA;Ban unverifiable confidence language: if the score cannot cite the evidence behind it, it is not a score.&#xA;Make every verdict name its next action, so the queue reads as a budget rather than a pile.&#xA;And track the mis-routings, because a fast-tracked pull request that burns your evening is calibration data, and the rubric should get stricter wherever it fails.&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;../a-pull-request-is-a-claim-not-evidence/index.md&#34; &gt;A Pull Request Is a Claim, Not Evidence&lt;/a&gt; - confidence scoring is the systematic answer to a claim that arrives without evidence attached.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/abandoning-code-review-in-the-age-of-agents/&#34; &gt;Abandoning Code Review in the Age of Agents&lt;/a&gt; - the throughput argument for why human attention, not review, is the constraint to manage.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/developer-trust-profiles/&#34; &gt;Developer Trust Profiles: Earned Scrutiny for Automated Code Review&lt;/a&gt; - varies scrutiny by the author&amp;rsquo;s track record, as risk scores vary it by the change itself.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; - the attention asymmetry that makes explicit scoring necessary in human review too.&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://github.com/tomzx/agents/tree/main/skills&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents skill library&lt;/a&gt; - where the assess-pr-risk rubric behind this article lives, alongside the two skills below.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-pr-full/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-pr-full skill&lt;/a&gt; - how the risk assessment runs concurrently with the review chain without gating it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-requested-prs/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-requested-prs skill&lt;/a&gt; - the fan-out that turns per-pull-request scores into a portfolio triage view.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My Agentic Schedule</title>
      <link>https://tomrochette.com/my-agentic-schedule/</link>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/my-agentic-schedule/</guid>
      <category>ai</category><category>software-engineering</category><category>agents</category><category>llm</category><category>automation</category><category>code-review</category><category>ci</category><category>pull-request</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Three skills run on my machines every hour, whether I am working or not.&#xA;One prepares the review of every pull request waiting on me, one repairs the failing CI on my own pull requests, and one drafts my replies to reviewer comments.&#xA;Each one is a skill file that fans out agents to do the reading, wired to a scheduler, and I have stopped doing the corresponding work by hand.&#xA;&lt;strong&gt;The schedule is what turned them from tools I have to remember to use into infrastructure that works while I am away, and it reduced my part of the job to reading prepared options and deciding.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The trigger is the missing piece&#xA;    &lt;div id=&#34;the-trigger-is-the-missing-piece&#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-trigger-is-the-missing-piece&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;An interactive agent session starts when I remember to start it.&#xA;That ordering makes the work depend on me, and it makes me the one component in the system that can forget.&#xA;&lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; makes the point generically: a skill with no trigger leaves the human as the trigger.&#xA;These three loops are my way of making the scheduler the trigger instead of me.&lt;/p&gt;&#xA;&lt;p&gt;The waiting is the other problem.&#xA;An interactive session is synchronous: I trigger it, then I sit there while it reads, runs, and reports.&#xA;A single analysis takes between 2 and 15 minutes depending on its complexity, and triggering them one at a time would spend my day waiting.&#xA;The scheduled runs are asynchronous: they prepare the information a decision needs while I am away, and the decision is the only part left that happens with me in the room.&#xA;&lt;strong&gt;One benefit of the workflows is that the information for a decision is ready when I sit down, instead of arriving only after I trigger an agent and wait for its output.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A schedule, rather than GitHub events, is a deliberate choice.&#xA;Most pull requests I touch live in repositories I do not control, so I cannot install workflows, webhooks, or bots there.&#xA;A local scheduler is the one trigger I own everywhere.&#xA;Hourly is the cadence that works: fast enough that queues never build up overnight, slow enough that each run is cheap and usually finds nothing new to do.&#xA;(The triage loop could safely run every fifteen minutes; hourly keeps the three aligned.)&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The three hourly runs&#xA;    &lt;div id=&#34;the-three-hourly-runs&#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-three-hourly-runs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;All three run from my &lt;a href=&#34;https://github.com/tomzx/agents/tree/main/skills&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agent skill library&lt;/a&gt;, each as a markdown skill file plus a small deterministic discovery script.&#xA;The skills are reusable by hand at any time; the schedule is just what keeps them from depending on my memory.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Preparing other people&amp;rsquo;s code reviews&#xA;    &lt;div id=&#34;preparing-other-peoples-code-reviews&#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;#preparing-other-peoples-code-reviews&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The first run (&lt;code&gt;review-requested-prs&lt;/code&gt;) prepares the pull requests waiting on my review, where I am the requested reviewer or already have.&#xA;A script lists them all, then checks which review steps are already done for each pull request&amp;rsquo;s current commit, because every finished step leaves a report keyed to the commit SHA.&#xA;The run dispatches only the stale steps, one agent per pull request, running up to five checks: risk assessment, test-coverage analysis, product validation, conformance verification, and code-craft review.&#xA;The agents run in parallel, so a slow build on one pull request never delays the others.&#xA;When I sit down to review, the verdicts and findings are already there, computed against the exact commit I am about to look at.&#xA;&lt;strong&gt;The run does not approve anything; it does the reading so my part of the review starts at the decision.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Keeping my own CI green&#xA;    &lt;div id=&#34;keeping-my-own-ci-green&#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;#keeping-my-own-ci-green&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The second run (&lt;code&gt;handle-failing-pr-ci&lt;/code&gt;) lists my open pull requests and their combined CI status.&#xA;Every pull request with failing checks gets its own agent in its own &lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;git worktree&lt;/a&gt;, so concurrent fixes never collide.&#xA;The agent reads the failing logs, diagnoses the root cause, pushes the smallest fix that addresses it, and watches the checks settle.&#xA;The autonomy is bounded: the agent reruns transient failures, returns an unclear root cause to me as a written diagnosis instead of a guess, and stops after two failed fix attempts.&#xA;&lt;strong&gt;My pull requests arrive green, or they arrive with an explanation of why they are not.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Drafting my replies to reviewer comments&#xA;    &lt;div id=&#34;drafting-my-replies-to-reviewer-comments&#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;#drafting-my-replies-to-reviewer-comments&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The third run (&lt;code&gt;triage-pr-feedback&lt;/code&gt;) scans the pull requests I authored for reviewer comments still awaiting a response.&#xA;For each pull request with new comments, a read-only agent checks out the pull request head and writes one recommendation file per comment: what the reviewer is asking, whether the claim holds against the code with file and line evidence, whether to implement or decline, how confident the analysis is, and a draft reply in my voice.&#xA;State is one file per comment id, so a re-run only processes genuinely new feedback and never re-analyzes something I already decided.&#xA;I read the resulting decision table, choose implement, decline, or defer, and only then does an executor skill post replies or push changes.&#xA;&lt;strong&gt;Nothing reaches GitHub from this loop without my decision.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The pipeline they share&#xA;    &lt;div id=&#34;the-pipeline-they-share&#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-pipeline-they-share&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The three runs look different from the outside, but they are the same pipeline with three different sets of labels.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Flowchart of the shared hourly pipeline: a clock fans into three lanes, each running discovery script, one agent per pull request, and an output, all converging on a decision node labeled Me&#34;&#xA;    src=&#34;https://tomrochette.com/my-agentic-schedule/images/hourly-pipeline.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;Four properties make the pipeline safe to leave running.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Discovery is deterministic.&lt;/strong&gt;&#xA;A script, not a model, decides what needs work and what is already done.&#xA;Discovery runs on every tick, so mistakes there compound, and judgment belongs in the per-item agents instead.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Work is fanned out one agent per pull request.&lt;/strong&gt;&#xA;Each pull request gets its own agent, its own worktree, and its own failure domain, so a slow or broken run stays contained.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;State is stored in files, not in an agent&amp;rsquo;s memory.&lt;/strong&gt;&#xA;Verdict reports keyed to commit SHAs and one file per comment id mean a re-run is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Idempotence&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;no-op&lt;/a&gt; unless something changed.&#xA;That is the property that keeps an hourly cadence inexpensive.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write access is bounded and layered.&lt;/strong&gt;&#xA;The triage loop never writes to GitHub at all; it produces recommendation files.&#xA;The review loop writes only step markers, so a later run knows which checks are done.&#xA;The CI loop pushes, with pre-approval scoped to the smallest fix and explicit abort conditions that route back to me.&#xA;Merging and replying stay mine.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What changed in practice&#xA;    &lt;div id=&#34;what-changed-in-practice&#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-changed-in-practice&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Review stopped being interrupt-driven: prepared material is ready before I start, and I pick the moment to start.&#xA;The schedule is the batching &lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; argues for, minus the fixed timetable.&#xA;CI failures stopped interrupting me because an agent picks them up within the hour, and I hear about one only when its diagnosis needs a human.&#xA;Replying to reviewer comments became choosing between prepared options, which takes minutes instead of a context switch per thread.&lt;/p&gt;&#xA;&lt;p&gt;The costs show up anyway.&#xA;Skills drift as repositories and CI systems change under them, so the library needs tending.&#xA;Correlated errors are possible: all three runs share one skill library, so one bad edit degrades all of them at once.&#xA;And preparation is not judgment, which is why the risk-and-confidence routing from &lt;a href=&#34;https://tomrochette.com/how-much-attention-does-this-pull-request-deserve/&#34; &gt;How Much Attention Does This Pull Request Deserve?&lt;/a&gt; matters once the agents produce more review than I can read.&#xA;&lt;strong&gt;Every loop is designed so the taste decision (merge this, decline that) stays with me.&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;p&gt;Pick the queue you check most often; for most engineers that is pull requests or CI.&#xA;Encode the discovery as a script: what needs work, and for each item, what is already done.&#xA;Wrap the per-item work in a skill that one agent can run alone.&#xA;Fan out one agent per item and write per-item state so re-runs are no-ops.&#xA;Then schedule it, read-only first.&#xA;Add write access last, scoped, with abort conditions that route back to you.&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;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; - the argument that the trigger layer deserves the same treatment as the prompt layer; these three loops are my concrete loops&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/llm-augmented-workflows/&#34; &gt;LLM-Augmented Workflows&lt;/a&gt; - the event-driven engine for repositories I do control; the hourly schedule covers the ones I do not&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - the queue math that says review must batch; the schedule is the batching mechanism&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/how-much-attention-does-this-pull-request-deserve/&#34; &gt;How Much Attention Does This Pull Request Deserve?&lt;/a&gt; - the risk and confidence scores the review-preparation run produces&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - checking agent work at fixed intervals instead of watching it; the production version of that habit&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-yourself-horizontally/&#34; &gt;Scaling Yourself Horizontally&lt;/a&gt; - the leverage argument for systems that act in your absence, which is what a schedule provides&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/continuous-research/&#34; &gt;Continuous Research&lt;/a&gt; - the same scheduled-agent pattern applied to knowledge instead of pull requests&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://en.wikipedia.org/wiki/Cron&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Cron&amp;rdquo;&lt;/a&gt; - the time-based scheduler these loops run on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Idempotence&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Idempotence&amp;rdquo;&lt;/a&gt; - the property that makes hourly re-runs quiet instead of expensive&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Git, &amp;ldquo;git-worktree&amp;rdquo;&lt;/a&gt; - the isolation mechanism that lets one agent per pull request work concurrently&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <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><category>llm=deepseek-v4.1-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 it delivers 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 generates unneeded pull requests continuously.&#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 clear 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, the end of a project.&#xA;That framing is what keeps dead repositories alive, because nobody wants to declare a project finished.&#xA;When I finally ran this pass over my own fleet, most of the repositories went straight to the archive, and the guilt I felt 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 actual 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 is 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 ranked below the top 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 place.&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 goes unnoticed 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 uses 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, how often, 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>
    
    <item>
      <title>Nine Months of LLM Agents on Large Projects</title>
      <link>https://tomrochette.com/nine-months-of-llm-agents-on-large-projects/</link>
      <pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/nine-months-of-llm-agents-on-large-projects/</guid>
      <category>ai</category><category>llm</category><category>ai-agents</category><category>software-engineering</category><category>workflow</category><category>large-projects</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Over the past nine months I have run LLM agents against the largest projects I have ever worked on alone: the open source tools I use and maintain daily, and the automated pipeline that publishes part of this blog.&#xA;The models kept improving the whole time, and the improvements helped less than I expected.&#xA;&lt;strong&gt;What actually helped was learning to handle four challenges: providing the right context, iterating through non-obvious design decisions, managing the scale of the work, and keeping artifacts consistent while decisions change.&lt;/strong&gt;&#xA;None of the four is about getting a model to write better code.&#xA;All four decide whether the code the model writes turns into a finished project.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What the nine months covered&#xA;    &lt;div id=&#34;what-the-nine-months-covered&#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-the-nine-months-covered&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;GitHub shows the scale better than my memory does: since January I have contributed 1,338 commits across 51 repositories, along with 66 pull requests and 181 issues.&#xA;By mid September, 9 months in, the session counter read 3,400 sessions, 82,000 messages, and 6.8 billion tokens, 6.5 billion of them served from cache, spread across 63 projects and 33 models, on a path that had moved from Claude Sonnet 4.5 to GLM 5.3 Flash.&#xA;The volume is not the point.&#xA;The point is that the same four challenges appeared in every project, and how I answered them changed more than any model upgrade did.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Challenge 1: Providing the Right Context&#xA;    &lt;div id=&#34;challenge-1-providing-the-right-context&#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;#challenge-1-providing-the-right-context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Nine months ago my working assumption was that a capable agent would gather whatever it needed by exploring the repository.&#xA;On a small project, that assumption holds.&#xA;On a large one, it fails quietly: a session is generally scoped to a single location, one repository or directory, and a large project rarely fits inside one, so each session sees a narrow slice of the project, and cannot see the knowledge outside that slice.&#xA;The cost showed up as steering time.&#xA;I would launch a session, come back, and find it had built on a wrong assumption, then spend the next half hour correcting the session.&#xA;Worse, the corrections sometimes left the written context inconsistent, one artifact updated while the artifacts that depend on it stayed stale, and later sessions inherited the contradiction as ground truth.&#xA;&lt;strong&gt;On a large project, under-provisioned context does not just slow one session down, it causes errors in the sessions that follow.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;What I do now is treat context provisioning as a phase with an exit condition, not a chore.&#xA;Access first: every source the answers live in gets a way in and a pointer, which is the setup I described in &lt;a href=&#34;../teach-your-agent-where-everything-lives/index.md&#34; &gt;Teach Your Agent Where Everything Lives&lt;/a&gt;.&#xA;Then the map: which repositories exist, how they relate, where decisions live, written down so a cold session can orient in minutes.&#xA;&lt;strong&gt;The exit condition: a cold session, dropped into the project with only its instructions file, can find every source it needs without asking me.&lt;/strong&gt;&#xA;I test it by giving the session a question whose answer I know is in one of the mapped sources, and provisioning is done when it comes back with the answer and the trail instead of a question.&#xA;The underlying principle is the one I keep applying, that &lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;context quality dominates model choice&lt;/a&gt;.&#xA;&lt;strong&gt;Every session I launch inherits the preparation, and every session I under-provision costs steering time.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Challenge 2: Iterating Through Non-Obvious Design Decisions&#xA;    &lt;div id=&#34;challenge-2-iterating-through-non-obvious-design-decisions&#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;#challenge-2-iterating-through-non-obvious-design-decisions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The decisions that cause large projects to fail are rarely the ones I can state up front.&#xA;They are the non-obvious ones: how two modules should share a data format, what happens when a change is abandoned halfway through, whether a behavior belongs in a shared library or in the calling code.&#xA;I cannot list those in a prompt, and an agent cannot discover them from the code alone, because half of them are not written down anywhere.&lt;/p&gt;&#xA;&lt;p&gt;What I do now is iterate.&#xA;Before any implementation session launches, I work with an agent to understand the current codebase and describe the changes we need to make, and we go back and forth until most open questions are resolved.&#xA;The agent is a design partner, not a typist: it restates my description, catches the cases I overlooked, and proposes the alternatives I did not consider.&#xA;&lt;strong&gt;The exit condition is simple: when the questions the implementing agent would ask have already been asked and answered, the design conversation is done.&lt;/strong&gt;&#xA;Answering a design question in conversation costs minutes.&#xA;Answering it mid-implementation costs a stalled session, a wrong branch, or a refactor, and the stalls compound on every long run.&#xA;This is the principle behind &lt;a href=&#34;../say-it-once/index.md&#34; &gt;Say It Once&lt;/a&gt;, that every question an agent would ask mid-run should be answered before the run, applied one phase earlier: not just the standing rules, but the design itself.&lt;/p&gt;&#xA;&lt;p&gt;Here is the loop as it runs today, from first contact with the codebase to the moment parallel sessions can safely start:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    A[Explore the current codebase with an agent] --&amp;gt; B[Describe the change]&#xA;    B --&amp;gt; C{Open questions remain?}&#xA;    C --&amp;gt;|yes| D[Agent questions assumptions and proposes alternatives]&#xA;    D --&amp;gt; B&#xA;    C --&amp;gt;|no| E[Write decisions into the artifact tree]&#xA;    E --&amp;gt; F[Seed requirements and specs per feature]&#xA;    F --&amp;gt; G[Stand up the verification environment]&#xA;    G --&amp;gt; H[Partition the work and launch parallel sessions]&lt;/pre&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Challenge 3: Managing the Scale of the Work&#xA;    &lt;div id=&#34;challenge-3-managing-the-scale-of-the-work&#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;#challenge-3-managing-the-scale-of-the-work&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A large project carries more work than one session can absorb, and more than I can supervise.&#xA;On the most feature-heavy project I have run through my pipeline, &lt;a href=&#34;../three-gaps-my-sdlc-pipeline-hit-on-a-machine-learning-platform/index.md&#34; &gt;the features outnumbered my attention within weeks&lt;/a&gt;: creating a directory per feature was cheap, walking each one through design personally was not.&#xA;The answer is delegation and parallelism, but both have to be earned.&#xA;&lt;a href=&#34;https://tomrochette.com/speeding-up-llm-work-on-a-single-codebase/&#34; &gt;Parallel sessions collide&lt;/a&gt; unless the work is partitioned along natural seams, and the seams only become visible through the design iteration of the previous section.&lt;/p&gt;&#xA;&lt;p&gt;The preparation is what makes scale manageable.&#xA;Each feature keeps its own artifact directory, seeded before any implementation session starts.&#xA;Owning agents take features as far as they can and stop at the gates that need a human decision.&#xA;Sessions get their own worktrees, so parallel work never conflicts.&#xA;Tasks that share a file serialize; everything else runs in parallel.&#xA;&lt;strong&gt;Parallelism is earned at partition time, not at spawn time.&lt;/strong&gt;&#xA;Spawning ten sessions on an unpartitioned codebase produces ten incomplete features and a merge conflict.&#xA;Spawning ten sessions along the seams the design conversation exposed produces a project.&lt;/p&gt;&#xA;&lt;p&gt;The other half of scale is me.&#xA;With a dozen sessions running, I become the bottleneck unless decisions are batched and gates are explicit, which is the supervision problem I worked through in &lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Challenge 4: Keeping Artifacts Consistent While Decisions Change&#xA;    &lt;div id=&#34;challenge-4-keeping-artifacts-consistent-while-decisions-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;#challenge-4-keeping-artifacts-consistent-while-decisions-change&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The final challenge never stops.&#xA;On a project with dozens of interlocking features, decisions keep changing, and every change propagates.&#xA;A revision to one feature&amp;rsquo;s specification forces updates in the requirements and plans of the features that consume what it produces.&#xA;A session forked last week works from a snapshot that the sessions around it have already moved past.&lt;/p&gt;&#xA;&lt;p&gt;Nine months ago I treated consistency as something to check at review time.&#xA;Review time is too late: the stale artifacts have already fed other sessions by then.&#xA;What I do now comes in two layers.&#xA;Artifacts declare what they depend on, so the propagation has a map, and a propagation pass follows the map when an artifact changes, updating dependents or raising questions where a decision is needed.&#xA;I worked out that mechanism in detail in &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;.&#xA;Verification environments catch whatever the map misses: an hour spent making the environment catch the inconsistency beats an hour reading diffs hoping to see it, which is the trade I laid out in &lt;a href=&#34;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow&lt;/a&gt;.&#xA;&lt;strong&gt;Consistency on a large project is not a milestone you reach, it is a loop you run, and only a machine can run it at the frequency the project changes.&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;Before launching implementation, run the design loop with an agent until the open questions are resolved, and write the answers where the implementing sessions will read them.&lt;/li&gt;&#xA;&lt;li&gt;Treat context provisioning as a phase with an exit condition: access, map, pointers.&lt;/li&gt;&#xA;&lt;li&gt;Seed the artifact tree per feature before the first implementation session starts.&lt;/li&gt;&#xA;&lt;li&gt;Partition along the seams the design work exposed, isolate with worktrees, and serialize whatever shares a file.&lt;/li&gt;&#xA;&lt;li&gt;Add dependency declarations and a propagation pass so artifact consistency is maintained by loop, not by review.&lt;/li&gt;&#xA;&lt;li&gt;Watch your steering time: if you correct sessions more than you review them, the context was under-provisioned.&lt;/li&gt;&#xA;&lt;/ol&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;../three-gaps-my-sdlc-pipeline-hit-on-a-machine-learning-platform/index.md&#34; &gt;Three Gaps My SDLC Pipeline Hit on a Machine Learning Platform&lt;/a&gt; - the failures that produced the scale and consistency challenges&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 pull-request-node version of the artifact graph and propagation pass described in Challenge 4&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/speeding-up-llm-work-on-a-single-codebase/&#34; &gt;Speeding Up LLM Work on a Single Codebase&lt;/a&gt; - the parallelism mechanics this article summarizes, in full detail&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../say-it-once/index.md&#34; &gt;Say It Once&lt;/a&gt; - standing rules that replace mid-run questions, the runtime twin of the design loop&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow&lt;/a&gt; - where the skills and verification environments come from&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/six-months-with-openchamber/&#34; &gt;Six Months with OpenChamber&lt;/a&gt; - the tooling that made running thousands of agent sessions practical&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the supervision side of scale&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - the principle underneath the first challenge&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://metr.org/blog/2025-03-19-measuring-ai-ability-to-complete-long-tasks/&#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=metr.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;METR, &amp;ldquo;Measuring AI Ability to Complete Long Software Tasks&amp;rdquo;&lt;/a&gt; - the reliability gap on long tasks that makes preparation and verification mandatory&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents&#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=www.anthropic.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Anthropic, &amp;ldquo;Effective Context Engineering for AI Agents&amp;rdquo;&lt;/a&gt; - attention budgets and just-in-time retrieval, the theory behind the context phase&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;git worktree&lt;/a&gt; - the isolation mechanism behind the parallel sessions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What Needs Updating When Agents Do the Work</title>
      <link>https://tomrochette.com/what-needs-updating-when-agents-do-the-work/</link>
      <pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-needs-updating-when-agents-do-the-work/</guid>
      <category>ai</category><category>llm</category><category>agents</category><category>software-engineering</category><category>code-review</category><category>workflow</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;When an agent pushes a code change, the change itself is the fastest thing in the pipeline.&#xA;The PR title and description written before the second revision, the review comments nobody answered, and the red CI run all become outdated and inconsistent with the code.&#xA;&lt;strong&gt;Agentic work does not end when the code is written, it ends when a change has propagated through the graph of records in both directions.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Push Is Never Final&#xA;    &lt;div id=&#34;the-push-is-never-final&#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-push-is-never-final&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In human-paced development, a push was a statement of completion.&#xA;The author finished the work, wrote the PR title and description last, and pushed once.&#xA;The PR title and description were accurate because they were written after the code settled.&lt;/p&gt;&#xA;&lt;p&gt;Agentic development breaks that ordering.&#xA;An agent pushes a first draft, receives feedback, addresses it, and pushes again.&#xA;Then it rebases, fixes a failing test, and pushes again.&#xA;Each push improves the code and invalidates the records describing the previous version.&#xA;&lt;strong&gt;The diff updates itself on every push, the PR title and description do not.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That asymmetry is the whole problem.&#xA;After three iterations, a pull request can contain correct code and inaccurate records describing it.&#xA;The PR title and description explain a feature that no longer exists.&#xA;The comments hold questions the final code already answers.&#xA;The last CI run failed before the final fix landed, and nothing explains why the failure no longer matters.&#xA;Nothing in the code is broken, and everything around the code is stale.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A Graph of Artifacts, Not a Checklist&#xA;    &lt;div id=&#34;a-graph-of-artifacts-not-a-checklist&#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;#a-graph-of-artifacts-not-a-checklist&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;These stale records look like a checklist: walk the pull request and fix each one.&#xA;The checklist view fails because the records are not independent, each one was written from another.&#xA;The artifacts around a change form a directed acyclic graph.&#xA;The issue feeds the requirements, the requirements feed the specification, the specification feeds the code, and the code feeds the tests, the PR title and description, and the documentation, and no artifact feeds back into itself.&#xA;&lt;strong&gt;Each artifact should declare what it depends on, because the declarations are the map that a propagation pass follows.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here is the structure, with a change entering at the code node:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    ISSUE[Issue] --&amp;gt; REQ[Requirements]&#xA;    REQ --&amp;gt; SPEC[Specification]&#xA;    SPEC --&amp;gt; CODE[Code]&#xA;    CODE --&amp;gt; CI[Tests and CI]&#xA;    CODE --&amp;gt; DESC[PR title and description]&#xA;    CODE --&amp;gt; DOCS[Documentation]&#xA;    SPEC --&amp;gt; DESC&#xA;    X([A change lands in one artifact]) -. enters .-&amp;gt; CODE&#xA;    ISSUE &amp;lt;-.-&amp;gt; REQ&#xA;    REQ &amp;lt;-.-&amp;gt; SPEC&#xA;    SPEC &amp;lt;-.-&amp;gt; CODE&#xA;    CODE &amp;lt;-.-&amp;gt; CI&#xA;    CODE &amp;lt;-.-&amp;gt; DESC&#xA;    CODE &amp;lt;-.-&amp;gt; DOCS&#xA;    SPEC &amp;lt;-.-&amp;gt; DESC&lt;/pre&gt;&#xA;&lt;p&gt;Solid arrows are declared dependencies: an artifact is built from the artifacts its solid arrows come from.&#xA;Dotted double arrows are propagation, and they run along every edge in both directions.&#xA;Downward, a changed artifact updates its dependents: the PR title and description must be rewritten, the documentation must describe the new behavior, and the test expectations must assert it.&#xA;Upward, a changed artifact questions its premises: if the code had to deviate from the specification to work, the specification is now wrong, the requirements it satisfied are in doubt, and the issue behind them may be wrong too.&#xA;No matter where the change lands, the two walks visit every artifact the declared edges connect.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Propagation has to run in both directions, because each direction catches a different kind of staleness.&lt;/strong&gt;&#xA;Downward-only propagation keeps the record aligned with the change while leaving the premises unexamined, which produces a consistent account of the wrong decision.&#xA;Upward-only propagation questions everything and updates nothing.&#xA;An agent runs both walks mechanically: it follows the declared edges, applies every update whose resolution follows from the change, and raises a question wherever two connected artifacts disagree in a way that admits more than one resolution.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A single forward pass is the ideal &lt;a href=&#34;../say-it-once/index.md&#34; &gt;Say It Once&lt;/a&gt; argues for.&lt;/strong&gt;&#xA;The issue produces the requirements, the requirements produce the specification, the specification produces the code, and the code produces the rest, with every question answered before the next artifact starts.&#xA;In most cases, though, the forward pass cannot complete in a single iteration, because some gaps become visible only when a downstream artifact is produced.&#xA;Writing the code is how you learn the specification never said what happens when the input is empty.&#xA;Writing the documentation is how you learn that nobody decided what the feature is called.&#xA;&lt;strong&gt;Producing a downstream artifact is also a probe: it tests the artifacts before it, and every gap it finds sends the walk back upward.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Update Loop&#xA;    &lt;div id=&#34;the-update-loop&#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-update-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The loop below shows the graph operating at the pull request node, the place where every agent-authored change lands first.&#xA;Automated review reads the diff and produces feedback.&#xA;An agent addresses that feedback, with a human steering when judgment is needed.&#xA;The agent then brings the pull request back in sync: it replies to the review comments, handles the CI failures, and updates the PR title and description if the latest push made them outdated.&#xA;The documentation that describes the changed behavior is updated in the same pass.&#xA;Then review runs again.&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    A([Code change pushed]) --&amp;gt; B[Automated review and CI run]&#xA;    B --&amp;gt; C{Feedback or failures?}&#xA;    C --&amp;gt;|none| M([Ready to merge])&#xA;    C --&amp;gt;|yes| D[Agent addresses the feedback]&#xA;    HUMAN[Human feedback] -. steers .-&amp;gt; D&#xA;    D -. raises questions .-&amp;gt; HUMAN&#xA;    D --&amp;gt; U[Agent brings the PR back in sync]&#xA;    U --&amp;gt; F[Replies to PR comments]&#xA;    U --&amp;gt; G[Handles CI failures]&#xA;    U --&amp;gt; I[Updates the outdated PR title and description]&#xA;    U --&amp;gt; DOCS[Updates the documentation]&#xA;    F --&amp;gt; B&#xA;    G --&amp;gt; B&#xA;    I --&amp;gt; B&#xA;    DOCS --&amp;gt; B&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Every step in this loop has an owner, and the default owner is the agent.&lt;/strong&gt;&#xA;Assigning any step to a human by default re-serializes work the machine could finish in minutes, the same mistake made at pipeline scale when human review gates machine-rate output in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;.&#xA;The update loop runs several times per pull request, so any step handled by hand multiplies by the number of iterations, not the number of pull requests.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Three Update Jobs&#xA;    &lt;div id=&#34;the-three-update-jobs&#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-three-update-jobs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At the pull request node of the graph, the propagation pass takes the form of three jobs.&#xA;Documentation is a dependent of code too, and it is updated in the same pass, inside the same pull request as the code change.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Every comment gets a reply&#xA;    &lt;div id=&#34;every-comment-gets-a-reply&#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-comment-gets-a-reply&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;An unanswered review comment is ambiguous.&#xA;The reader cannot tell whether the agent missed it, disagreed with it, or resolved it silently in a later push.&#xA;The agent should reply to every comment with what it changed and why, including an explicit &amp;ldquo;declined, because&amp;rdquo; when it rejects a suggestion.&#xA;&lt;strong&gt;The reply is not politeness, it is what turns the thread into a record.&lt;/strong&gt;&#xA;A thread where every comment has an answer reads later as a decision log, and the human who scans it before merging reads conclusions instead of mysteries.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;A CI failure is input, not a verdict&#xA;    &lt;div id=&#34;a-ci-failure-is-input-not-a-verdict&#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;#a-ci-failure-is-input-not-a-verdict&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;For a human author, a red build is a judgment to react to.&#xA;For an agent, it is input to consume.&#xA;The agent reads the failure, fixes the code, reruns the suite, and pushes.&#xA;The loop continues without a human ever opening the log.&#xA;Escalation stays reserved for the cases that need a decision: the same failure returning across pushes, a flaky test worth deleting, or a fix that changes behavior the specification did not authorize.&#xA;&lt;strong&gt;A CI failure routed to a human queue is a decision the pipeline did not make.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The PR title and description follow the code&#xA;    &lt;div id=&#34;the-pr-title-and-description-follow-the-code&#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-pr-title-and-description-follow-the-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The PR description is written when the pull request opens, which means it describes draft one.&#xA;The title goes stale the same way: it names the purpose the change opened with, and the purpose may have moved by the third revision.&#xA;By the time the code merges, both can be documents about a version that no longer exists.&#xA;The agent should rewrite the description after significant revisions, and update the title whenever the purpose of the change moved, so both always describe the current diff: what changed, why, and which suggestions were rejected and why.&#xA;&lt;strong&gt;A PR title and description state what the diff does, and an agent that stops updating them is asking the reader to audit the diff to find out.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the Human Fits&#xA;    &lt;div id=&#34;where-the-human-fits&#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;#where-the-human-fits&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The human feedback in the loop enters as steering, not as typing.&#xA;The human does not write the replies, fix the builds, or reword the PR titles and descriptions.&#xA;The human reviews the agent&amp;rsquo;s proposed resolutions and decides the contested suggestions.&#xA;The human also ends disagreements, because an agent arguing with an automated reviewer can cycle forever, and only a human can decide the outcome.&#xA;And the human answers what propagation cannot settle: an update either follows from the change or it does not, and when it does not, the upward walk stops and hands the human a decision instead of a diff.&#xA;&lt;strong&gt;The human&amp;rsquo;s job is not to answer the comments, it is to decide what the answers mean.&lt;/strong&gt;&#xA;Attention spent typing replies is attention not spent steering, and steering is the part of the loop a machine cannot do, which is the same division of labor argued in &lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I run this loop on my own work.&#xA;When I open one of my agent&amp;rsquo;s pull requests, the threads are answered, the failures are explained, and the PR title and description match the diff.&#xA;The judgment calls are still mine, which is exactly where my attention is worth the most.&lt;/p&gt;&#xA;&lt;p&gt;The division also has an upstream payoff.&#xA;When review feedback keeps revealing the same misunderstanding, the fix is not a better reply, it is a better specification, and the human is the only one positioned to write it.&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;Make &amp;ldquo;reply to every review comment&amp;rdquo; a standing rule in your agent&amp;rsquo;s instructions, with an explicit declined-and-why format for rejected suggestions.&lt;/li&gt;&#xA;&lt;li&gt;Have an agent handle PR feedback asynchronously: when a piece of feedback lands, it is already addressed by the time you look, and your part is to immediately pick the action to take instead of manually triggering an agent to address it.&lt;/li&gt;&#xA;&lt;li&gt;Route CI failures to the agent before they reach a human, and escalate to you only on repeat failures or ambiguous fixes.&lt;/li&gt;&#xA;&lt;li&gt;Add a PR title and description refresh as a required step before every re-review request and before merging, so both always match the latest diff.&lt;/li&gt;&#xA;&lt;li&gt;Declare the dependencies between your artifacts: which issue a requirements document answers, which requirements a specification satisfies, which specification a change implements, which code a PR title and description describe. Propagation without a map is guesswork.&lt;/li&gt;&#xA;&lt;li&gt;After every change, run the propagation pass in both directions: update what depends on the change, and re-check what the change depends on.&lt;/li&gt;&#xA;&lt;li&gt;Watch the loop for livelock: when the same feedback returns twice, stop the agents and make the design call yourself.&lt;/li&gt;&#xA;&lt;li&gt;Audit the artifact graph occasionally: check whether every artifact still matches what it depends on, across issue, requirements, specification, code, tests, PR title and description, and documentation, and treat the mismatch rate as the measure of how much of this loop you are still running by hand.&lt;/li&gt;&#xA;&lt;/ol&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;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the argument that verification moved from human reading to automated gates, the context that makes an agent-owned update loop necessary.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/abandoning-code-review-in-the-age-of-agents/&#34; &gt;Abandoning Code Review in the Age of Agents&lt;/a&gt; - reason 11, that review comments no longer land anywhere, is the record half of the gap this loop closes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../say-it-once/index.md&#34; &gt;Say It Once&lt;/a&gt; - the same principle applied around a run: answer the questions before the run, and answer every comment once, in the thread, after it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/nine-months-of-llm-agents-on-large-projects/&#34; &gt;Nine Months of LLM Agents on Large Projects&lt;/a&gt; - the project-scale version of the artifact graph, where artifacts declare dependencies and a propagation pass follows the map when one changes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - why acceptance, not review, is the gate between an agent and production, and where the human in this loop should spend attention.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow&lt;/a&gt; - where the skills and verification environments that automate this loop come from.&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/copilot/concepts/agents/cloud-agent/about-cloud-agent&#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, &amp;ldquo;About GitHub Copilot cloud agent&amp;rdquo;&lt;/a&gt; - evidence that agent-driven changes with iterate-through-review cycles are shipped product behavior, not a personal experiment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What a Senior Engineer Owes Their Reviewer</title>
      <link>https://tomrochette.com/what-a-senior-engineer-owes-their-reviewer/</link>
      <pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-a-senior-engineer-owes-their-reviewer/</guid>
      <category>software-engineering</category><category>code-review</category><category>pull-requests</category><category>processes</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;When a senior engineer opens a pull request, not reconstruct what it does.&#xA;&lt;strong&gt;The standard is that everything that did not require a second person is already done before the review request goes out.&lt;/strong&gt;&#xA;CI is green, the diff is small and single-purpose, the description explains the change, the author has already read their own diff, and the proof that it works is in the PR.&#xA;Anything less quietly converts review time into discovery time, and discovery is the most expensive way to use a reviewer.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Standard Expectations&#xA;    &lt;div id=&#34;the-standard-expectations&#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-standard-expectations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Setting aside the argument, here is what a reviewer can assume when a senior engineer opens a PR:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CI is green on the latest commit.&lt;/li&gt;&#xA;&lt;li&gt;The diff does one thing; refactors and behavior changes live in their own PRs.&lt;/li&gt;&#xA;&lt;li&gt;Stray logs, commented-out code, and unrelated reformatting are gone.&lt;/li&gt;&#xA;&lt;li&gt;The author has read the full diff as if seeing it for the first time and annotated the lines that need context.&lt;/li&gt;&#xA;&lt;li&gt;The description answers what changed, why, and how it was tested, and points at where to look closely and what is out of scope.&lt;/li&gt;&#xA;&lt;li&gt;Proof that it works is in the PR: tests for new behavior, plus written manual verification when tests are impractical.&lt;/li&gt;&#xA;&lt;li&gt;The requested reviewers own the subsystem you are touching, not whoever is idle.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Each of these assumptions a reviewer has to re-verify by hand is attention taken away from judging the change.&lt;/strong&gt;&#xA;When one of them breaks, the reasonable response is not a comment, it is returning the PR to draft.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cost of a Round Trip&#xA;    &lt;div id=&#34;the-cost-of-a-round-trip&#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-cost-of-a-round-trip&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The unit of waste in review is the round trip: the author requests review, the reviewer finds a gap, comments, and the change then sits in a queue until both people are free at the same time again.&#xA;One round trip costs four context switches, two per side, plus a wait for the other person&amp;rsquo;s next open slot.&#xA;The reviewer switches out of their own work to read the diff and back into it after commenting, and the author later switches out of their work to address the comment and back into it after pushing the fix.&#xA;Because each switch means rebuilding the mental state you had before the interruption, a gap the author could have closed in minutes costs days of calendar time.&#xA;&lt;strong&gt;Every expectation in the standard above exists to delete one class of round trip.&lt;/strong&gt;&#xA;A green build deletes the &amp;ldquo;your build is broken&amp;rdquo; loop, a single-purpose diff deletes the &amp;ldquo;split this up&amp;rdquo; loop, an annotated self-review deletes the &amp;ldquo;what is this line for&amp;rdquo; loop, and actual proof deletes the most expensive loop of all, &amp;ldquo;your tests do not cover this&amp;rdquo;, which costs a test rewrite plus a full second pass.&#xA;Research on actual reviews backs the self-review obligation: in industrial code review, most comments ask for improvements and clarifications rather than catching actual defects (&lt;a href=&#34;https://www.microsoft.com/en-us/research/publication/expectations-outcomes-and-challenges-of-modern-code-review/&#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=www.microsoft.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Bacchelli and Bird, 2013&lt;/a&gt;), and Google&amp;rsquo;s study of its own process treats small, fast changes as the mechanism that keeps review load sustainable (&lt;a href=&#34;https://research.google/pubs/modern-code-review-a-case-study-at-google/&#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=research.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sadowski et al., 2018&lt;/a&gt;).&#xA;&lt;strong&gt;Review latency is mostly queueing, not judging, and the standard is how you keep the queue from growing.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Handoff Contract&#xA;    &lt;div id=&#34;the-handoff-contract&#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-handoff-contract&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Review is a handoff, and a handoff has two sides.&#xA;The author&amp;rsquo;s side is logistics: prove the change works, make it easy to read, explain why it exists.&#xA;The reviewer&amp;rsquo;s side is judgment: design, correctness, and whether the code will still make sense in a year.&#xA;When the author skips their half, the reviewer inherits it.&#xA;&lt;strong&gt;A PR that forces the reviewer to reconstruct the intent is a PR that was opened too early.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The division of work looks like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    subgraph Author[&amp;#34;Author, before opening&amp;#34;]&#xA;        A1[CI green]&#xA;        A2[Self-review done]&#xA;        A3[Description written]&#xA;        A4[Proof of testing]&#xA;        A5[Small single-purpose diff]&#xA;    end&#xA;    A1 --&amp;gt; O[Open PR]&#xA;    A2 --&amp;gt; O&#xA;    A3 --&amp;gt; O&#xA;    A4 --&amp;gt; O&#xA;    A5 --&amp;gt; O&#xA;    O --&amp;gt; R[&amp;#34;Reviewer: judgment only&amp;lt;br/&amp;gt;design, correctness, maintainability&amp;#34;]&lt;/pre&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Small, Single-Purpose Diffs&#xA;    &lt;div id=&#34;small-single-purpose-diffs&#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;#small-single-purpose-diffs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The highest-leverage habit is also the dullest one: keep the diff small.&#xA;&lt;a href=&#34;https://google.github.io/eng-practices/review/developer/small-cls.html&#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=google.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google&amp;rsquo;s engineering practices&lt;/a&gt; make the case from experience, small changes get reviewed faster and more thoroughly, and reviewers miss fewer defects.&#xA;Size is not the only variable though, purpose is.&#xA;&lt;strong&gt;A senior engineer separates refactoring from behavior changes, because a diff that does two things forces the reviewer to review both at once and catch neither.&lt;/strong&gt;&#xA;If a PR needs a live walkthrough before anyone can understand it, that is usually a sign it should be several separate PRs.&lt;/p&gt;&#xA;&lt;p&gt;There are legitimate exceptions, a generated-code migration or a mechanical rename can be large and still easy to review.&#xA;What distinguishes a senior engineer is knowing which kind of large diff they have, and saying so in the description.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Self-Review Before Anyone Else Reviews&#xA;    &lt;div id=&#34;self-review-before-anyone-else-reviews&#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;#self-review-before-anyone-else-reviews&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before requesting review, the author reads their own diff on the same screen the reviewer will use, the Files Changed tab, end to end.&#xA;This pass has two jobs.&#xA;The first is debris removal: stray logs, commented-out code, leftover debugging, unrelated reformatting that inflates the diff.&#xA;The second is annotation: leaving comments on the lines that need context, &amp;ldquo;this mirrors the logic above&amp;rdquo;, &amp;ldquo;this limit matches the upstream API&amp;rdquo;, so the reviewer does not have to ask.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Self-review is also where a senior engineer catches the embarrassing stuff, and catching it yourself is the whole point of being senior.&lt;/strong&gt;&#xA;Every defect the author removes before the review is a round trip that never happened.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A Description That Answers the Obvious Questions&#xA;    &lt;div id=&#34;a-description-that-answers-the-obvious-questions&#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;#a-description-that-answers-the-obvious-questions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The description exists so the reviewer never has to ask questions the author could have answered in writing.&#xA;The questions are predictable:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What does this change do, and why is it needed?&lt;/li&gt;&#xA;&lt;li&gt;How was it tested?&lt;/li&gt;&#xA;&lt;li&gt;What should the reviewer look at most closely?&lt;/li&gt;&#xA;&lt;li&gt;What is deliberately out of scope?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Screenshots for UI changes, before-and-after output for behavior changes, and a link to the ticket all belong here.&#xA;&lt;strong&gt;The ticket link is a pointer, not a description.&lt;/strong&gt;&#xA;A reviewer who has to read the ticket to know what the PR does has been given work to do instead of a review request.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Proof That It Works&#xA;    &lt;div id=&#34;proof-that-it-works&#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;#proof-that-it-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The author&amp;rsquo;s job is to demonstrate the change works, not to believe it works.&#xA;That means tests for new behavior, updated tests for changed behavior, and a written note on manual verification when tests are impractical (&amp;ldquo;ran the migration against a copy of staging, 4.2M rows, 90 seconds&amp;rdquo;).&#xA;I put this in the description under &amp;ldquo;How I tested this&amp;rdquo;.&#xA;The reviewer&amp;rsquo;s job is then to audit the proof: are the tests actual assertions or tautologies, do they cover the failure modes, is the manual claim plausible.&#xA;&lt;strong&gt;An author who ships &amp;ldquo;seems to work&amp;rdquo; is asking the reviewer to do QA on a hunch, and most reviewers respond to that with a request for changes.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;After You Open It&#xA;    &lt;div id=&#34;after-you-open-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;#after-you-open-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The standard does not end when the PR is opened.&lt;/strong&gt;&#xA;Watch CI and fix failures immediately; a PR with a red build is blocking a reviewer for nothing.&#xA;Respond to comments within a day, even if the answer is &amp;ldquo;I&amp;rsquo;ll get to this Thursday&amp;rdquo;.&#xA;Push fixes as commits so the reviewer can see what changed since their last pass, and say when the PR is ready for a re-review.&#xA;When a comment thread passes about twenty back-and-forths, take it to a call and write the conclusion back into the PR.&#xA;And when you disagree with a reviewer, either convince them, accept the change, or escalate; a senior engineer does not leave a PR stuck in a stalemate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When You Cannot Meet the Standard Yet&#xA;    &lt;div id=&#34;when-you-cannot-meet-the-standard-yet&#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;#when-you-cannot-meet-the-standard-yet&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The standard has legitimate exceptions, and seniority shows in running the exception protocol instead of quietly lowering the standard.&#xA;Sometimes the approach is still unsettled, sometimes a change cannot be split cleanly, and sometimes you need early feedback to avoid building the wrong thing for a week.&#xA;Each case has a protocol that keeps discovery on the author&amp;rsquo;s side of the handoff:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;The approach is unsettled:&lt;/strong&gt; settle it in a short design note or issue before writing code; a paragraph of prose resolves an approach faster than three rounds of review comments on code that will be thrown away.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;You need early feedback:&lt;/strong&gt; open the PR as a draft and name the exact question and the lines that answer it, for example &amp;ldquo;design feedback on the cache interface only, ignore the internals&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The diff is unavoidably large:&lt;/strong&gt; stack it, base each PR on the previous one, and keep every PR in the stack single-purpose so the reviewer can approve them in order.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    Q{&amp;#34;Cannot meet the&amp;lt;br/&amp;gt;standard yet?&amp;#34;} --&amp;gt;|&amp;#34;Approach unsettled&amp;#34;| D[&amp;#34;Design note or issue&amp;lt;br/&amp;gt;settle the approach first&amp;#34;]&#xA;    Q --&amp;gt;|&amp;#34;Early feedback needed&amp;#34;| E[&amp;#34;Draft PR&amp;lt;br/&amp;gt;name the question and the lines to read&amp;#34;]&#xA;    Q --&amp;gt;|&amp;#34;Diff too large&amp;#34;| S[&amp;#34;Stacked PRs&amp;lt;br/&amp;gt;each one single-purpose&amp;#34;]&#xA;    D --&amp;gt; R[&amp;#34;Then open a PR&amp;lt;br/&amp;gt;that meets the standard&amp;#34;]&#xA;    E --&amp;gt; R&#xA;    S --&amp;gt; R&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;The difference between a draft and a premature PR is that the draft tells the reviewer what to look at, and what to ignore.&lt;/strong&gt;&#xA;&amp;ldquo;Is this the right approach?&amp;rdquo; is a question a reviewer can answer in five minutes.&#xA;&amp;ldquo;What is this PR doing?&amp;rdquo; is a request to do the author&amp;rsquo;s work.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Make the Standard the Default&#xA;    &lt;div id=&#34;make-the-standard-the-default&#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;#make-the-standard-the-default&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;None of the seven expectations should depend on memory, because memory fails on exactly the days the standard matters most, the rushed ones.&#xA;Encode it once and let the system enforce it:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A PR template with the four description questions already written out.&lt;/li&gt;&#xA;&lt;li&gt;Format and lint gates in CI, so reformatting changes never reach a human-reviewed diff.&lt;/li&gt;&#xA;&lt;li&gt;A draft-first habit: every PR starts as a draft and only moves to ready when the checklist passes.&lt;/li&gt;&#xA;&lt;li&gt;Reviewer assignment by code ownership, so requests route to the subsystem&amp;rsquo;s owners instead of whoever is idle.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;There is a quieter reason a senior engineer maintains this standard.&#xA;&lt;strong&gt;A senior engineer&amp;rsquo;s PRs are the template the rest of the team copies, because people calibrate to what actually gets merged, not to what a wiki says.&lt;/strong&gt;&#xA;The first time the team watches its most senior member ship a rushed PR to quick approvals, the written standard stops being followed.&#xA;If you want to change how a team reviews, change what its most visible engineers ship.&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;p&gt;Before you click &amp;ldquo;Request review&amp;rdquo; next time, walk the seven expectations in the list above one last time, in order.&#xA;Then go a step further and audit your last three merged PRs: find the expectation you break most often under deadline pressure, and encode it once, as a template line, a CI gate, or a personal checklist item.&#xA;A standard you re-derive from memory every time will weaken; a standard encoded in the system keeps working even in your worst week.&#xA;None of this requires talent.&#xA;&lt;strong&gt;It is the difference between treating review as a service you consume and a contract you enter, and seniority is mostly about honoring that contract.&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;https://tomrochette.com/processes/reviewing-code/&#34; &gt;Reviewing code&lt;/a&gt; - the reviewer-side counterpart of this piece&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What to Do When the Team Is Too Small and Hiring Is Frozen</title>
      <link>https://tomrochette.com/what-to-do-when-the-team-is-too-small-and-hiring-is-frozen/</link>
      <pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-to-do-when-the-team-is-too-small-and-hiring-is-frozen/</guid>
      <category>software-engineering</category><category>sre</category><category>on-call</category><category>reliability</category><category>teams</category><category>org-design</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A team of six engineers runs the on-call rotation for an entire system, and the request for more people goes nowhere.&#xA;The instinct is to treat this as a hiring problem and wait for management to fix it.&#xA;&lt;strong&gt;Hiring is the slowest and least controllable option you have, so the rotation has to get lighter first, and the case for headcount has to become a business case instead of a complaint.&lt;/strong&gt;&#xA;Here is what I would do in that position, in order.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Rotation Is a Relearning Machine&#xA;    &lt;div id=&#34;the-rotation-is-a-relearning-machine&#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-rotation-is-a-relearning-machine&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Start with the arithmetic of a six-person rotation.&#xA;Each engineer is primary once every six weeks and secondary once in the same window.&#xA;Every primary shift demands enough context to triage, mitigate, and escalate a failure anywhere in the system.&#xA;Between shifts, five weeks pass with little reason to touch the parts of the code you only see when they break.&#xA;Memory of unfamiliar subsystems decays in days, not months, so by the time your shift arrives you are substantially relearning the system.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When every shift requires remembering everything and the gaps between shifts let the memory rot, you have not designed a rotation, you have designed a scheduled relearning exercise.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://sre.google/sre-book/being-on-call/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google SRE book, &amp;ldquo;Being On-Call&amp;rdquo;&lt;/a&gt; states the standard explicitly: an on-call engineer should feel capable of swift, effective action, and high page load or long post-shift recovery is treated as a defect of the system design, not of the person.&#xA;The &lt;a href=&#34;https://sre.google/workbook/on-call/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SRE Workbook&amp;rsquo;s on-call chapter&lt;/a&gt; makes the same point operationally: burden has to be balanced, or the rotation quietly drives engineers to quit.&#xA;A six-person full-system rotation where nobody feels capable of acting is not a staffing failure yet, it is a design failure.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Count the Pain Before You Name the Cure&#xA;    &lt;div id=&#34;count-the-pain-before-you-name-the-cure&#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;#count-the-pain-before-you-name-the-cure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Instrument the pain first, because adjectives do not persuade management and you need the numbers for the later steps anyway.&#xA;Export four weeks of paging data and compute a handful of numbers:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pages per shift, split by primary and secondary, and by day versus night.&lt;/li&gt;&#xA;&lt;li&gt;The actionable ratio: the fraction of pages that required genuine human judgment rather than a restart, a throttle bump, or an acknowledgment and nothing.&lt;/li&gt;&#xA;&lt;li&gt;Time to mitigate, and specifically how long it took the responder to have enough context to act at all.&lt;/li&gt;&#xA;&lt;li&gt;Repeat incidents: the same failure mode paging more than once.&lt;/li&gt;&#xA;&lt;li&gt;Re-entry ramp: how long it took each engineer to be fully productive on their normal work after coming off a shift.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Most teams that run this exercise discover that half or more of their pages were noise, and that the re-entry ramp after every shift costs a day or more of productive work per engineer.&#xA;&lt;strong&gt;You cannot make a rotation lighter if you cannot say what it currently weighs.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Shrink the Load the System Puts on People&#xA;    &lt;div id=&#34;shrink-the-load-the-system-puts-on-people&#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;#shrink-the-load-the-system-puts-on-people&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;With the data in hand, reduce what pages and what a page demands.&lt;/p&gt;&#xA;&lt;p&gt;Apply the alerting standard from the &lt;a href=&#34;https://sre.google/workbook/alerting-on-slos/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SRE Workbook&amp;rsquo;s &amp;ldquo;Alerting on SLOs&amp;rdquo;&lt;/a&gt;: a page is for a user-visible symptom that needs human judgment right now.&#xA;Everything else becomes a ticket, a dashboard entry, or nothing.&#xA;The alert that fires twice a week and is always dismissed is not information, it is an alarm nobody heeds, and it is weakening the reflex you need at 3 a.m.&lt;/p&gt;&#xA;&lt;p&gt;For the pages that survive, write runbooks so the responder can act without tribal knowledge.&#xA;A page with a runbook is a procedure, and a procedure survives the five-week memory gap.&#xA;A page without one forces the responder to work it out from scratch, and that is what causes burnout on night shifts.&#xA;The &lt;a href=&#34;https://response.pagerduty.com/oncall/being_oncall/&#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=response.pagerduty.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PagerDuty Incident Response guide&amp;rsquo;s &amp;ldquo;Being On-Call&amp;rdquo;&lt;/a&gt; chapter treats runbooks and escalation paths as core equipment of the on-call, not nice-to-haves.&lt;/p&gt;&#xA;&lt;p&gt;Then standardize the machinery behind the alerts: one deployment path, one logging format, one dashboard layout per service.&#xA;&lt;strong&gt;Most of the weight of on-call is not the size of the system, it is the size of the system minus what is written down.&lt;/strong&gt;&#xA;You do not control headcount this quarter, but you control what is written down, and it compounds.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Split the Territory Instead of Stretching the People&#xA;    &lt;div id=&#34;split-the-territory-instead-of-stretching-the-people&#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;#split-the-territory-instead-of-stretching-the-people&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If six people cannot hold the whole system, stop asking six people to hold the whole system.&#xA;Partition ownership into two or three areas, by product surface or by subsystem, and rotate on-call within an area.&#xA;The primary for another area becomes the escalation target when a page turns out to cross boundaries, which the incident review will catch and correct.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Today, one shared rotation makes all six engineers cover eight services; proposed, two three-person rotations each cover four services, with cross-area escalation between them&#34;&#xA;    src=&#34;https://tomrochette.com/what-to-do-when-the-team-is-too-small-and-hiring-is-frozen/images/territory-split.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;em&gt;Figure 1: the split. Each area gets its own three-person rotation over half the services, and the other area&amp;rsquo;s primary is the escalation target.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;A three-person rotation puts the pager on each engineer every three weeks instead of every six, for half the system.&#xA;But there is a trade-off: each area develops less cross coverage than one shared pool.&#xA;You mitigate it by pairing the secondary from a neighboring area on big changes, and by rotating engineers between areas every few quarters so knowledge diffuses.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Pros and cons of on-call cadence: more frequent shifts keep context warm and make relearn small, but disrupt nights twice as often and shrink recovery; less frequent shifts protect project stretches and recovery, but every shift opens after five weeks of decay with a full relearn&#34;&#xA;    src=&#34;https://tomrochette.com/what-to-do-when-the-team-is-too-small-and-hiring-is-frozen/images/cadence-pros-cons.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;em&gt;Figure 2: the cadence trade-off side by side, and the deciding variable: how heavy a single shift is.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The reason the more frequent cadence is survivable is the one this article opened with: the pager arrives before your memory of the territory decays, and when it does arrive, the relearn covers four services instead of eight.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Context freshness chart: on a 6-week whole-system rotation, context decays below the action threshold after three weeks and every shift demands a full relearn of eight services; on a 3-week rotation over half the system, context is refreshed before it decays that far&#34;&#xA;    src=&#34;https://tomrochette.com/what-to-do-when-the-team-is-too-small-and-hiring-is-frozen/images/context-freshness.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;em&gt;Figure 3: context freshness across the rotation cycle. The 6-week whole-system cycle crosses the action threshold before every shift; the 3-week half-system cycle refreshes before that happens.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://teamtopologies.com/&#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=teamtopologies.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Team Topologies&lt;/a&gt; makes the underlying principle explicit: team cognitive load is the limit on what a group can own, so territory should be handed out in proportion to absorption capacity.&#xA;Six people whose absorption capacity covers half the system are not underperforming, they are correctly reporting the size of the system.&lt;/p&gt;&#xA;&lt;p&gt;There is a second benefit that matters for the hiring fight: if the system genuinely needs two rotations to be covered safely, you now have the strongest possible evidence for your headcount case, in the org&amp;rsquo;s own vocabulary.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Escalate as a Business Case, Not a Complaint&#xA;    &lt;div id=&#34;escalate-as-a-business-case-not-a-complaint&#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;#escalate-as-a-business-case-not-a-complaint&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Headcount requests fail as complaints and succeed as cost calculations.&#xA;Convert your measured pain into money: incident minutes multiplied by their revenue impact, engineer hours spent on re-entry ramps, and the replacement cost of an engineer who leaves, which &lt;a href=&#34;https://www.gallup.com/workplace/247391/fixable-problem-costs-businesses-trillion.aspx&#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=www.gallup.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gallup puts at half to two times annual salary&lt;/a&gt;.&#xA;Attrition is the number that gets attention, because a burned-out on-call engineer does not just handle pages badly, they take their context with them when they quit.&lt;/p&gt;&#xA;&lt;p&gt;Then present the ask as a trade-off management has to accept in writing, not a favor it has to grant.&#xA;With current staffing, one of three things happens: the team accepts a higher incident risk, the team accepts reduced coverage or slowed delivery, or the team gets help.&#xA;&lt;strong&gt;If management reads that page and still does nothing, the pain has been priced and accepted, and you should operate knowing that.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Operate knowing it means this: keep doing the work you unilaterally control, the alert pruning, the runbooks, the territory split, and decide for yourself how long the residual risk is worth absorbing with your own nights.&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;ul&gt;&#xA;&lt;li&gt;Export four weeks of paging data and compute the actionable ratio and re-entry cost.&lt;/li&gt;&#xA;&lt;li&gt;Delete or downgrade every alert that is not a user-visible symptom needing judgment now.&lt;/li&gt;&#xA;&lt;li&gt;Write a runbook for each of the top five recurring pages.&lt;/li&gt;&#xA;&lt;li&gt;Propose two or three ownership areas with a rotation per area, and run it as an experiment for one cycle.&lt;/li&gt;&#xA;&lt;li&gt;Put the one-page business case in front of management with an explicit accept-or-fix decision requested.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Headcount may well be the right answer eventually, but a rotation you made lighter and a case you made undeniable are the only two things you control this quarter.&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;https://tomrochette.com/code-factories-rollercoaster-tycoon/&#34; &gt;Code Factories: The RollerCoaster Tycoon Perspective&lt;/a&gt; - the patrol zone framing of giving an on-call engineer too many services to cover.&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 trying to personally hold every line is the fastest route to burnout.&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://sre.google/sre-book/being-on-call/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google SRE Book, &amp;ldquo;Being On-Call&amp;rdquo;&lt;/a&gt; - the standard that on-call quality is a designed property, including page load limits and post-shift recovery.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sre.google/workbook/on-call/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google SRE Workbook, &amp;ldquo;On-Call&amp;rdquo;&lt;/a&gt; - operational guidance on balancing on-call burden across a team.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sre.google/workbook/alerting-on-slos/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google SRE Workbook, &amp;ldquo;Alerting on SLOs&amp;rdquo;&lt;/a&gt; - the criteria for what deserves a page versus a ticket.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://response.pagerduty.com/oncall/being_oncall/&#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=response.pagerduty.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PagerDuty Incident Response, &amp;ldquo;Being On-Call&amp;rdquo;&lt;/a&gt; - runbooks, escalation paths, and preparation as core on-call equipment.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://teamtopologies.com/&#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=teamtopologies.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Skelton and Pais, &amp;ldquo;Team Topologies&amp;rdquo;&lt;/a&gt; - team cognitive load as the limit on how much territory a team can own.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.gallup.com/workplace/247391/fixable-problem-costs-businesses-trillion.aspx&#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=www.gallup.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gallup, &amp;ldquo;This Fixable Problem Costs U.S. Businesses $1 Trillion&amp;rdquo;&lt;/a&gt; - the half to two times salary figure for replacing an employee.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Abandoning Code Review in the Age of Agents</title>
      <link>https://tomrochette.com/abandoning-code-review-in-the-age-of-agents/</link>
      <pubDate>Sat, 12 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/abandoning-code-review-in-the-age-of-agents/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>agents</category><category>llm</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Code review is a human-speed step inside a pipeline that now runs at machine speed.&#xA;&lt;strong&gt;I have gathered every reason I can find to abandon it in the age of agentic software development, and together they are stronger than any argument for keeping it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I have argued pieces of this case before, in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; and &lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt;.&#xA;This article puts every reason in one place, grouped by where it comes from: throughput, cognition, reliability, sociology, and safety, plus the reasons no reform can rescue the practice.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What changed&#xA;    &lt;div id=&#34;what-changed&#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-changed&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A coding agent is not autocomplete.&#xA;Autocomplete typed faster, and the human still wrote the code.&#xA;An agent takes a ticket, plans, edits across files, runs the tests, and opens a pull request, and it can do that several times a day, in parallel with other agents doing the same.&#xA;&lt;strong&gt;When generation becomes a machine-rate activity, every human-rate step downstream becomes the constraint, and per-diff human approval is that step.&lt;/strong&gt;&#xA;Nothing else in the pipeline caps throughput the way review does.&#xA;The queue shows it: once you supervise enough agents, review items arrive faster than you can clear them, and the surplus waits on you.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The throughput reasons&#xA;    &lt;div id=&#34;the-throughput-reasons&#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-throughput-reasons&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. Agents parallelized generation, and review is still serial.&lt;/strong&gt;&#xA;An agent fleet works across worktrees at the same time.&#xA;Human review funnels all of that output through one reader at a time.&#xA;&lt;strong&gt;The step agents made parallel, review re-serializes.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. The queue math guarantees collapse.&lt;/strong&gt;&#xA;Review is a queue with an arrival rate and a service rate.&#xA;Agent output raises the arrival rate, and a human cannot raise the service rate by trying harder.&#xA;When arrivals exceed service, the queue grows without bound, and no amount of discipline fixes it (&lt;a href=&#34;https://tomrochette.com/you-cannot-out-review-a-machine-by-hand/&#34; &gt;You Cannot Out-Review a Machine by Hand&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. Review latency destroys the value of agent speed.&lt;/strong&gt;&#xA;An agent that finishes in twenty minutes and waits a day for approval delivers in a day and twenty minutes.&#xA;The machine idles at the one step that cannot speed up.&#xA;&lt;strong&gt;Buying speed at the generation stage and giving it back at the approval stage is paying twice for nothing.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;4. Review cost scales with output, and gate cost does not.&lt;/strong&gt;&#xA;Every human review costs time on every pull request, forever.&#xA;A check in CI is built once, maintained occasionally, and runs on every change in between.&#xA;&lt;strong&gt;The more the agents produce, the more that review costs, and the more a gate saves.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;5. Mandatory review converts machine failure into human exhaustion.&lt;/strong&gt;&#xA;A misconfigured agent can open hundreds of pull requests in an afternoon.&#xA;If every pull request needs a human, the agent&amp;rsquo;s failure mode consumes your entire week.&#xA;&lt;strong&gt;Rate-limit the pipeline, not the people reading it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;6. Human-in-the-loop approval pairs machine-rate generation with human-rate approval, and pays for both.&lt;/strong&gt;&#xA;All-human development was internally consistent: people wrote at human speed and approved at human speed, so the pipeline was slow but never mismatched.&#xA;Fully autonomous development is consistent too: machines generate and gates approve, end to end.&#xA;Mandatory human review joins the two: fast cheap generation upstream, slow expensive approval downstream.&#xA;The fast stage produces work that waits, and the slow stage spends senior attention clearing what waited.&#xA;&lt;strong&gt;You pay machine prices to produce and human prices to approve, and the pipeline still delivers at human pace.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The cognitive reasons&#xA;    &lt;div id=&#34;the-cognitive-reasons&#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-cognitive-reasons&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;7. Reviewing agent code is verification, not review.&lt;/strong&gt;&#xA;Review works when reviewer and author share a mental model, so the reviewer can build on the author&amp;rsquo;s reasoning and ask what they meant.&#xA;An agent has no intent to consult, so the reviewer reconstructs meaning line by line, alone.&#xA;&lt;strong&gt;That is not review; that is re-deriving the code from scratch with extra steps.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;8. Attention collapses exactly where agents guarantee volume.&lt;/strong&gt;&#xA;Studies of actual review practice put the useful band of a diff around two to four hundred changed lines, and effectiveness falls off sharply beyond it (&lt;a href=&#34;https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/&#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=smartbear.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SmartBear, &amp;ldquo;Best Kept Secrets of Peer Code Review&amp;rdquo;&lt;/a&gt;).&#xA;Agents produce volume, and volume guarantees you exceed the range where review stays effective.&#xA;The conditions that make review worth doing are the conditions agents make impossible.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;9. The diff is the wrong unit of correctness.&lt;/strong&gt;&#xA;Review inspects a slice of code.&#xA;Correctness is a property of the whole system: how the change behaves under load, against actual data, alongside the other changes landing the same hour.&#xA;Staging and load tests approximate a few of those properties; production is where all of them show up at once.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;10. Plausibility defeats skimming.&lt;/strong&gt;&#xA;Agent code is trained on human code, so it looks like code.&#xA;It has the conventional structure, the familiar names, the confident test coverage.&#xA;A human skim pattern-matches &amp;ldquo;looks fine&amp;rdquo; and moves on.&#xA;&lt;strong&gt;The better the model gets, the less a skim finds, because skimming works by noticing oddity, and agents are optimized to minimize oddity.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;11. Review comments no longer land anywhere.&lt;/strong&gt;&#xA;With human authors, a review comment taught the author, and the lesson compounded over years.&#xA;An agent does not carry the lesson out of the pull request.&#xA;The loop that actually teaches the system is the specification and the test suite, so the comment is a cost that teaches nothing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The reliability reasons&#xA;    &lt;div id=&#34;the-reliability-reasons&#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-reliability-reasons&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;12. Defect finding was never review&amp;rsquo;s actual output.&lt;/strong&gt;&#xA;When Microsoft studied its own review process, only about fifteen percent of review comments related to defects, and most of those were minor (&lt;a href=&#34;https://dblp.org/rec/conf/icse/CzerwonkaGT15.html&#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=dblp.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Czerwonka, Greiler, and Tilford, &amp;ldquo;Code Reviews Do Not Find Bugs&amp;rdquo;&lt;/a&gt;).&#xA;The bulk of the value developers reported was code improvement and awareness, not bug catching (&lt;a href=&#34;https://sback.it/publications/icse2013.pdf&#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=sback.it&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Bacchelli &amp;amp; Bird, &amp;ldquo;Expectations, Outcomes, and Challenges of Modern Code Review&amp;rdquo;&lt;/a&gt;).&#xA;&lt;strong&gt;The one thing review is famous for is the thing it does least.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;13. Review is a sample; a gate is a census.&lt;/strong&gt;&#xA;A human reads some of the lines, once, on a single day.&#xA;A check runs on every line, on every run, for as long as the codebase exists.&#xA;When review finds an issue, the fix is one pull request; when a gate catches a class of issue, the fix is permanent.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;14. A verdict that depends on the reviewer is not a verdict.&lt;/strong&gt;&#xA;The same diff gets approved at 9 a.m. and rejected at 5 p.m., approved by one lead and nitpicked by another.&#xA;CI gives the same answer every time.&#xA;&lt;strong&gt;Process decisions that matter should not depend on the reviewer&amp;rsquo;s alertness.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;15. The approve click produces the feeling of safety.&lt;/strong&gt;&#xA;Most approvals are decided by CI status, author reputation, diff size, and the description, before the code is read (&lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt;).&#xA;The signature certifies that a person was present, not that the code was examined.&#xA;&lt;strong&gt;Feeling safe and being checked are different things, and review delivers the first one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;16. Accountability theater allocates blame instead of preventing harm.&lt;/strong&gt;&#xA;The approving signature exists so that, after an incident, someone can be blamed.&#xA;In practice nobody blames the reviewer; they blame the author, the tests, or the process.&#xA;&lt;strong&gt;A mechanism whose output is blame allocation does not need to sit between your agents and production.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The sociology reasons&#xA;    &lt;div id=&#34;the-sociology-reasons&#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-sociology-reasons&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;17. The social benefits had a human on both ends, and now they do not.&lt;/strong&gt;&#xA;Mentoring juniors, building trust, sharing context, softening criticism: these justified review&amp;rsquo;s cost when two humans met at the diff.&#xA;An agent is not mentored by comments, does not build trust through diffs, and has no feelings to manage.&#xA;&lt;strong&gt;The functions that made review worth its cost had a human author as their subject, and the human author is gone.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;18. Review is where bikeshedding lives.&lt;/strong&gt;&#xA;Naming debates, brace placement, and abstraction preferences consume senior hours while the change waits.&#xA;When output is cheap to regenerate, nitpicking the diff is the wrong loop; improve the spec and regenerate instead.&#xA;Gates never have opinions about tabs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;19. Approval is a permission slip, and permission is the bottleneck.&lt;/strong&gt;&#xA;What review actually gates is not quality but permission to merge.&#xA;When agents can produce the change in minutes, the scarce resource is the approval.&#xA;&lt;strong&gt;Queueing the approval is pure overhead: nothing is learned there, and little is checked that CI could not check.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;20. Knowledge diffusion is the one genuine loss, and it has cheaper substitutes.&lt;/strong&gt;&#xA;Review did spread awareness of the codebase, and I count that as the strongest argument for keeping it.&#xA;But the same awareness comes from spec review, design review, ownership docs, and rotation, where people learn decisions instead of skimming one diff.&#xA;&lt;strong&gt;Buy knowledge where it is cheap; do not price it in approvals.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The safety reasons&#xA;    &lt;div id=&#34;the-safety-reasons&#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-safety-reasons&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;21. Production is the ground truth review pretends to be.&lt;/strong&gt;&#xA;Google&amp;rsquo;s SRE organization reports that 70% of outages are due to changes in a live system (&lt;a href=&#34;https://sre.google/sre-book/introduction/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google, &amp;ldquo;Site Reliability Engineering&amp;rdquo;&lt;/a&gt;).&#xA;Most of those are configuration, data, load, and integration effects that no diff-reader can see.&#xA;Canary deployments, feature flags, monitoring, and tested rollback observe the live system instead of predicting it.&#xA;&lt;strong&gt;A reviewer guesses; a canary measures.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;22. Reversibility beats pre-approval.&lt;/strong&gt;&#xA;Making changes hard to make is one way to stay safe; making them cheap to undo is another.&#xA;Small, independent, backward-compatible changes with tested rollback paths cap the damage of any single mistake, including mistakes no reviewer would have caught.&#xA;An undo button outperforms a gatekeeper.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;23. Skimming misses security; gates do not.&lt;/strong&gt;&#xA;A tired reviewer scanning a diff will not spot a subtle injection or an import that resolves to a lookalike public package.&#xA;Static analysis, dependency policy gates, and a dedicated adversarial agent hunting the change will, on every pull request, at machine speed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;24. If review is worth doing, delegate it to a system.&lt;/strong&gt;&#xA;A reviewer agent reads the whole repository, never tires on the fourth diff, and when it finds a class of issue, writes the gate that catches that class forever.&#xA;An ad hoc human reviewer catches what they happen to notice, once.&#xA;&lt;strong&gt;Machine review at machine speed is the only review that scales with machine generation.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why reform does not rescue it&#xA;    &lt;div id=&#34;why-reform-does-not-rescue-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;#why-reform-does-not-rescue-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;25. Every reform keeps the cost and shrinks the benefit.&lt;/strong&gt;&#xA;Checklists, review SLAs, smaller pull requests, review budgets: each reduces minor waste and keeps the core practice.&#xA;The math is unchanged, because per-diff human attention cannot scale to machine-rate output.&#xA;&lt;strong&gt;Reforming review is spending effort to accommodate the bottleneck instead of removing it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;26. The judgment moves upstream, where it always belonged.&lt;/strong&gt;&#xA;Abandoning review does not mean abandoning scrutiny.&#xA;It means scrutinizing specifications, acceptance criteria, gates, and the small set of irreversible, trust-boundary changes that genuinely deserve slow human reading (&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt;).&#xA;&lt;strong&gt;Review the intentions and the mechanisms; stop reviewing the output.&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;p&gt;Measure the queue first.&#xA;Count agent pull requests arriving per day and the hours you actually spend reviewing.&#xA;If arrivals exceed service, you have already abandoned review; you just have not admitted it in policy.&lt;/p&gt;&#xA;&lt;p&gt;Then make the default explicit.&#xA;Low-impact changes merge on a passing check: CI, gates, and the reviewer agent, no human click.&#xA;Reserve deliberate human reading for irreversible changes, security boundaries, and the gating system itself.&lt;/p&gt;&#xA;&lt;p&gt;Convert every catch.&#xA;Each time review or production reveals an issue, encode it as a check before moving on.&#xA;The list of checks is the review process you are actually running; the queue is just where its results used to wait.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Code review was the right process for software made at human speed.&lt;/strong&gt;&#xA;&lt;strong&gt;Agents ended that era, and the process should end with it.&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;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the full-length argument that reading machine-written diffs is the wrong tool, and what to do with the hours instead.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; - the evidence that approvals are decided by signals rather than reading, which is the premise behind reasons 15 and 16.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt; - the industrial version of this case: verification factories, the five levels, and what teams already run in production.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-cannot-out-review-a-machine-by-hand/&#34; &gt;You Cannot Out-Review a Machine by Hand&lt;/a&gt; - the queue math behind reason 2, applied to any machine-generated workload.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the replacement system: the checks, critics, and gates that do the work review was supposed to do.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rolling-out-the-unread-review/&#34; &gt;Rolling Out the Unread Review&lt;/a&gt; - how to ship that replacement system to a team that does not trust it yet.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - where a human gate still earns its place once per-diff review is gone.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - why acceptance, not review, is the gate that matters between an agent and production.&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://en.wikipedia.org/wiki/Code_review&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Code review&amp;rdquo;&lt;/a&gt; - the origin of formal review in Fagan&amp;rsquo;s inspections, a process designed for human authors.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/&#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=smartbear.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SmartBear, &amp;ldquo;Best Kept Secrets of Peer Code Review&amp;rdquo;&lt;/a&gt; - the 200-400 line finding behind reason 8.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dblp.org/rec/conf/icse/CzerwonkaGT15.html&#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=dblp.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Czerwonka, Greiler, and Tilford, &amp;ldquo;Code Reviews Do Not Find Bugs&amp;rdquo; (ICSE 2015)&lt;/a&gt; - the measurement behind reason 12; only about fifteen percent of Microsoft review comments related to defects.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sback.it/publications/icse2013.pdf&#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=sback.it&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Bacchelli and Bird, &amp;ldquo;Expectations, Outcomes, and Challenges of Modern Code Review&amp;rdquo; (ICSE 2013)&lt;/a&gt; - what developers expect from review versus what it delivers.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sre.google/sre-book/introduction/&#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=sre.google&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google, &amp;ldquo;Site Reliability Engineering&amp;rdquo;&lt;/a&gt; - the finding that 70% of outages come from changes in a live system, behind reason 21.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.latent.space/p/reviews-dead&#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=www.latent.space&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Latent Space, &amp;ldquo;Reviews Dead&amp;rdquo;&lt;/a&gt; - industry reporting on teams already dropping per-diff human review.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My Feature Planning Method: Iterate in Parallel, Then Pass Forward</title>
      <link>https://tomrochette.com/iterate-in-parallel-then-pass-forward/</link>
      <pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/iterate-in-parallel-then-pass-forward/</guid>
      <category>ai</category><category>software-engineering</category><category>sdlc</category><category>planning</category><category>workflow</category><category>llm</category><category>ai-agents</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Planning a feature splits into two jobs: finding out what the questions are, and answering them in an order that lets each answer build on the one before it.&#xA;The two jobs work best in opposite modes, which is why running them as one activity fails.&#xA;When I planned linearly, writing the requirements first and the specification next, the questions surfaced late, after the artifacts they invalidated were already written.&#xA;&lt;strong&gt;The method I use now runs the two jobs as two distinct phases: I iterate on every artifact of a feature in parallel until the big questions surface, then I make one ordered forward pass that settles each file in the sequence the SDLC defines.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The two phases and the switch between them are shown in one picture.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Parallel drafts of requirements, specification, and component plans surface open questions into one pool until a full pass adds no new questions, then requirements, specification, and plans settle in one ordered forward pass&#34;&#xA;    src=&#34;https://tomrochette.com/iterate-in-parallel-then-pass-forward/images/parallel-then-forward.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The directory is the feature&#xA;    &lt;div id=&#34;the-directory-is-the-feature&#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-directory-is-the-feature&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Everything I plan lives in a &lt;code&gt;.sdlc/features/N-feature/&lt;/code&gt; directory, one per feature.&#xA;A feature starts as a problem statement in its own file, because a feature whose problem cannot be written down is not ready to be designed.&#xA;Around that problem statement the directory grows into the full artifact set the &lt;a href=&#34;https://github.com/tomzx/agents/tree/main/skills/sdlc&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SDLC skill&lt;/a&gt; defines: needs assessment, feasibility, requirements, specification, tests, and the rest.&lt;/p&gt;&#xA;&lt;p&gt;A mature feature directory carries the full artifact set the &lt;a href=&#34;https://github.com/tomzx/agents/tree/main/skills/sdlc/templates&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SDLC templates&lt;/a&gt; define, needs assessment, requirements, existing solutions, codebase analysis, feasibility, specification, plan, tasks, tests, and a review findings file paired with each, one purpose per file.&#xA;On top of that standard set sit the files of my own that hold the directory together.&#xA;&lt;code&gt;README.md&lt;/code&gt; is the overview of the feature and the guide to how the other files should be consumed, which makes it the entry point an agent reads first.&#xA;&lt;code&gt;files-flow.md&lt;/code&gt; records which files depend on which in terms of content, and it matters enough to get its own section below.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;files-flow.md turns consistency into a graph&#xA;    &lt;div id=&#34;files-flowmd-turns-consistency-into-a-graph&#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;#files-flowmd-turns-consistency-into-a-graph&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Many files drift.&#xA;A decision that changes in the requirements silently invalidates everything downstream of it, and my memory is not a mechanism I trust to find all of it.&#xA;So every feature directory carries &lt;code&gt;files-flow.md&lt;/code&gt;, a &lt;a href=&#34;https://mermaid.js.org/&#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=mermaid.js.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mermaid&lt;/a&gt; graph of how the files depend on each other in terms of content.&#xA;An edge from X to Y means Y&amp;rsquo;s content is derived from X&amp;rsquo;s content, and the rule the graph encodes is mechanical: when file X changes, every Y that depends on X gets re-verified against the new X.&#xA;&lt;strong&gt;The graph is documentation for me and a worklist for the agent at the same time, which is the only way a consistency rule holds across ten interlocking artifacts.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Phase one: iterate in parallel&#xA;    &lt;div id=&#34;phase-one-iterate-in-parallel&#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;#phase-one-iterate-in-parallel&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first pass over a new feature directory is deliberately chaotic.&#xA;I write the problem statement, then jump into the requirements, the specification, and the component plans all at once, in whatever order the thinking goes.&#xA;Writing a specification forces questions the requirements never answered, and writing a component plan forces questions the specification never answered, so working the files together is the fastest way to find the gaps.&#xA;&lt;strong&gt;Iterating in parallel finds questions: the point is not to finish any file, it is to make every file reveal what I do not know while the cheapest possible response is still to write the question down.&lt;/strong&gt;&#xA;Within a few passes I have the list of risks and open questions that would otherwise have surfaced at implementation time, when each one costs an order of magnitude more to fix.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Phase two: the forward pass&#xA;    &lt;div id=&#34;phase-two-the-forward-pass&#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;#phase-two-the-forward-pass&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the large questions have answers, I switch modes.&#xA;The iteration stops and the forward pass starts: problem statement, then requirements, then specification, then the plans and tests, in the sequence the SDLC skill defines.&#xA;A colleague of mine pictures the sequence as a funnel that expands as clarity about what we are building accumulates.&#xA;The problem statement is the narrow end, and each artifact downstream widens it, requirements expanding the problem, the specification expanding the requirements, plans expanding the specification.&#xA;Walking the funnel in order works because each file gets finished before the next one begins, so every downstream file is written against an upstream that is stable rather than still changing.&#xA;By the time the pass reaches the component plans, most of the content is transcription, because the hard decisions were made during the parallel phase.&#xA;&lt;strong&gt;The forward pass is cheap precisely because the parallel phase paid for it.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why two phases instead of one&#xA;    &lt;div id=&#34;why-two-phases-instead-of-one&#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;#why-two-phases-instead-of-one&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Linear planning discovers questions at the worst possible time, after the artifacts they invalidate exist.&#xA;Parallel-only iteration has the opposite failure: it keeps re-litigating every file and never converges.&#xA;The two-phase split gives each mode the job it is good at, and the switch between them is a deliberate decision, not a drift.&#xA;My rule for switching is simple: when another pass over the files stops producing new questions, the questions are found, and it is time to answer them in order.&#xA;None of this means the order is mandatory, and an unknown piece of functionality is where I stay most open about how to work.&#xA;The instinct is to proceed methodically, but when an LLM can explore a design space in minutes, the smarter sequence is usually reversed: use the model first to identify the risks, surface the questions, and lay out the options, and only then backtrack and write the relevant documents in order.&#xA;Exploration is nearly free, so the failure mode to avoid is premature documentation, not wasted exploration.&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;p&gt;If you plan features as a pile of SDLC artifacts:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Start every feature directory with a problem statement file and a files-flow.md, before the requirements exist.&lt;/li&gt;&#xA;&lt;li&gt;During discovery, write all the artifacts roughly and simultaneously instead of finishing them one at a time.&lt;/li&gt;&#xA;&lt;li&gt;Treat &amp;ldquo;a full pass produces no new questions&amp;rdquo; as the signal to stop iterating and start the forward pass.&lt;/li&gt;&#xA;&lt;li&gt;When any file changes, follow the files-flow edges and re-verify every dependent file before calling the change done.&lt;/li&gt;&#xA;&lt;/ul&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;../three-gaps-my-sdlc-pipeline-hit-on-a-machine-learning-platform/index.md&#34; &gt;Three Gaps My SDLC Pipeline Hit on a Machine Learning Platform&lt;/a&gt; - the stress test that produced files-flow.md and the propagation rule it encodes&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 cost model behind writing the dependency edges down instead of recalling them&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream&lt;/a&gt; - why a question found during parallel iteration is cheaper than the same question found at implementation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow: The Skills Are the Part That Compounds&lt;/a&gt; - the skills pipeline these feature directories feed&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/when-a-closed-decision-reopens/&#34; &gt;When a Closed Decision Reopens&lt;/a&gt; - why every decision lives in a file, and what happens to decisions that live only in conversation&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://github.com/tomzx/agents/tree/main/skills/sdlc&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SDLC skill&lt;/a&gt; - the pipeline whose artifact sequence the forward pass follows&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mermaid.js.org/&#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=mermaid.js.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mermaid&lt;/a&gt; - the diagram syntax files-flow.md uses, readable by both humans and agents&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Speeding Up LLM Work on a Single Codebase</title>
      <link>https://tomrochette.com/speeding-up-llm-work-on-a-single-codebase/</link>
      <pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/speeding-up-llm-work-on-a-single-codebase/</guid>
      <category>llm</category><category>ai-agents</category><category>git</category><category>parallelism</category><category>productivity</category><category>software-engineering</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;When I work with a coding agent, most of the wall clock time goes to waiting.&#xA;The agent thinks and edits, I watch the spinner, then review the result, then queue the next task, and the whole loop runs serially all day.&#xA;&lt;strong&gt;The biggest speedup available in agentic coding is not a smarter model, it is running more of the work at the same time.&lt;/strong&gt;&#xA;Almost every production codebase carries more independent work than one session can absorb: the bug in the parser, the new endpoint, the dependency upgrade, the flaky test.&#xA;The hard part is not spawning extra sessions, it is keeping them from conflicting with each other, and that is a git and workflow problem before it is an AI problem.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why One Session Is the Slow Configuration&#xA;    &lt;div id=&#34;why-one-session-is-the-slow-configuration&#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;#why-one-session-is-the-slow-configuration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A single session is not literally a queue of length one, most harnesses let you queue or steer messages that the agent consumes at its own pace.&#xA;But a queued message is not parallel work: the session still executes its queue one item at a time, so task two waits while task one runs, and the agent waits while you review.&#xA;The model inside the session is not the constraint, the serialization is.&#xA;The progression I use goes from one branch with one task, to one branch with several non-colliding tasks, to one worktree per task, and finally to a pool of worktrees fed with more tasks than there are worktrees.&#xA;Shared branches are the cheap first step, &lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;git worktrees&lt;/a&gt; are the mechanism that makes concurrency safe once tasks start colliding, and an orchestrator is what you add when coordination itself outgrows your attention.&lt;/p&gt;&#xA;&lt;p&gt;The progression I climb looks like this, one rung at a time:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Ascending staircase of four stages: one branch with one session, one branch with several sessions until the first silent collision, one worktree per task, and a pool of worktrees with an orchestrator&#34;&#xA;    src=&#34;https://tomrochette.com/speeding-up-llm-work-on-a-single-codebase/images/parallelism-staircase.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Share a Branch When Tasks Cannot Collide&#xA;    &lt;div id=&#34;share-a-branch-when-tasks-cannot-collide&#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;#share-a-branch-when-tasks-cannot-collide&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The configuration you already run is one branch with one task and one session.&#xA;When your tasks provably cannot collide, the cheapest upgrade is to keep that single branch and add sessions to it, each working on separate files at the same time.&#xA;Nothing to merge, no duplicated environments, and the moment a session finishes, its work is already on the branch.&#xA;The failure modes are just as serious: two agents editing the same file silently overwrite each other on disk, an agent&amp;rsquo;s context goes stale as files change under it, and simultaneous commits race on the git index.&#xA;Last writer wins, and nobody notices until tests fail for reasons neither change explains on its own.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sharing a branch moves the isolation problem from the filesystem to manual coordination, so only use it when the tasks provably do not touch the same files.&lt;/strong&gt;&#xA;The rules that make it work:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Partition by module before spawning, and state each session&amp;rsquo;s file scope in its prompt.&lt;/li&gt;&#xA;&lt;li&gt;Prefer additive tasks: new files, new endpoints, new tests rarely collide.&lt;/li&gt;&#xA;&lt;li&gt;Have each session commit early and often, scoped to its own paths, and stagger commits so index operations do not race.&lt;/li&gt;&#xA;&lt;li&gt;If two tasks genuinely need the same file, serialize them.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The decision rule I use has three tiers.&#xA;If two tasks share no file and no interface, they are trivially parallel, put them anywhere.&#xA;If they share an interface but not files, define the interface first, then parallelize.&#xA;If they share a file, serialize.&#xA;Most of the bad experiences people report with parallel agents are tier violations, not tool failures.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Isolate with Git Worktrees&#xA;    &lt;div id=&#34;isolate-with-git-worktrees&#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;#isolate-with-git-worktrees&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Sooner or later a shared-branch batch produces its first silent collision, and that is the signal to graduate to worktrees.&#xA;A git worktree gives you several working directories that share one repository.&#xA;Each worktree is a full checkout on its own branch, so two agents can edit, build, and run tests without ever seeing each other&amp;rsquo;s half-finished changes.&#xA;The command line story is short:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git worktree add ../myrepo-auth-fix -b auth-fix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git worktree add ../myrepo-api -b api-endpoint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Point session one at &lt;code&gt;../myrepo-auth-fix&lt;/code&gt;, session two at &lt;code&gt;../myrepo-api&lt;/code&gt;, and they are fully isolated at the filesystem level.&#xA;&lt;code&gt;git worktree list&lt;/code&gt; shows what is checked out where, and &lt;code&gt;git worktree remove&lt;/code&gt; cleans up when a task lands.&#xA;Because all worktrees share the same object store, branches created in one are immediately visible in the others, and git only adds a little per-worktree metadata under &lt;code&gt;.git/worktrees&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Worktrees are the default answer because isolation is what lets you stop thinking about collisions.&lt;/strong&gt;&#xA;You stop rationing attention across &amp;ldquo;which files is the other agent touching&amp;rdquo; and spend it on the work instead.&#xA;Worktrees also outlive their first task: keep a pool of them and route the next task into whichever one just freed up, and you are running the final configuration, more tasks than worktrees.&#xA;The cost is environment duplication: each worktree needs its own &lt;code&gt;node_modules&lt;/code&gt; or virtualenv, its own build artifacts, and its own port for a dev server.&#xA;I pay that cost by keeping environment setup scripted and boring, so a new worktree is ready in a minute, and by assigning port offsets per worktree.&#xA;If your setup takes an hour instead of a minute, fix that first, because a slow setup will prevent parallelism on its own.&#xA;The second cost arrives at integration: parallel work postpones conflicts instead of eliminating them, so keep the tasks on disjoint modules or the merge becomes the new bottleneck.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Add an Orchestrator When Coordination Becomes the Job&#xA;    &lt;div id=&#34;add-an-orchestrator-when-coordination-becomes-the-job&#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;#add-an-orchestrator-when-coordination-becomes-the-job&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;With two or three sessions, you can be the coordinator.&#xA;Past that, coordination starts taking the time you were trying to save, which is &lt;a href=&#34;https://en.wikipedia.org/wiki/Amdahl%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Amdahl&amp;rsquo;s law&lt;/a&gt; applied to your own attention: the serial fraction (decomposing, assigning, integrating, deciding) eventually caps the speedup no matter how many workers you spawn.&#xA;The fix is to promote coordination into a role, the orchestrator, and let it own four jobs.&#xA;It decomposes the goal into a task graph and marks what can run in parallel.&#xA;It assigns subtasks to worker sessions, each in its own worktree.&#xA;It enforces contracts between workers, and it integrates, merging finished branches in dependency order and resolving conflicts itself.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;An orchestrator earns its place not by typing faster than the workers but by owning the contracts that make parallel work safe.&lt;/strong&gt;&#xA;The contract step is the one people skip, and it is the one that matters.&#xA;Before any worker starts, the orchestrator writes down the interfaces the workers will build against: the API schema, the shared types, the module boundaries, the test contract.&#xA;Workers then develop against a fixed interface instead of against each other&amp;rsquo;s moving output, and integration becomes mechanical instead of investigative.&#xA;Pair this with critical-path thinking (&lt;a href=&#34;https://en.wikipedia.org/wiki/Critical_path_method&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;the critical path method&lt;/a&gt; is the old, good version): start the longest task first, because parallelism cannot shorten the chain of dependent work.&lt;/p&gt;&#xA;&lt;p&gt;You can be the orchestrator, run a dedicated session for it, or delegate it to a planning agent that fans out work and collects results, in the pattern I described in &lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt;.&#xA;I still orchestrate small batches myself, because writing the task graph is where the actual judgment lives, and judgment is the one input the cheaper workers around you cannot supply.&#xA;The failure mode to watch for is an orchestrator that decomposes badly: workers then block on each other, and you pay coordination cost for serial work.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;More Ways to Buy Speed&#xA;    &lt;div id=&#34;more-ways-to-buy-speed&#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;#more-ways-to-buy-speed&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Worktrees and orchestration are the structural moves, but several smaller changes compound with them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Shorten the feedback loop first.&lt;/strong&gt;&#xA;An agent iterates at the speed of your test suite, so a ten-minute suite turns every edit-test cycle into ten minutes, and no amount of parallelism fixes a slow loop.&#xA;Keep a fast test subset that agents run by default, parallelize the full suite, and make lint and typecheck instant.&#xA;Speed of iteration is a multiplier on every session you run.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tell agents when to verify, not just how.&lt;/strong&gt;&#xA;Telling agents how to verify is the minimum baseline, and one that says when to run them is worth more.&#xA;Left unsupervised, a diligent agent runs the whole suite after every small edit, and on a large project that habit converts hours of work into waiting.&#xA;The instruction that pays is something like &amp;ldquo;make all your edits first, then run the full check suite once before you commit, and use targeted tests only while debugging a specific failure&amp;rdquo;.&#xA;&lt;strong&gt;Verification is a batch job at commit time, not a reflex after every change.&lt;/strong&gt;&#xA;This is a pure instruction-file change: same commands, same rigor, a fraction of the wall clock time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write the context down once.&lt;/strong&gt;&#xA;Every session that has to rediscover your conventions burns time you did not budget for.&#xA;A good &lt;code&gt;AGENTS.md&lt;/code&gt; or equivalent, covering layout, conventions, commands, and the &amp;ldquo;never do this&amp;rdquo; list, turns that rediscovery into a file read, and better context also means fewer wrong turns per task (&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Warm the environments.&lt;/strong&gt;&#xA;Prebuild dependencies so a fresh worktree is functional in seconds: cached package installs, a devcontainer, or a declarative environment.&#xA;The parallel workflow breaks down quietly when every new checkout costs an hour of setup.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Route models by task.&lt;/strong&gt;&#xA;Use the cheap, fast model for exploration, searching, and summarizing, and the strong model for design and edits.&#xA;An explorer session answering questions alongside a writer session doing edits is cheap parallelism that pays immediately.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Plan before you fan out.&lt;/strong&gt;&#xA;Run a planning pass that produces the task graph before spawning workers.&#xA;A graph written up front is what makes fan-out fast and integration boring, and it is the artifact you review when something goes wrong.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Supervise asynchronously.&lt;/strong&gt;&#xA;Do not watch every session.&#xA;Let them run to a blocker, checkpoint their state, and batch your decisions at fixed intervals, the pattern from &lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt;.&#xA;Synchronous supervision caps you at one session no matter what git says is possible.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Watch the review gate.&lt;/strong&gt;&#xA;Parallel agents outproduce your review capacity fast, and then review and integration become the wall (&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt;).&#xA;Budget for it: batch your reviews, review outcomes (tests, recordings, benchmarks) before diffs, and treat rising integration time as the signal that your task boundaries are too coarse.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Profile where the time actually goes.&lt;/strong&gt;&#xA;Agent sessions write detailed logs by default, so the raw material for a time audit is already on your disk.&#xA;A tool like &lt;a href=&#34;https://github.com/kenn-io/agentsview&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;AgentsView&lt;/a&gt; indexes those session files from every harness into one local archive with usage, cost, and history analytics (my &lt;a href=&#34;https://tomrochette.com/agents/session-analytics/agentsview/&#34; &gt;research note on agentsview&lt;/a&gt; covers the details).&#xA;Read the report the way you would read a profiler output: find the phases that consume the most wall clock time, then ask what instruction, script, or boundary would shrink the biggest one.&#xA;Long working phases point at slow test loops or oversized tasks, heavy token spend on easy work points at wrong model routing, and sessions that stall waiting for you point at supervision that should be more asynchronous.&#xA;&lt;strong&gt;Treat your agent workflow like a hot path in code: profile it, find the biggest cost, and cut that first.&lt;/strong&gt;&#xA;The workflow improves the same way code does, by measuring before optimizing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Advanced Strategies&#xA;    &lt;div id=&#34;advanced-strategies&#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;#advanced-strategies&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The techniques above are the baseline for a parallel workflow.&#xA;The ones below are bigger investments, and they pay off once the basics are routine and the profiling data tells you where the remaining time goes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Race N attempts and keep the winner.&lt;/strong&gt;&#xA;For tasks that are small but hard, run two or three attempts in parallel worktrees and keep the one that passes tests or benchmarks best, discarding the rest.&#xA;The losers cost tokens, the winner saves a debugging session.&#xA;A cheaper variant is session forking: at a design decision, fork the session and try both options from the same context, then keep the branch with the better result.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Close the loop from CI back to the agent.&lt;/strong&gt;&#xA;When a check fails after the agent commits, route the failure straight back to the authoring session, or to a fresh session seeded with the failure context, instead of queuing it for a human.&#xA;Batch the day&amp;rsquo;s failures into one repair pass so the full suite runs once for all of them.&#xA;The goal is a pipeline where a human only looks at changes that already pass everything.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cascade models instead of routing them statically.&lt;/strong&gt;&#xA;Start each task on the cheapest model that could plausibly succeed, and escalate to a stronger one only when a signal says it failed: tests red, low confidence, or a critic flag.&#xA;Static routing pays strong-model prices on every task, a cascade pays them only on the hard tail.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make the codebase legible to agents.&lt;/strong&gt;&#xA;Every convention an agent discovers by exploration is paid again by every session, so move conventions from documentation into mechanics: lint rules instead of style guides, generators instead of templates to copy, strict types instead of tribal knowledge.&#xA;Design module seams deliberately so that future parallel tasks touch disjoint files by construction.&#xA;&lt;strong&gt;A codebase machines can navigate without asking is the multiplier that applies to every session you will ever run.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Turn frequent operations into tools.&lt;/strong&gt;&#xA;If every session writes the same shell commands by hand to query the schema, run a migration, or deploy a preview, encode those operations once as CLI commands checked into the repo.&#xA;Prefer a plain CLI over agent-specific tool protocols: every harness already runs shell commands, so a command written once works in every session, every worktree, and your own terminal too.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Share one code index across sessions.&lt;/strong&gt;&#xA;A prebuilt index (&lt;a href=&#34;https://microsoft.github.io/language-server-protocol/&#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=microsoft.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;LSP&lt;/a&gt;, &lt;a href=&#34;https://github.com/universal-ctags/ctags&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ctags&lt;/a&gt;, or embeddings) lets sessions query the codebase instead of crawling it, and the index is built once and reused by every parallel session.&#xA;Exploration is often the largest single phase in an agent session, and a shared index addresses it directly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Run a critic alongside every writer.&lt;/strong&gt;&#xA;A reviewer agent that reads the writer&amp;rsquo;s diff as it lands catches most defects before the human gate, and you review its verdicts instead of every diff.&#xA;This is how you shrink the review wall without lowering the bar: the critic applies the checklist, the human applies judgment.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Eval your workflow like you eval models.&lt;/strong&gt;&#xA;Keep a set of golden tasks for your repo, fix this bug, add this endpoint, with known-good outcomes, and score candidate models, prompts, and tools against them before adopting anything.&#xA;Adopting without measuring imports regressions silently, evals catch them before they cost you weeks.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Move the runtime off your machine.&lt;/strong&gt;&#xA;Local parallelism caps out at your cores, your disk, and your patience, so run sessions in ephemeral cloud environments that can be snapshotted and restored, one warmed environment per session.&#xA;This buys isolation you cannot get locally: a session restored from a clean snapshot cannot be affected by another session&amp;rsquo;s half-installed dependencies.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Speculate on what comes next.&lt;/strong&gt;&#xA;While work runs, an idle agent prefetches the likely next tasks: summarizing the module a task will touch, pre-building the target, drafting the context file.&#xA;When the task starts, its context is already warm, and the startup cost drops to near zero.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Expiry Date on This Advice&#xA;    &lt;div id=&#34;the-expiry-date-on-this-advice&#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-expiry-date-on-this-advice&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Everything above optimizes the machine side of the loop, and the machine side is the side getting cheaper fastest.&lt;/strong&gt;&#xA;While models are slow and expensive, parallelizing them safely pays, which is what most of this article is for.&#xA;Follow the trajectory, though, and the serial fraction of the loop stops being the agent and becomes you.&#xA;The agent finishes a task in minutes, turns around, and waits, not for compute but for you to decide what it should do next.&#xA;Once that is the failure mode, worktrees, orchestrators, and cascades stop buying wall clock time, because the queue the agents pull from is your capacity to specify and decide, the exact shift &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; describes.&#xA;I treat the playbook above as advice for the current regime, and the part that survives is the part the machines cannot accelerate: knowing what is worth building and saying it precisely.&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;p&gt;This week, pick three genuinely independent tasks on your codebase and run them concurrently, on your existing branch if they share no files, or one worktree per task if they do.&#xA;Time two things: the environment setup per worktree, and the integration at the end.&#xA;If setup dominates, script it until it does not.&#xA;If integration conflicts dominate, your tasks were not independent, and the fix is in how you draw task boundaries, not in the tools.&#xA;Once three concurrent sessions feel routine, write your first explicit contract before spawning workers on shared interfaces, and add an orchestrator only when coordinating them takes more of your day than deciding what they should build.&#xA;In my experience two to four concurrent sessions is the best range for one person, and the binding constraint past that is never the model.&#xA;Adopt the advanced strategies one at a time, and only when your profiling data says the basics have stopped moving your wall clock number.&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;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the human-side supervision problem once parallel sessions exist, and the batching patterns that keep it survivable&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; - the organizational version of the orchestrator pattern, where the orchestration layer replaces human management&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-resolves-the-merge-conflict/&#34; &gt;Who Resolves the Merge Conflict?&lt;/a&gt; - where the cost of parallel agent work surfaces, at integration time&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - why written context cuts iterations per task, the per-session complement to per-workflow parallelism&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - the review capacity wall that parallel agents run into downstream&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why the constraint keeps moving up the decision chain, and where this advice expires once models get fast enough&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../the-agentic-development-environment-landscape/index.md&#34; &gt;The Agentic Development Environment Landscape&lt;/a&gt; - the tooling layer that hosts and coordinates these sessions&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-yourself-horizontally/&#34; &gt;Scaling Yourself Horizontally&lt;/a&gt; - the leverage framing for why replication beats working longer&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://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;git-worktree Documentation&lt;/a&gt; - the git mechanism behind isolated parallel checkouts&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.claude.com/docs/en/common-workflows&#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=code.claude.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude Code: Common workflows&lt;/a&gt; - documents the parallel-sessions-with-worktrees practice as a mainstream workflow&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://trunkbaseddevelopment.com/&#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=trunkbaseddevelopment.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Trunk Based Development&lt;/a&gt; - the integration discipline that shared-branch and frequent-merge workflows sit on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Amdahl%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Amdahl&amp;rsquo;s law&lt;/a&gt; - why the serial fraction (decomposition, integration, decisions) caps the speedup from adding agents&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Critical_path_method&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Critical path method&lt;/a&gt; - why the longest dependency chain, not the task count, sets the minimum wall clock time&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://momo5502.com/posts/2026-08-22-mw2-decompilation-audit/&#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=momo5502.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Maurice Heumann, &amp;ldquo;235 Billion Tokens Later: Auditing What The AI Agents Really Did&amp;rdquo;&lt;/a&gt; - a session-log audit of a production multi-agent workflow that grounds the profiling advice, the cut-the-biggest-cost findings (idle waits, CI polling, redundant test runs), and the critic-agent claim that the reviewer&amp;rsquo;s model matters more than the worker&amp;rsquo;s&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Scaling Yourself Horizontally: Attention Does Not Scale, Leverage Does</title>
      <link>https://tomrochette.com/scaling-yourself-horizontally/</link>
      <pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/scaling-yourself-horizontally/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>agents</category><category>productivity</category><category>scaling</category><category>leverage</category><category>fully-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Every engineer I know eventually reaches the same limit: the amount of valuable queued work exceeds the hours in a day.&#xA;The instinct is to scale vertically, to work longer, read faster, and switch contexts harder.&#xA;That direction has a hard ceiling, and the ceiling is low.&#xA;&lt;strong&gt;When you cannot scale vertically, you scale horizontally: you build systems that do things for you.&lt;/strong&gt;&#xA;The resource everyone names as the unscalable one is attention, and I want to push on that claim, because attention is only half the story.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Scaling Vertically Ends Early&#xA;    &lt;div id=&#34;scaling-vertically-ends-early&#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;#scaling-vertically-ends-early&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Scaling vertically means adding capacity to the node itself: more hours, more speed, more skill.&#xA;The day has twenty-four hours, working memory holds a handful of items at once, and energy refills at a fixed rate.&#xA;You can buy maybe two or three times more effective attention by sleeping properly and working in focused blocks, which is a genuine gain but constant-order.&#xA;No amount of discipline buys a tenth of you.&#xA;&lt;strong&gt;Vertical scaling tops out around a factor of two; everything past that has to come from replication.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Scaling horizontally means adding nodes instead of upgrading one.&#xA;A node is a system that acts on your behalf while you are absent: a check, a script, a runbook, an agent, a colleague you taught.&#xA;The question stops being &amp;ldquo;how do I do more&amp;rdquo; and becomes &amp;ldquo;what can act as me without me&amp;rdquo;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A System Is a Decision Made Once&#xA;    &lt;div id=&#34;a-system-is-a-decision-made-once&#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;#a-system-is-a-decision-made-once&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The obvious move is to automate tasks, the repetitive stuff.&#xA;That is the low-grade version of scaling horizontally.&#xA;&lt;strong&gt;What you are actually doing is building systems that make decisions you would otherwise make by hand, so that each decision gets made once instead of each time.&lt;/strong&gt;&#xA;A lint rule is a preference of yours, enforced on every change.&#xA;A runbook is a decision procedure captured at the moment you understood the system best.&#xA;A specification is your intent, written down once and executed against many times.&#xA;An agent skill is a whole procedure of yours, replayable at any hour, in any number of instances.&#xA;&lt;strong&gt;A colleague you coach is the most expensive system of all, the only one that eventually exceeds your judgment.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Andy Grove did the accounting decades ago in &lt;a href=&#34;https://en.wikipedia.org/wiki/High_Output_Management&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;High Output Management&lt;/a&gt;: a manager&amp;rsquo;s output is the output of their organization plus the output under their influence.&#xA;The same math applies to any engineer with systems.&#xA;&lt;strong&gt;Your output is what you produce directly plus what your systems produce in your absence.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The leverage accounting, as I run it today, looks like this:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Line chart: output rises until you step away and goes flat when working alone, while with systems built once it keeps rising in your absence&#34;&#xA;    src=&#34;https://tomrochette.com/scaling-yourself-horizontally/images/leverage-output.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;Building systems is an old set of options: teach, hire, document, automate.&#xA;What changed is the cost of building one.&#xA;Teaching a person takes months and produces one system that generalizes.&#xA;Writing an agent skill takes an afternoon and produces unlimited instances that never generalize.&#xA;Cheap narrow systems for procedures, expensive general ones for judgment, and the current challenge is knowing which decisions belong in a system and which must stay with you.&#xA;The scheduled tasks in my own repositories already work this way: triage, review, and daily curation are systems built out of decisions I once made manually, and they run continuously.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Most Expensive System&#xA;    &lt;div id=&#34;the-most-expensive-system&#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-most-expensive-system&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;One item on that list behaves differently from all the others.&#xA;A person you coach is the most expensive system to build and the only one that eventually exceeds your judgment.&#xA;&lt;strong&gt;Every other system can only replay decisions you already made, so none of them can tell you that you are wrong.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The economics push the cheap layers toward machines.&#xA;Teaching a machine your preferences takes an afternoon; teaching a person takes months.&#xA;The rote layer of teaching, conventions, procedures, mechanics, migrates to machines for the same reason generation did: the cheap system wins on cost.&#xA;What cannot migrate is the point of the expensive one.&#xA;A person generalizes to situations you never saw, dissents when you are wrong, and eventually holds taste decisions in your place, and no skill file does any of the three.&#xA;&lt;strong&gt;Teaching people does not disappear; it shifts from transferring procedures to growing judgment.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The risk runs the other direction.&#xA;Judgment grows only through contact with actual problems, and apprenticeship was where most people got that contact.&#xA;If everyone teaches machines their current preferences and nobody teaches people, the supply of judgment that the next generation of systems is built from depletes.&#xA;&lt;strong&gt;Cheap systems consume the very apprenticeship that produces the general ones.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;So Does Attention Scale or Not?&#xA;    &lt;div id=&#34;so-does-attention-scale-or-not&#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;#so-does-attention-scale-or-not&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The claim I keep hearing, including from myself, is that attention is the only resource you cannot scale.&#xA;Three answers, in increasing order of usefulness.&lt;/p&gt;&#xA;&lt;p&gt;In quantity, no.&#xA;The stock is fixed: one serial consciousness, a small working memory, a day that does not extend, and a decision process that handles one thing at a time (&lt;a href=&#34;https://tomrochette.com/attention-engineering/&#34; &gt;Attention Engineering&lt;/a&gt; covers what that means in practice).&lt;/p&gt;&#xA;&lt;p&gt;In quality, slightly.&#xA;Focus, sleep, and single-tasking produce a genuine multiplier over a frazzled baseline.&#xA;That factor of two is worth claiming, and almost nobody has claimed it.&#xA;But a constant is not a curve.&lt;/p&gt;&#xA;&lt;p&gt;In leverage, without bound.&#xA;&lt;strong&gt;Attention is the only resource you cannot scale in quantity, and the only one whose yield per unit is unbounded.&lt;/strong&gt;&#xA;A test attends so that you do not have to; verification substitutes for supervision.&#xA;A check written once removes a minute of checking on every future use, forever.&#xA;A system built this year raises the return on every hour of attention you will ever spend afterward.&#xA;The attention itself does not compound.&#xA;The artifacts do, and the artifacts all exist outside your head.&lt;/p&gt;&#xA;&lt;p&gt;What never scales is the deciding itself.&#xA;You can multiply what a moment of attention produces, but the moment of judgment, the taste call on whether a thing is good enough, stays serial and stays yours, which is &lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;the acceptance gap&lt;/a&gt; restated as a scaling law.&#xA;So the precise version of the claim reads: attention does not scale, and that is exactly why the work is to stop spending attention on anything a system could check.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Scaling Horizontally Fails in Four Known Ways&#xA;    &lt;div id=&#34;scaling-horizontally-fails-in-four-known-ways&#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;#scaling-horizontally-fails-in-four-known-ways&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Replication looks free, and its costs arrive later.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Systems drift.&lt;/strong&gt;&#xA;Every system is a snapshot of the decisions you made when you built it, and the world moves on.&#xA;The runbook rots, the skill goes stale, the gate blocks a pattern that was bad two years ago and is idiomatic now.&#xA;Someone has to tend the systems, and that someone is you, the maintenance burden &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; describes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Errors correlate.&lt;/strong&gt;&#xA;A flaw in a system&amp;rsquo;s decisions repeats on every execution, in every instance, at once.&#xA;A thousand agents running the same flawed instruction produce a thousand instances of the same mistake, which is why consistently wrong is a worse failure mode than inconsistently right (&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt;).&#xA;At that point you are not scaling your throughput; you are scaling your error surface.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The job converts.&lt;/strong&gt;&#xA;Scale horizontally far enough and you stop being the producer and become the governor of a system of producers.&#xA;Attention moves from doing the work to reviewing outputs, pruning systems, and deciding what to build next.&#xA;The constraint did not disappear; it moved up to you, the textbook behavior of a system under the &lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;theory of constraints&lt;/a&gt;.&#xA;Govern badly and you reproduce your own mistakes at machine speed, faster than any hand-made error.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The source depletes.&lt;/strong&gt;&#xA;Your judgment is the raw material the systems are built from, and judgment regenerates only through contact with actual problems.&#xA;Automate away all the doing and you cut off the supply of experience that made your systems worth building, the terminal worry of &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;.&#xA;&lt;strong&gt;The systems are only as good as the freshest judgment that went into them, so a slice of attention must stay spent on hands-on work even when a system could do it.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Review the Result, Not the Change&#xA;    &lt;div id=&#34;review-the-result-not-the-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;#review-the-result-not-the-change&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Code review is where misallocated attention is easiest to see, so let me be specific about it.&#xA;When a change arrives, the reflex is to open the diff and read the implementation.&#xA;&lt;strong&gt;The question that deserves your attention is not what the change looks like but what it resulted in: the failing test that now passes, the before-and-after recording, the benchmark that moved, the error rate that dropped.&lt;/strong&gt;&#xA;The implementation is how the result was produced, and the how is increasingly the machine&amp;rsquo;s business.&lt;/p&gt;&#xA;&lt;p&gt;Concretely, this means review discussions argue about outcomes: what the change does to behavior, to latency, to failure modes, to the rollback path.&#xA;Style and implementation details are preferences, and preferences belong in the gates, where they run on every change instead of when a reviewer remembers to mention them (&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; builds the full system).&#xA;Read the diff itself only when the evidence is missing or the blast radius is large, the classification &lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; argues for.&#xA;And when the evidence is missing, treat that absence as the review finding, rather than reconstructing the answer by reading the code.&lt;/p&gt;&#xA;&lt;p&gt;This is how one serial consciousness keeps up with many producers.&#xA;You audit results and sample implementation, because the day you read every diff is the day the systems outproduce your review capacity (&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&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;p&gt;Audit the last two weeks of your work and list every recurring manual action.&#xA;Anything done three times or more is a system waiting to be built, and the order matters: gates and skills first, one-off scripts second, docs third, memory last, because the earlier items compound and memory does not last.&lt;/p&gt;&#xA;&lt;p&gt;Prefer systems with an oracle.&#xA;Automate the checkable, where correctness can be tested mechanically.&#xA;The taste decisions, whether a thing is good enough or should exist at all, have no oracle and stay yours, so give them protected time on your calendar instead of letting reviewing more output crowd them out.&lt;/p&gt;&#xA;&lt;p&gt;Spend the freed attention upstream, on specifications and on deciding what should exist at all, not on reviewing more output faster.&#xA;That reallocation is the entire point of scaling horizontally, and &lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; is what happens when you skip it and let the systems outproduce your review capacity.&lt;/p&gt;&#xA;&lt;p&gt;Keep a deliberate budget of attention that never gets handed to a system: the taste decisions, plus enough hands-on work to keep your judgment regenerating.&#xA;You are protecting the source of future judgment, not being inefficient.&lt;/p&gt;&#xA;&lt;p&gt;Then measure yourself in output per unit of attention, not in hours, tasks, or sessions spawned.&#xA;The number that defines a scaling engineer is how much ships per hour of focused judgment.&lt;/p&gt;&#xA;&lt;p&gt;You will never get more of yourself.&#xA;&lt;strong&gt;What you can decide is how many systems run without you, how fresh their decisions stay, and what the one serial consciousness behind all of them spends its scarce attention on.&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;https://tomrochette.com/attention-engineering/&#34; &gt;Attention Engineering&lt;/a&gt; - the tactical layer of this argument: how to allocate the fixed attention across an agent workflow instead of wasting it on generation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-apprentice-problem/&#34; &gt;The Apprentice Problem&lt;/a&gt; - the pipeline consequence of teaching machines instead of people: where new judgment comes from once the junior work is automated&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - what happens when generation scales but acceptance does not, and the contract that drains the review queue&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the pattern behind source depletion: automating a layer moves the constraint to the layer above&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/solo-is-a-team-size/&#34; &gt;Solo Is a Team Size&lt;/a&gt; - the seat-by-seat version of the same question: which roles need a general copy of judgment (a human) and which need a narrow one&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; - the organizational version of replication and its failure modes, correlated errors first among them&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; - the maintenance cost of these systems: why they need tending or they rot&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - where the taste decision lives and why it stays with you when everything else has been copied&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://en.wikipedia.org/wiki/High_Output_Management&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Andy Grove, &amp;ldquo;High Output Management&amp;rdquo; (Wikipedia)&lt;/a&gt; - the leverage accounting: your output includes everything your organization and your influence produce&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Theory of constraints&lt;/a&gt; - why elevating a constraint moves it instead of removing it, the mechanism that turns a scaling engineer into a governor&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cognitive_load&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cognitive load&lt;/a&gt; - the research grounding why the quantity of attention is a fixed stock&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Apprentice Problem: Where Does New Judgment Come From?</title>
      <link>https://tomrochette.com/the-apprentice-problem/</link>
      <pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-apprentice-problem/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>learning</category><category>career</category><category>team-management</category><category>apprenticeship</category><category>fully-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Every senior engineer I know learned the same way: by doing junior work for years.&#xA;The bug fixes, the small features, the boring refactors, the reviews where someone senior criticized their code in detail.&#xA;That work was never just output.&#xA;It was where judgment formed under supervision, with direct feedback, at low stakes.&#xA;&lt;strong&gt;Automate the junior work and you do not just lose the output; you cut the input to the pipeline that produces senior engineers.&lt;/strong&gt;&#xA;Nobody announces this.&#xA;The economics automate the junior work quietly, one task at a time.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How Judgment Actually Forms&#xA;    &lt;div id=&#34;how-judgment-actually-forms&#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;#how-judgment-actually-forms&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Judgment is not transferred by explanation.&#xA;It is grown by contact with consequences.&#xA;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Dreyfus model of skill acquisition&lt;/a&gt; describes the path: novice, advanced beginner, competent, proficient, expert, where each step up comes less from rules learned and more from experience absorbed.&#xA;The rules are the easy part.&#xA;What separates a competent engineer from an expert one is the set of cases they have lived through, the bugs debugged at 2 a.m., the refactor that made things worse, the outage traced to a decision the engineer personally made.&lt;/p&gt;&#xA;&lt;p&gt;Apprenticeship was never ceremony.&#xA;It was how consequences reached the junior.&#xA;A junior shipped a small change, the change broke something, and the feedback arrived fast enough to teach them something.&#xA;Small scope, genuine stakes, tight loop.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Deliberate_practice&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Deliberate practice&lt;/a&gt; works the same way in every field studied: repetition at the edge of ability, with immediate feedback, is the only known mechanism that builds expertise.&lt;/p&gt;&#xA;&lt;p&gt;The loop the old apprenticeship closed looks like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    X[Agent automates the junior work] --&amp;gt;|input cut| A[Junior ships a small change]&#xA;    A --&amp;gt; B[Change meets actual consequences]&#xA;    B --&amp;gt; C[Feedback arrives fast enough to teach them something]&#xA;    C --&amp;gt; D[Judgment gains another case]&#xA;    D --&amp;gt;|next task is a little harder| A&lt;/pre&gt;&#xA;&lt;p&gt;The junior work being automated is not adjacent to that mechanism.&#xA;It is that mechanism.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Economics Remove Exactly the Wrong Layer&#xA;    &lt;div id=&#34;the-economics-remove-exactly-the-wrong-layer&#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-economics-remove-exactly-the-wrong-layer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The uncomfortable part is that automating junior work is correct, locally.&#xA;When an agent fixes the small bug in an afternoon for cents, paying a junior to spend a week on it looks like charity.&#xA;No single manager makes a bad decision.&#xA;Every decision is rational, and the aggregate is a pipeline with its input cut.&lt;/p&gt;&#xA;&lt;p&gt;The pattern is familiar from &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;: automate a layer, and the constraint moves up.&#xA;But this time the constraint does not just move.&#xA;It loses its supply, because the layer above is built from the layer below.&lt;/p&gt;&#xA;&lt;p&gt;The danger is the delay.&#xA;A pipeline with no input still ships output for years, from the inventory of already-formed senior engineers.&#xA;By the time the shortage is visible in hiring metrics, the training has been gone for a decade.&#xA;&lt;strong&gt;The apprentice problem is a slow-motion staffing crisis that no quarterly review will catch, because the seniors are still performing.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Same Collapse, One Level Up&#xA;    &lt;div id=&#34;the-same-collapse-one-level-up&#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-collapse-one-level-up&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a structural precedent.&#xA;&lt;a href=&#34;https://tomrochette.com/model-collapse-in-code/&#34; &gt;Model collapse in code&lt;/a&gt; describes what happens when models train on their own output: the tails disappear first, the average looks fine, and the distribution narrows with each generation.&#xA;An organization that stops training juniors runs the same loop on people.&#xA;The seniors encode their judgment into systems and agents, the next engineers learn from those systems instead of from supervised contact with reality, and what they acquire is the smoothed average of their predecessors, rounded off a little more each generation.&#xA;The rare cases, the exceptions, the reasons behind the rules are exactly what does not survive the transfer, and exactly what judgment was.&lt;/p&gt;&#xA;&lt;p&gt;I am not claiming people are models.&#xA;I am claiming the loop is the same structure: output consumed as input, without fresh contact with reality, degrades in the tails first.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Replaces the Old Apprenticeship&#xA;    &lt;div id=&#34;what-replaces-the-old-apprenticeship&#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-replaces-the-old-apprenticeship&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The answer is not to ban agents from junior work, that battle is over and nostalgia is not a strategy.&#xA;The answer is that apprenticeship has to become deliberate now that it is no longer incidental.&#xA;Three moves cover most of it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make juniors the supervisors, not the supervised writers.&lt;/strong&gt;&#xA;There is still a large amount of work that needs a human mind: reviewing agent output, verifying claims against evidence, catching the plausible-and-wrong.&#xA;Put the junior on that work, with a senior reading their verdicts.&#xA;The feedback loop is just as tight, judging output and being judged on the judgment, and the skill being trained is the one that actually remains scarce.&#xA;The new junior work is acceptance.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reserve work for humans on purpose.&lt;/strong&gt;&#xA;A team that assigns every task to whichever worker is cheapest has decided, implicitly, not to grow anyone.&#xA;Some tasks should be reserved for the person who would learn most from them, at a productivity cost the team accepts knowingly.&#xA;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software engineering teams in the age of AI&lt;/a&gt; makes the general case for keeping friction that pays; this is the specific friction that pays in people.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Teach judgment directly, out loud.&lt;/strong&gt;&#xA;The old pipeline taught judgment through absorption, through years of proximity.&#xA;The deliberate version is faster and demands more from seniors: decision reviews, where a junior predicts the call before hearing it; postmortems walked through live, not archived; the why behind every convention made explicit instead of encoded and forgotten.&#xA;Encoding your judgment into a system, the move &lt;a href=&#34;https://tomrochette.com/scaling-yourself-horizontally/&#34; &gt;Scaling Yourself Horizontally&lt;/a&gt; argues for, and transferring it to a successor are not the same act, and only one of them renews the supply.&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;p&gt;If you run a team, trace one recent junior-level task end to end and ask who could do it next year for the first time.&#xA;If the answer is nobody, because it will be automated, you have found a hole in the pipeline, and the fix is to route the learning part of that task somewhere it still exists.&lt;/p&gt;&#xA;&lt;p&gt;If you are early in your career, stop competing with the machines on production and compete on acceptance.&#xA;Build the record of catches, verdicts that proved correct, errors found in output everyone else approved.&#xA;That record is the new seniority.&lt;/p&gt;&#xA;&lt;p&gt;If you are senior, pick one person and start teaching out loud this month, decisions, not syntax.&#xA;The foundations are a separate argument, and &lt;a href=&#34;https://tomrochette.com/learn-the-foundation-not-the-syntax/&#34; &gt;Learn the Foundation, Not the Syntax&lt;/a&gt; makes it, but foundations without direct consequences produce competence without judgment.&lt;/p&gt;&#xA;&lt;p&gt;The question every organization is currently answering by default is: who is allowed to become senior next?&#xA;&lt;strong&gt;Leaving that to the economics of task assignment is how the answer becomes nobody, slowly enough that no one notices until the last senior leaves.&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;https://tomrochette.com/scaling-yourself-horizontally/&#34; &gt;Scaling Yourself Horizontally&lt;/a&gt; - the upstream piece: encoding judgment into systems, and the warning that cheap systems consume the training that produces general judgment&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/model-collapse-in-code/&#34; &gt;Model Collapse in Code&lt;/a&gt; - the same degradation loop at the corpus level, output training output, tails disappearing first&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/learn-the-foundation-not-the-syntax/&#34; &gt;Learn the Foundation, Not the Syntax&lt;/a&gt; - what to teach when production is automated: mental models of execution, cost, and failure rather than syntax&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - the team-level case for keeping friction that pays, of which training juniors is the clearest instance&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the general pattern of constraints moving up when a layer is automated, here with the twist that the upper layer loses its supply&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - the acceptance work that becomes the new way juniors train, generation solved and judgment remaining&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://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Dreyfus model of skill acquisition&lt;/a&gt; - the novice-to-expert progression, where advancement comes from absorbed experience rather than rules&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Deliberate_practice&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Deliberate practice&lt;/a&gt; - the research consensus that expertise builds through repetition at the edge of ability with immediate feedback&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Apprenticeship&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Apprenticeship&lt;/a&gt; - the historical delivery mechanism for learning through supervised practical work&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Bus Factor One by Design</title>
      <link>https://tomrochette.com/bus-factor-one-by-design/</link>
      <pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/bus-factor-one-by-design/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>agents</category><category>team-management</category><category>ownership</category><category>fully-ai-generated</category><category>llm=ox-alpha</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Consider a company where every system belongs to exactly one person.&#xA;No colleague reviews their changes, no meeting brings anyone up to date on what they built, and no second person has the context needed to work on it.&#xA;A few years ago that description would have been called negligence.&#xA;Today people describe it as an efficiency proposal, because agents now do most of what colleagues used to contribute during implementation.&#xA;&lt;strong&gt;The model can work, but only for companies that answer one question before adopting it: what happens when the owner goes on vacation, or quits?&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Single-Owner Systems Are Coming&#xA;    &lt;div id=&#34;why-single-owner-systems-are-coming&#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;#why-single-owner-systems-are-coming&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The economics of coordination changed before the model did.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Mythical_Man-Month&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Brooks counted it in 1975&lt;/a&gt;: n people create n(n-1)/2 communication channels, and every channel adds a cost to alignment.&#xA;When implementation was expensive, that cost produced reliability, because colleagues caught each other&amp;rsquo;s mistakes while catching up on context.&#xA;Now agents produce the code and verification pipelines judge it, so &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;human review of generated changes&lt;/a&gt; has become the least valuable step in the process, and the specification replaces the meeting as the unit of coordination.&#xA;What remains of the channel cost is mostly expense.&lt;/p&gt;&#xA;&lt;p&gt;Against that cost, a single owner provides three things that teams struggle to produce otherwise.&#xA;Coherence, because one taste decides every abstraction instead of a committee averaging its members.&#xA;Speed, because nothing waits on sync.&#xA;Accountability, because when something breaks there is exactly one person who answers for it.&lt;/p&gt;&#xA;&lt;p&gt;This is not hypothetical.&#xA;&lt;a href=&#34;https://arxiv.org/abs/1512.05230&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;A study of the Truck Factor&lt;/a&gt;, the minimum number of developers who must disappear before a project stalls, found many popular open source projects already sit at one.&#xA;Critical infrastructure runs on bus factor one more often than any company would admit to running production that way.&#xA;The difference is that companies now have an economic reason to stop pretending otherwise and a toolset for surviving it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Question Hides an Assumption&#xA;    &lt;div id=&#34;the-question-hides-an-assumption&#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-question-hides-an-assumption&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&amp;ldquo;What if nobody else knows the system?&amp;rdquo; assumes knowledge is stored in people&amp;rsquo;s memory.&#xA;For most of software history it did, because writing it down served nobody&amp;rsquo;s daily work.&#xA;Documentation went out of date because the only people able to maintain it were busy maintaining the system.&lt;/p&gt;&#xA;&lt;p&gt;Agents change the cost of the alternative.&#xA;Agents can now produce and refresh decision records, runbooks, architecture maps, and executable specifications continuously as a byproduct of the work itself.&#xA;The agents that build the system keep its documentation current, the same way CI keeps tests green.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The metric stops being how many heads know the system and becomes how fast a competent outsider plus their agents can re-acquire it from artifacts alone.&lt;/strong&gt;&#xA;Call it re-acquisition time.&#xA;Bus factor measured the redundancy of memory.&#xA;Re-acquisition time measures the recoverability of understanding.&lt;/p&gt;&#xA;&lt;p&gt;That inversion is why the model deserves serious consideration.&#xA;&lt;strong&gt;A team of five who never write anything down can be harder to take over than a single owner whose repository documents itself, because five people holding unspoken context is still bus factor five, just less obvious.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How a Company Runs on Owners of One&#xA;    &lt;div id=&#34;how-a-company-runs-on-owners-of-one&#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;#how-a-company-runs-on-owners-of-one&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The mechanisms are organizational, not technical.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Ownership is conditional on legibility.&lt;/strong&gt;&#xA;An owner keeps the system as long as it stays handover-ready without them.&#xA;Definition of done includes the artifacts: tests written as specifications, decision records with alternatives considered, runbooks, an architecture map that reflects reality.&#xA;Agents draft and refresh these continuously, so legibility stops being a chore and becomes a property of the pipeline.&#xA;Think of it as &lt;a href=&#34;https://en.wikipedia.org/wiki/Source_code_escrow&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;source code escrow&lt;/a&gt; applied to understanding rather than code: the company holds the knowledge outside the person who operates it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Vacations are load tests.&lt;/strong&gt;&#xA;Every owner takes a mandatory uninterrupted absence each year.&#xA;During it, another engineer plus their agents must handle incidents and ship one scoped change using only the artifacts, with the owner unreachable.&#xA;Score the takeover and publish the time it took.&#xA;The drill is chaos engineering applied to the org chart: you inject failure into the ownership layer while the stakes are a minor feature, not a resignation letter.&lt;/p&gt;&#xA;&lt;p&gt;Here is the drill written as a script:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;sequenceDiagram&#xA;    participant C as Company&#xA;    participant O as Owner&#xA;    participant A as Artifact set&#xA;    participant S as Successor and agents&#xA;    C-&amp;gt;&amp;gt;O: Mandatory uninterrupted absence begins&#xA;    O--&amp;gt;&amp;gt;C: Unreachable for the duration&#xA;    S-&amp;gt;&amp;gt;A: Handle incidents and ship one scoped change&#xA;    A--&amp;gt;&amp;gt;S: Tests, decision records, runbooks, architecture map&#xA;    S--&amp;gt;&amp;gt;C: Scored takeover&#xA;    C-&amp;gt;&amp;gt;C: Publish the re-acquisition time&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Redundancy spend follows blast radius.&lt;/strong&gt;&#xA;Not every internal script deserves a second person.&#xA;Classify systems by blast radius and cap how many revenue-critical systems may exceed a re-acquisition threshold, say two weeks.&#xA;This is portfolio management: concentrate risk where you choose, hedge where loss would be unrecoverable, and know which is which.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Succession is scheduled, not emergent.&lt;/strong&gt;&#xA;Rotate owners on a cadence so every handover gets exercised while both parties still work there.&#xA;For the few systems whose takeover would hurt most, name a shadow owner who runs the vacation drill against them quarterly.&#xA;The handoff paragraph from &lt;a href=&#34;https://tomrochette.com/solo-is-a-team-size/&#34; &gt;Solo Is a Team Size&lt;/a&gt; (what the system is, why it exists, who inherits it) becomes a required field in the service registry rather than advice for solo operators.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Incentives reward survivable systems.&lt;/strong&gt;&#xA;Promotion criteria should include &amp;ldquo;your system passed your absence&amp;rdquo;, and managers should treat &amp;ldquo;only I can touch this&amp;rdquo; as a liability, not an advantage.&#xA;The irreplaceable engineer is not an asset the company enjoys; it is concentrated risk the company funds.&#xA;Pay people to make themselves unnecessary and indispensability stops being a career strategy.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Still Does Not Transfer&#xA;    &lt;div id=&#34;what-still-does-not-transfer&#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-still-does-not-transfer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Some knowledge does not become artifacts.&#xA;Taste, the reasons the roadmap takes the direction it does, the history of a negotiation with a key customer: deliberation leaves traces but rarely conclusions.&lt;/p&gt;&#xA;&lt;p&gt;Two habits keep more of it from escaping.&#xA;Record rationale at decision time, while you still remember the alternatives, because a decision record written six months later will be inaccurate.&#xA;Occasionally have the owner defend direction to a peer: not the code, the choices, so judgment gets exercised against a counterparty instead of remaining private to one person.&lt;/p&gt;&#xA;&lt;p&gt;Then accept what remains.&#xA;Some re-acquisition cost is irreducible, the same way some latency is.&#xA;Budget it like depreciation rather than promising zero, and nobody gets surprised when a departure costs three weeks instead of none.&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;p&gt;Pick your most critical system and measure its re-acquisition time this month.&#xA;Hand it to another competent engineer plus their agents with a scoped feature request and no access to the owner.&#xA;Whatever number comes back is your actual exposure, and it is almost certainly larger than management believes.&lt;/p&gt;&#xA;&lt;p&gt;Set thresholds by blast radius and drill vacations against everything above them.&#xA;Change one line of promotion criteria to reward owners whose systems survive their absence.&#xA;And when someone next argues a system needs a second person, ask whether they mean memory redundancy, which agents and artifacts now supply cheaply, or judgment redundancy, which only a second person supplies.&#xA;&lt;strong&gt;The first is solved; budget for the second only where the stakes are directional.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A company can run on owners of one indefinitely.&#xA;What it cannot survive is letting knowledge exist in only one place.&#xA;&lt;strong&gt;People operate the systems, the artifacts are the asset, and the company&amp;rsquo;s job is to keep the asset independent of any operator, including the ones it wishes it could keep forever.&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;https://tomrochette.com/solo-is-a-team-size/&#34; &gt;Solo Is a Team Size&lt;/a&gt; - the solo-operator limit case of this model, and the source of the handoff paragraph turned registry field here&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - the acceptance-evidence contract that makes a fast single producer trustworthy enough to own a system alone&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-maintains-the-slop/&#34; &gt;Who Maintains the Slop?&lt;/a&gt; - who stays attached to agent-generated code once its author moves on, the maintenance half of the ownership question&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - the team-based counterpart, covering which processes stay worth their friction when colleagues remain in the loop&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://arxiv.org/abs/1512.05230&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Guido Avelino et al., &amp;ldquo;A novel approach for estimating Truck Factor&amp;rdquo;&lt;/a&gt; - the empirical finding that many widely used projects already run at truck factor one&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Bus_factor&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Bus factor (Wikipedia)&lt;/a&gt; - the classic formulation of the risk this model deliberately accepts&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Source_code_escrow&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Source code escrow (Wikipedia)&lt;/a&gt; - the established practice of holding operational knowledge outside the operating party&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Mythical_Man-Month&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Frederick Brooks, &amp;ldquo;The Mythical Man-Month&amp;rdquo; (Wikipedia)&lt;/a&gt; - the communication-channel math that made coordination expensive and single ownership attractive&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Continuous Research: Deep Research on a Loop</title>
      <link>https://tomrochette.com/continuous-research/</link>
      <pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/continuous-research/</guid>
      <category>ai</category><category>llm</category><category>deep-research</category><category>ai-agents</category><category>research</category><category>knowledge-management</category><category>automation</category><category>fully-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Deep research agents changed who does the reading, not how often it happens.&#xA;You type a question, the agent browses for up to half an hour, you receive a cited report.&#xA;Then the world moves, and the report starts going stale on the day it was written.&#xA;Ask the same question next month and the agent starts from zero, with no memory of what it already told you.&#xA;&lt;strong&gt;The report was never the product. The product is a knowledge base that stays current, and the way to get one is to put research on a loop.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I call this continuous research: declare the topics you care about, schedule an agent to re-research them on a cadence, and let it maintain a versioned knowledge base whose updates you read like diffs.&#xA;The human stops being the researcher and becomes the editor of a small research department that runs continuously.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Report Is a Snapshot&#xA;    &lt;div id=&#34;the-report-is-a-snapshot&#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-report-is-a-snapshot&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The current wave of research agents is genuinely good at the finding part.&#xA;ChatGPT&amp;rsquo;s &lt;a href=&#34;https://en.wikipedia.org/wiki/Deep_research&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Deep Research&lt;/a&gt; autonomously browses the web for five to thirty minutes per query and returns a structured, cited report.&#xA;Claude&amp;rsquo;s &lt;a href=&#34;https://www.anthropic.com/news/research&#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=www.anthropic.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Research&lt;/a&gt; runs multiple searches that build on each other and explores angles you did not ask for.&#xA;A recent &lt;a href=&#34;https://arxiv.org/abs/2512.02038&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;survey of deep research systems&lt;/a&gt; formalizes what these tools do into four components: query planning, information acquisition, memory management, and answer generation.&lt;/p&gt;&#xA;&lt;p&gt;What the survey&amp;rsquo;s framing makes visible is where the continuity breaks.&#xA;Query planning, acquisition, and generation all exist only inside a single run.&#xA;The only component that could span runs, memory management, is scoped to the session.&#xA;These products treat memory as scratch space for finishing one answer, not as the durable asset.&lt;/p&gt;&#xA;&lt;p&gt;So the structure of the interaction is: one question in, one report out, everything forgotten.&#xA;The run lengths are capped in minutes and the queries are metered by the month, because a long autonomous browse is expensive.&#xA;The output is a document, and a document is a snapshot.&lt;/p&gt;&#xA;&lt;p&gt;None of this is a flaw in the tools.&#xA;It is a flaw in the unit of work.&#xA;A report answers a question once, but most questions that matter to your work are recurring, and recurring questions deserve a maintained answer, not a fresh one every time.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Continuous Research Is&#xA;    &lt;div id=&#34;what-continuous-research-is&#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-continuous-research-is&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The definition I use: &lt;strong&gt;continuous research is a scheduled agent loop that incrementally maintains a versioned knowledge base about topics you have declared, so that your current understanding is a system property rather than an activity.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here is the loop as a machine:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    TF[Topic file, written by you] --&amp;gt; L[Scheduled loop with a budget]&#xA;    CP[Checkpoint, the last researched date] --&amp;gt; L&#xA;    L --&amp;gt;|reads only the new material| U[Incremental update per run]&#xA;    U --&amp;gt;|advances the checkpoint| CP&#xA;    U --&amp;gt; KB[Versioned knowledge base]&#xA;    KB --&amp;gt; B[Brief, the current state]&#xA;    KB --&amp;gt; LG[Dated update log]&#xA;    KB --&amp;gt; SN[Source snapshots]&#xA;    B --&amp;gt; DG[Diff between versions, the weekly digest]&lt;/pre&gt;&#xA;&lt;p&gt;Four pieces, each of which already exists on its own.&lt;/p&gt;&#xA;&lt;p&gt;The first is the topic file.&#xA;One markdown file per topic stating the scope, the questions worth answering, the canonical sources, and what a meaningful change would look like.&#xA;This is an editorial artifact, written by you, and it is the part that captures your judgment.&#xA;It works the same way as a skill file: the judgment goes in a file, versioned, rather than in a prompt you retype.&lt;/p&gt;&#xA;&lt;p&gt;The second is the loop.&#xA;A schedule, a budget, and a skill that knows how to research one topic, in the format &lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; describes.&#xA;The scheduling primitive is no longer exotic: coding agents can already be &lt;a href=&#34;https://code.claude.com/docs/en/scheduled-tasks&#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=code.claude.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;run on a schedule&lt;/a&gt;, and a GitHub Actions cron or an agent runtime does the rest.&lt;/p&gt;&#xA;&lt;p&gt;The third is the incremental update.&#xA;Each run advances a checkpoint, the last date the topic was researched, and the agent reads only what is new since that date.&#xA;arXiv monitoring works exactly this way: fetch what appeared since the last processed date, summarize, advance the checkpoint.&#xA;This is what separates continuous research from naively re-running a deep research query every week: the run is a delta against a base, not a rebuild from scratch.&lt;/p&gt;&#xA;&lt;p&gt;The fourth is the knowledge base itself, which is the product the other three pieces serve.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Knowledge Base Is the Product&#xA;    &lt;div id=&#34;the-knowledge-base-is-the-product&#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-knowledge-base-is-the-product&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A continuous research knowledge base is a directory per topic, in git, containing three kinds of files.&#xA;A brief, rewritten each run, holding the current state of understanding.&#xA;A log of dated updates, so the history of the topic is readable as a timeline.&#xA;Snapshots of the sources, so every claim in the brief can be traced to the page it came from, even if that page moves or disappears.&lt;/p&gt;&#xA;&lt;p&gt;The properties follow from the format.&#xA;The brief answers &amp;ldquo;what is true now&amp;rdquo;, the log answers &amp;ldquo;what changed&amp;rdquo;, and the diff between the last two versions of the brief is your weekly digest, generated as a byproduct rather than assembled by hand.&#xA;&lt;strong&gt;The git log of the knowledge base becomes the changelog of your own understanding.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I keep the research directories of this blog in this form, agent-written briefs with per-topic folders and source snapshots, and the pattern is the same one behind my public &lt;a href=&#34;https://github.com/TomzxCode/sdlc&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;specification workspace&lt;/a&gt;, where a weekly drift check re-derives specifications for open-source projects I depend on from their upstream code and commits the diff.&#xA;That workspace is a continuous research system applied to code repositories instead of the web, and it has worked well enough to recommend the pattern in general.&lt;/p&gt;&#xA;&lt;p&gt;The comparison worth making is to continuous integration.&#xA;A one-shot research report is a local build: correct at a moment, unverified the next day.&#xA;Continuous research is CI for knowledge: the build runs on every tick, and breakage, meaning drift between your knowledge base and the world, shows up as a diff instead of as a surprise in a meeting.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Wiki Half Already Exists&#xA;    &lt;div id=&#34;the-wiki-half-already-exists&#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-wiki-half-already-exists&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The LLM-maintained knowledge base now has a name and a following.&#xA;Andrej Karpathy&amp;rsquo;s &lt;a href=&#34;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&#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=gist.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;LLM Wiki&lt;/a&gt; idea file, published in April 2026, describes the same shift from deriving to maintaining: instead of a retrieval layer that reassembles knowledge from raw chunks on every question, the agent incrementally builds and maintains a persistent wiki of interlinked markdown pages.&#xA;His architecture has three layers: immutable raw sources, an LLM-owned wiki, and a schema file that tells the agent the conventions to follow.&#xA;The schema is my topic file under another name, and his append-only log matches the update log my knowledge base layout uses, which suggests these choices are convergent rather than arbitrary.&#xA;&lt;strong&gt;The part of his framing worth keeping is the economics: humans abandon wikis because the maintenance burden grows faster than the value, and the LLM is the first maintainer that does not get bored.&lt;/strong&gt;&#xA;He traces the pattern back to &lt;a href=&#34;https://en.wikipedia.org/wiki/Memex&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Vannevar Bush&amp;rsquo;s Memex&lt;/a&gt;, where the unsolved part was exactly who would do the maintenance.&lt;/p&gt;&#xA;&lt;p&gt;What the idea file leaves out is the schedule.&#xA;The wiki&amp;rsquo;s operations run when you run them: you drop a source, the agent ingests it; you ask a question, the agent answers and files the answer back.&#xA;The wiki compounds, but only when you give it new material.&#xA;Continuous research is the same artifact with the human trigger removed: the loop finds the new sources on a schedule, advances the checkpoint, and ingest stops being a thing you remember to do.&lt;/p&gt;&#xA;&lt;p&gt;The implementation side is converging too.&#xA;&lt;a href=&#34;https://llm-wiki.net/&#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=llm-wiki.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-wiki&lt;/a&gt;, a plugin for Claude Code, Codex, and OpenCode built on the pattern, ships parallel research runs, a librarian pass that scores articles for staleness, and an audit that traces outputs back to raw sources.&#xA;Even there the runs are invocation-driven: the librarian can tell you the wiki has gone stale, but a human still decides to refresh it, and watched-source variants are being worked out in the idea file&amp;rsquo;s comment thread.&#xA;&lt;strong&gt;The wiki gives research a place to accumulate, and the loop gives it a reason to stay current; neither half works alone.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;This Does Not Contradict Pull-Based Learning&#xA;    &lt;div id=&#34;this-does-not-contradict-pull-based-learning&#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;#this-does-not-contradict-pull-based-learning&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In &lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; I argued that you should consume information on demand, when an actual task requires it, instead of on a schedule driven by fear.&#xA;Continuous research does not reverse that position.&#xA;It removes the reason the position was painful.&lt;/p&gt;&#xA;&lt;p&gt;The asymmetry that made keeping up impossible was that production compounds while your reading speed does not.&#xA;Continuous research moves the consumption to a system whose reading speed does scale.&#xA;&lt;strong&gt;The agent keeps up so that you can consume on demand.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Your behavior barely changes.&#xA;When a task arrives that touches a topic you track, you open the brief and read the current state, prepared in advance by something that reads at machine speed.&#xA;You are still pulling.&#xA;What changed is that the thing you pull from is your curated, current base instead of the raw web on a deadline.&lt;/p&gt;&#xA;&lt;p&gt;The reading you do take on is bounded and small: the weekly diff, a screen or two of what actually moved.&#xA;That is a digest you would pay for, and here it is a free byproduct of the loop.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Goes Wrong&#xA;    &lt;div id=&#34;what-goes-wrong&#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-goes-wrong&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The failure modes are the ones every autonomous system grows, plus one that is specific to durable documents.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A hallucination filed into the knowledge base is worse than one in a chat window.&lt;/strong&gt;&#xA;A wrong claim in a conversation scrolls away.&#xA;A wrong claim in a maintained document accumulates authority every day it remains, and every later run that reads the brief inherits it.&#xA;The defenses are mechanical: every claim carries a link, every link is verified by the run that writes it, sources are snapshotted, and anything you intend to act on gets spot-checked by you.&#xA;OpenAI itself warns that deep research outputs &lt;a href=&#34;https://en.wikipedia.org/wiki/Deep_research&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;hallucinate&lt;/a&gt;, and outside reviewers note that verifying a generated analysis can itself take hours; in a continuous system that verification is amortized across runs and spent on the diff, not the whole report.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Topic rot.&lt;/strong&gt;&#xA;A topic file written last year encodes last year&amp;rsquo;s questions.&#xA;The tracker keeps diligently researching things you no longer care about, because a change in what you care about is not something the scheduler can detect.&#xA;The defense is treating the topic list like a backlog: prune it on a schedule, and treat a brief you have not read the diff of in a month as a candidate for deletion.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Hoarding.&lt;/strong&gt;&#xA;A knowledge base that grows faster than you read it is a form of procrastination.&#xA;The question to ask is blunt: what is the value of keeping a knowledge base whose content you never consume?&#xA;None, because the value of the base is realized when you read it, not when the agent maintains it.&#xA;An unread topic is all cost, compute, diff noise, and the illusion of being informed.&#xA;If the diff sits unread for four consecutive weeks, the topic is not informing decisions and should be cut, exactly the discipline a reading funnel demands.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cost runaway.&lt;/strong&gt;&#xA;An autonomous web-browsing loop on a timer can go from &amp;ldquo;it seemed useful&amp;rdquo; to a surprisingly large bill.&#xA;The budget belongs in the loop&amp;rsquo;s frontmatter, with a cap on runs per day and cost per run, and the runtime should enforce it rather than warn about it.&#xA;This is the same argument as the budget field in &lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt;, with the stakes unchanged.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bottleneck Moves to Topic Selection&#xA;    &lt;div id=&#34;the-bottleneck-moves-to-topic-selection&#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-bottleneck-moves-to-topic-selection&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the finding, reading, and filing are automated, the constraint moves, in the way &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; describes for every other layer agents absorb.&#xA;Deciding what to track becomes the bottleneck, and it is the most human layer of the whole stack.&lt;/p&gt;&#xA;&lt;p&gt;A topic file is a small statement of identity: these are the questions I need current answers to, these are the sources I trust.&#xA;That is editorial judgment, and it is the part that compounds.&#xA;The agent will never be better than your topic file at knowing what matters to you, which means the file deserves the same care you would give a skill you plan to run for years.&lt;/p&gt;&#xA;&lt;p&gt;The practical corollary: start with topics that inform decisions you actually make, where staleness has recently cost you something.&#xA;Tracking &amp;ldquo;large language models&amp;rdquo; is unusably broad and will produce vague, generic output.&#xA;Tracking &amp;ldquo;context window pricing across providers, monthly&amp;rdquo; produces a brief you will open before every infrastructure decision.&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;p&gt;Pick one topic that goes stale quickly and that an actual, recurring decision depends on.&#xA;Write its topic file: scope, questions, canonical sources, and what a meaningful change looks like.&#xA;Create the directory, with a brief, a log, and a snapshots folder, and seed the brief with one deep research run you verify by hand.&#xA;Schedule a weekly loop with a budget, and have each run advance the checkpoint, update the brief, and commit the diff.&#xA;Read only the diff.&lt;/p&gt;&#xA;&lt;p&gt;Then leave it alone for a month.&#xA;If the diffs were worth the minute they took to read, add the second topic.&#xA;If they were not, the experiment cost you one directory and a few dollars of API spend, and you learned where your actual information needs are, more cheaply than any course could have taught you.&lt;/p&gt;&#xA;&lt;p&gt;The goal is not a bigger pile of reports.&#xA;&lt;strong&gt;The goal is never having to research anything from zero again.&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;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the pull-based consumption strategy this article extends: the agent keeps up so you can consume on demand&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; - the scheduling format a research loop is written in, including the budget frontmatter that keeps the loop affordable&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the constraint-moving pattern that puts topic selection at the top of the research stack&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the per-run state file and digest patterns that make multiple research loops supervisable&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://en.wikipedia.org/wiki/Deep_research&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ChatGPT Deep Research&lt;/a&gt; - what one-shot deep research concretely is: autonomous 5-30 minute browsing runs, monthly query quotas, and the vendor&amp;rsquo;s own hallucination warnings&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.anthropic.com/news/research&#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=www.anthropic.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Anthropic, &amp;ldquo;Claude takes research to new places&amp;rdquo;&lt;/a&gt; - the agentic multi-search, citation-backed research model, and its scope limits per query&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2512.02038&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Shi et al., &amp;ldquo;Deep Research: A Systematic Survey&amp;rdquo;&lt;/a&gt; - the four-component decomposition (planning, acquisition, memory, generation) that shows exactly where continuity is missing&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.claude.com/docs/en/scheduled-tasks&#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=code.claude.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude Code documentation, &amp;ldquo;Scheduled tasks&amp;rdquo;&lt;/a&gt; - evidence that the scheduling primitive for agent loops already ships in mainstream tooling&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&#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=gist.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Karpathy, &amp;ldquo;LLM Wiki&amp;rdquo;&lt;/a&gt; - the idea file that named the artifact half of the pattern: compile knowledge once into an LLM-maintained wiki, plus the maintenance-economics argument&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://llm-wiki.net/&#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=llm-wiki.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-wiki&lt;/a&gt; - a productionized version of the LLM Wiki pattern for Claude Code, Codex, and OpenCode, including the librarian staleness pass and provenance audit&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Memex&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Memex&amp;rdquo;&lt;/a&gt; - Vannevar Bush&amp;rsquo;s 1945 vision of a personal, curated knowledge store, the pattern&amp;rsquo;s oldest ancestor&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/help/stats&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;arXiv usage statistics&lt;/a&gt; - the production side of the asymmetry: why one-shot research cannot keep up with the volume of new material&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Solo Is a Team Size: When Humans Still Earn a Seat in the Agentic Era</title>
      <link>https://tomrochette.com/solo-is-a-team-size/</link>
      <pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/solo-is-a-team-size/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>agents</category><category>team-management</category><category>collaboration</category><category>fully-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;One person directing a fleet of agents now produces more working software in a week than a small team produced a decade ago.&#xA;Every alignment meeting, every argument about conventions, every wait for a review starts to look like pure overhead.&#xA;The question I ask myself is whether working in a team still makes sense at all.&#xA;The question assumes that going solo means leaving teams behind.&#xA;It does not.&#xA;A solo operator running a fleet of agents is already working in a team, one human and N machines, with assignments, reviews, conventions, and all the coordination that implies.&#xA;The question is not team or no team.&#xA;&lt;strong&gt;The question is when a human should fill a seat at that table.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Your Fleet Is Already a Team&#xA;    &lt;div id=&#34;your-fleet-is-already-a-team&#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;#your-fleet-is-already-a-team&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;What would I actually do all day if I went solo?&#xA;I would write specifications, which are prompts, and delegate them, which is task assignment.&#xA;I would review what comes back, request changes, and resolve conflicts between agents working on the same files.&#xA;I would maintain conventions that every agent must follow and correct the ones that drift.&#xA;That is not a person quietly coding alone.&#xA;&lt;strong&gt;That is a team lead doing team lead work for a team that happens to be made of agents.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now audit which functions this team already covers, and which have no seat assigned.&lt;/p&gt;&#xA;&lt;p&gt;Execution is fully covered.&#xA;Agents turn a specification into working changes, at any hour, at any scale.&#xA;Give the fleet my worst idea and it returns that idea implemented fluently, with tests, in minutes.&#xA;&lt;strong&gt;That is the fleet doing its job well; reviewing the idea was never its job.&lt;/strong&gt;&#xA;Direction would have a single seat, mine, and execution would treat whatever leaves that seat as settled, which is exactly what execution should do.&#xA;The same property appears in prose, as &lt;a href=&#34;https://tomrochette.com/what-the-author-brings-when-the-model-writes/&#34; &gt;What the Author Brings When the Model Writes&lt;/a&gt; observes: the model can produce anything, which is why the deciding is separate from the producing.&lt;/p&gt;&#xA;&lt;p&gt;The reasons behind past decisions would live in one head, mine.&#xA;The agents would hold exactly the conventions I encode, and the why would survive only if I wrote it down, which would make the whole operation one node until the records make it more.&#xA;The node does not need to fail dramatically.&#xA;The node just needs to take a vacation.&lt;/p&gt;&#xA;&lt;p&gt;And the review of my own direction would run through the same head that chose it.&#xA;My errors would pass my own review at a rate that should terrify anyone who has reread their own writing a day later.&lt;/p&gt;&#xA;&lt;p&gt;The overhead I would escape by going solo is the delivery mechanism for direction review, shared memory, and second eyes.&#xA;It would not disappear; it would convert into gaps that surface later and cost more.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Encode the Practices Before Adding Headcount&#xA;    &lt;div id=&#34;encode-the-practices-before-adding-headcount&#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;#encode-the-practices-before-adding-headcount&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first move is not to hire.&#xA;The first move is to import the team practices that make any team function, because applied to a fleet they are what make solo work at scale.&lt;/p&gt;&#xA;&lt;p&gt;Write the specification before the code, because the prompt is the source code, and the fleet executes the specification it is given, no more and no less.&#xA;Encode conventions as gates and skill files that execute on every change instead of review comments that depend on someone remembering to say them, the move &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; argues for and &lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt; describes as institutional memory that runs itself.&#xA;Demand evidence with every delivery, a failing test turned green, a recording, a benchmark, so that acceptance stops being a matter of opinion and starts being a check, the contract &lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; asks of any fast producer.&#xA;Write decisions down, one paragraph each, so the why survives outside your head.&lt;/p&gt;&#xA;&lt;p&gt;A fleet with specs, gates, evidence, and records is a team with a functioning culture.&#xA;&lt;strong&gt;Most of what made teams feel like overhead was the delivery cost of these four things, and agents let you pay that cost once, in code, instead of forever, in meetings.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When It Makes Sense to Be a Human Team&#xA;    &lt;div id=&#34;when-it-makes-sense-to-be-a-human-team&#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;#when-it-makes-sense-to-be-a-human-team&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Now the original question can be asked precisely: when does a seat need a human?&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Mythical_Man-Month&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Brooks made the accounting fifty years ago&lt;/a&gt;: n people create n(n-1)/2 communication channels, and every channel taxes alignment.&#xA;The economics changed.&#xA;An agent seat executes without needing alignment and pays no channel tax; a human seat pays the full tax and must contribute enough direction, memory, and accountability to cover it.&#xA;&lt;strong&gt;A human seat has to earn its place against near-free, and it earns it in the three roles the fleet does not perform.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Three conditions cover most of the cases.&lt;/p&gt;&#xA;&lt;p&gt;Here is how I now run the seat decision for every opening on the team:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    S[A seat to fill] --&amp;gt; Q1{Does the work have an oracle}&#xA;    Q1 --&amp;gt;|yes, correctness is checkable| A[Agent seat]&#xA;    Q1 --&amp;gt;|no, it is judgment| H[Human seat]&#xA;    S --&amp;gt; Q2{Does the context fit in one head}&#xA;    Q2 --&amp;gt;|yes| A&#xA;    Q2 --&amp;gt;|no, the product outgrew one head| H&#xA;    S --&amp;gt; Q3{Are the stakes affordable and reversible}&#xA;    Q3 --&amp;gt;|yes| A&#xA;    Q3 --&amp;gt;|no, a one-way door| H&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;The work has no oracle.&lt;/strong&gt;&#xA;An agent can verify against a check: tests that pass, a spec that matches, a conflict with a mechanical resolution.&#xA;When correctness is machine-checkable, fill the seat with an agent and not worry.&#xA;When the work is direction, intent, or taste, when the question is whether the thing should exist, there is no oracle, only judgment.&#xA;An agent executes the plan it is given; a human can question the plan itself.&#xA;&lt;a href=&#34;https://tomrochette.com/who-resolves-the-merge-conflict/&#34; &gt;Who Resolves the Merge Conflict?&lt;/a&gt; draws the same line inside a single pull request: mechanical conflicts go to the bot, semantic ones need someone who holds intent.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The context exceeds one head.&lt;/strong&gt;&#xA;A product accumulates more surface than any single person holds, and past some size the single node becomes the constraint no matter how fast the fleet executes.&#xA;A second head is replication: another copy of the why, the failure modes, and the customer reality, which is why the node can finally take a vacation.&#xA;Below that size, the second head mostly duplicates what you already know, and the channel tax buys little.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The stakes need a counterparty.&lt;/strong&gt;&#xA;Some decisions are irreversible or expensive enough that one confident brain, machine-amplified, should not make them alone.&#xA;A name beside yours on the decision is not ceremony; it is a second signature on the one-way doors, and it is also what accountability requires when something eventually breaks.&#xA;Accountability is a role agents do not hold: an agent executes, and a person answers for what was decided.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Ownership has no seat.&lt;/strong&gt;&#xA;Add the three conditions together and the sum is ownership: deciding what the work is, remembering why it exists, and answering for it.&#xA;In a company, ownership survives the owner: when someone is away or leaves, the work is reassigned, and someone else takes responsibility for keeping it functioning.&#xA;The company is the container that keeps ownership continuous; individuals are stewards who hold it for a while and pass it on.&#xA;A solo setup has no container.&#xA;The owner and the person are the same thing, so absence does not reassign the work; it orphans it.&#xA;The fleet keeps executing, patches, deploys, alerts handled, but execution is not ownership.&#xA;&lt;strong&gt;A system can keep running and still be abandoned, because ownership means someone answers for it, and no agent holds that role.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The partial answers are all transfer artifacts.&#xA;Decision records, runbooks, and specifications make the why inheritable, so a successor can pick the work up without the owner&amp;rsquo;s head.&#xA;Opening the source turns the community into a container of last resort.&#xA;Naming an inheritor, even informally, converts the orphan case into a handoff waiting to happen.&#xA;None of these fully solves it.&#xA;&lt;strong&gt;Ownership continuity for the solo operator is still an open problem, and pretending the fleet solves it is how systems get abandoned while they still appear to be working.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Notice what the seat decision does to hiring logic.&#xA;Teams used to add humans for hands, and hands are now near-free, so the remaining reasons to add a human are direction, memory, and accountability.&#xA;&lt;a href=&#34;https://rework.withgoogle.com/print/guides/5727380657274880/&#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=rework.withgoogle.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google&amp;rsquo;s Project Aristotle&lt;/a&gt; found that the strongest predictor of human team effectiveness is psychological safety, which is precisely the capacity for dissent to occur.&#xA;The finding reads as a warning here: a human seat without safety produces agreement instead of judgment, and agreement is a contribution the fleet already supplies.&#xA;And the solo fleet is the limiting case, &lt;a href=&#34;https://en.wikipedia.org/wiki/Groupthink&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;groupthink&lt;/a&gt; with an n of one, a team where dissent holds no seat at all.&lt;/p&gt;&#xA;&lt;p&gt;The human team that remains is therefore small, three to five people owning a domain end to end as &lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; argues, but the staffing question inverts.&#xA;Do not ask how much the candidate can produce.&#xA;Ask where the candidate will disagree with you, and whether that disagreement will be right often enough to pay its channel tax.&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;p&gt;If you run a fleet, or are weighing one, audit it as a team this week.&#xA;Trace the path your worst current idea would take through it, station by station, and count the places where the plan itself can be challenged.&#xA;If the count is zero, you have found the gap, and it is in the design, not in the agents.&lt;/p&gt;&#xA;&lt;p&gt;Then decide deliberately where judgment enters.&#xA;If your work has an oracle, is reversible, and fits in one head, stay solo and stop feeling guilty about it; the fleet plus encoded process is genuinely a team.&#xA;If any of the three conditions applies, no oracle, context overflow, one-way doors, buy a human seat in whatever dose makes sense: a paid reviewer for the consequential changes, a community that will tell you the idea is bad while it is still cheap to kill, a co-founder for the direction itself.&lt;/p&gt;&#xA;&lt;p&gt;For everything you own, write the handoff paragraph: what it is, why it exists, who inherits it.&#xA;The paragraph converts ownership from a property of your presence into an artifact, the same move as every other practice in this piece, and it is the closest thing solo work currently has to succession.&lt;/p&gt;&#xA;&lt;p&gt;And if you build a team, staff it for the disagreements.&#xA;&lt;strong&gt;You were never choosing between working alone and working with people; you were deciding, seat by seat, what each kind of worker is for.&lt;/strong&gt;&#xA;Agents are for the work.&#xA;Humans are for the judgment that decides what the work is for.&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;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - the design of the small human team that remains once seats are filled for dissent instead of hands&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;../the-prompt-is-the-source-code/index.md&#34; &gt;The Prompt Is the Source Code&lt;/a&gt; - the specification as the management artifact of an agent fleet, the first practice a solo operator imports&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/you-are-the-bottleneck/&#34; &gt;You Are the Bottleneck&lt;/a&gt; - the review contract that turns acceptance from opinion into check, and the queue math once generation is cheap&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-resolves-the-merge-conflict/&#34; &gt;Who Resolves the Merge Conflict?&lt;/a&gt; - the oracle versus no-oracle split inside a single pull request, the same line that decides human versus agent seats&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-maintains-the-slop/&#34; &gt;Who Maintains the Slop?&lt;/a&gt; - the ownership question for generated code: who stays attached after the fleet produces it&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://en.wikipedia.org/wiki/The_Mythical_Man-Month&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fred Brooks, &amp;ldquo;The Mythical Man-Month&amp;rdquo; (Wikipedia)&lt;/a&gt; - the channel-counting math that human seats must now pay for against agent seats that coordinate at near-zero cost&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rework.withgoogle.com/print/guides/5727380657274880/&#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=rework.withgoogle.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google re:Work, &amp;ldquo;Guide: Understand team effectiveness&amp;rdquo;&lt;/a&gt; - Project Aristotle&amp;rsquo;s finding that psychological safety, the capacity for dissent, is the top predictor of team performance&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Groupthink&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Groupthink (Wikipedia)&lt;/a&gt; - what absent dissent does to group decisions, the dynamic a solo fleet embodies when no seat is assigned to it&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Six Months with OpenChamber</title>
      <link>https://tomrochette.com/six-months-with-openchamber/</link>
      <pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/six-months-with-openchamber/</guid>
      <category>ai</category><category>llm</category><category>ai-agents</category><category>opencode</category><category>openchamber</category><category>tools</category><category>partially-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/openchamber/openchamber/releases/tag/v1.19.0&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber 1.19.0&lt;/a&gt; was released today, which makes this a good moment to look back.&#xA;I have used it almost daily since February 8.&#xA;Along the way I have opened 99 issues, and since April 16 I have had 29 pull requests merged.&#xA;&lt;strong&gt;I am still using it every day not because it is polished, but because its core loop is worth the friction, and because when the friction gets bad enough, I can fix it myself.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I use it for&#xA;    &lt;div id=&#34;what-i-use-it-for&#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-i-use-it-for&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;OpenChamber is an app built around &lt;a href=&#34;https://opencode.ai&#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=opencode.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenCode&lt;/a&gt;: sessions, worktrees, chat, files, and terminals in one surface.&#xA;I use a small part of it heavily.&#xA;I run multiple agent sessions in parallel against the same repositories, and I let OpenChamber own the &lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;worktree&lt;/a&gt; management.&#xA;Each session gets its own checkout and its own branch, and I control all of them from one place.&#xA;Six months of this setup adds up to roughly 2,430 sessions across 61 projects, 54,000 messages, and 3.8 billion tokens, on models that moved from GLM 4.7 to GLM 5.3.&lt;/p&gt;&#xA;&lt;p&gt;Because OpenChamber is always open, it also works as a scratchpad.&#xA;When I have a thought, I switch to the right project, write down a few lines, and let a session work on it.&#xA;&lt;strong&gt;The 99 issues I mentioned were mostly built that way: I describe the problem, and the session turns it into a detailed issue, sometimes with a follow-up comment containing code investigation.&lt;/strong&gt;&#xA;An idea that would otherwise have stayed a passing annoyance becomes an artifact, within minutes, inside the same window.&lt;/p&gt;&#xA;&lt;p&gt;Input is also moving away from the keyboard.&#xA;I use &lt;a href=&#34;https://github.com/cjpais/handy&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Handy&lt;/a&gt;, a speech-to-text tool, more and more to talk to the agent, which speeds up iteration.&#xA;And sometimes talking to the agent is simply how the work continues while my hands are full, eating.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Iterating on ideas got a lot faster once trying a third approach meant spawning one more session instead of stashing and switching by hand.&lt;/strong&gt;&#xA;That single property is why I adopted OpenChamber and why I have not stopped.&#xA;It is also the last part I would give up.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The reliability tax&#xA;    &lt;div id=&#34;the-reliability-tax&#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-reliability-tax&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The hardest part of these six months has been that the chat, the one component whose entire job is to hold a long-running conversation, was sometimes unreliable.&lt;/strong&gt;&#xA;The causes were varied.&#xA;Sending a message to a session whose worktree was still being created blocked until the post-creation commands finished, so a message sent at the wrong moment just sat there.&#xA;At other times the connection between OpenChamber and OpenCode dropped, and a few breakages were regressions in OpenCode itself that surfaced downstream in OpenChamber.&lt;/p&gt;&#xA;&lt;p&gt;The text editor had its own stretch of problems.&#xA;It glitched, and it regularly refused to open files it decided were outside the workspace or project, even when they were not.&#xA;Both classes of problems got addressed over the months.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What still bothers me&#xA;    &lt;div id=&#34;what-still-bothers-me&#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-still-bothers-me&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;My main gripe today is the terminal implementation.&#xA;Terminal sessions end up closed on their own, which is exactly the failure mode a tool like this should never have, because a terminal holds state you cannot reconstruct.&#xA;On Linux, opening the terminal sidebar sometimes shows nothing at all, and the workaround is creating another terminal.&lt;/p&gt;&#xA;&lt;p&gt;The editing experience is my other daily friction.&#xA;The early glitching got fixed, but typing and file navigation in the built-in editor remain clunky next to &lt;a href=&#34;https://code.visualstudio.com&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;VS Code&lt;/a&gt;.&#xA;OpenChamber also ships as a VS Code extension, which I have never tried, because the point of OpenChamber for me is steering agents from one surface, not working in two.&#xA;&lt;strong&gt;The practical cost is that I keep an editor open to review diffs before commits and to look at code from time to time, which is exactly the habit I should be trying to break.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Two smaller issues have simply persisted for months.&#xA;Project selection and filtering in dropdowns remain weak across the app.&#xA;And the file matcher behind the &lt;code&gt;@&lt;/code&gt; helper is still very bad, which is annoying in a tool where pointing an agent at the right file is a core interaction.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Fixing it yourself changes the math&#xA;    &lt;div id=&#34;fixing-it-yourself-changes-the-math&#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;#fixing-it-yourself-changes-the-math&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This is where the 29 pull requests matter.&#xA;A bug in a closed tool blocks you: you file it, you wait, and meanwhile you work around it.&#xA;&lt;strong&gt;A bug in an open tool you already run every day is just a task, and the more it bothers you, the sooner you prioritize it.&lt;/strong&gt;&#xA;My 99 issues and 29 merged pull requests are the same friction recorded twice, once as a complaint and once as a fix.&lt;/p&gt;&#xA;&lt;p&gt;Merging is the part I control least.&#xA;Getting a pull request adopted in the main repository sometimes takes considerable effort, and some of mine are still sitting open.&#xA;Since I find those changes useful regardless, I maintain a local branch where I apply my unmerged pull requests and run ahead of upstream.&#xA;&lt;strong&gt;The tool I use daily is therefore slightly my own build: official releases plus the fixes I was not willing to wait for.&lt;/strong&gt;&#xA;It is a small patch queue, the same idea as a distro carrying packages ahead of upstream, and it comes with the same obligation to rebase and drop patches once they land upstream.&lt;/p&gt;&#xA;&lt;p&gt;The path a fix takes from annoyance to the build I actually run looks like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    F[Friction in daily use] --&amp;gt; I[Issue filed]&#xA;    I --&amp;gt; P[Pull request opened]&#xA;    P --&amp;gt;|merged upstream| U[Official release]&#xA;    P --&amp;gt;|still open| B[Local patch branch]&#xA;    B --&amp;gt;|rebased and dropped once upstream lands| U&lt;/pre&gt;&#xA;&lt;p&gt;The relationship with the tool changes as well.&#xA;I am no longer only a user deciding whether to stay or leave.&#xA;I am a stakeholder: when a release like 1.19.0 ships with fixes from a handful of outside contributors, I read the notes looking for the parts of the app I care about.&#xA;That is a much better position than complaining in an issue tracker.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Should you use it&#xA;    &lt;div id=&#34;should-you-use-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;#should-you-use-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If you run one agent at a time in a terminal, you probably do not need OpenChamber yet.&#xA;If you juggle several agents against the same repositories, parallel sessions plus automatic worktree management alone justify the setup cost, and idea iteration gets visibly faster.&#xA;Go in expecting it to be imperfect.&#xA;&lt;strong&gt;Then check whether the problem that would bother you most is one you are willing to fix yourself, because that question decides what kind of experience you will have.&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;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow&lt;/a&gt; - where OpenChamber sits in my overall setup and why the skills are the part that compounds&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the supervision problem that running parallel sessions creates&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the argument behind the diff-reading habit I should be breaking&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://github.com/openchamber/openchamber&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber&lt;/a&gt; - the repository I have been using and contributing to&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/openchamber/openchamber/releases/tag/v1.19.0&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber 1.19.0 release notes&lt;/a&gt; - the release that prompted this retrospective&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opencode.ai&#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=opencode.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenCode&lt;/a&gt; - the coding agent OpenChamber is built around&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;git worktree&lt;/a&gt; - the mechanism behind per-session isolation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>You Are the Bottleneck: What to Do When Your Coworker&#39;s LLMs Outproduce Your Review</title>
      <link>https://tomrochette.com/you-are-the-bottleneck/</link>
      <pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/you-are-the-bottleneck/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>llm</category><category>pull-request</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Your coworker opens pull requests faster than you can read them.&#xA;Every morning the queue is longer than when you left.&#xA;Their work accumulates behind your name, and everyone can see whose approval is missing.&#xA;&lt;strong&gt;You are not the bottleneck.&lt;/strong&gt;&#xA;&lt;strong&gt;The process that routes every change through one human reader is the bottleneck, and no amount of reading faster will fix it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The setup is now ordinary.&#xA;More than one in five code reviews on GitHub already &lt;a href=&#34;https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;involve an agent&lt;/a&gt;, and a developer driving an LLM can open ten plausible pull requests in the time it takes you to properly review two.&#xA;The gap between arrival and departure is not a temporary spike.&#xA;The gap is the new steady state, and it needs a structural answer from both sides of the queue.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Math Ends Badly on Its Own&#xA;    &lt;div id=&#34;the-math-ends-badly-on-its-own&#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-math-ends-badly-on-its-own&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Review is a queue.&#xA;Changes arrive at your coworker&amp;rsquo;s production rate and leave at your review rate.&#xA;When arrival exceeds service, the queue grows without bound, which is what happens to your inbox.&lt;/p&gt;&#xA;&lt;p&gt;The failure is one queue with a single server:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Arrival of pull requests at generation speed crosses the flat human review rate, and the shaded queue grows without bound until reviews become rubber stamps&#34;&#xA;    src=&#34;https://tomrochette.com/you-are-the-bottleneck/images/review-queue.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;The instinctive response is to raise your service rate: read faster, review longer hours, take fewer breaks.&#xA;Queueing theory says why that response fails even when it works.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Kingman%27s_formula&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Kingman&amp;rsquo;s formula&lt;/a&gt; says that waiting time grows with variability divided by spare capacity, so as your utilization approaches one hundred percent, waits increase nonlinearly.&#xA;A reviewer at eighty percent capacity has a manageable queue.&#xA;The same reviewer at ninety-seven percent, which is what &amp;ldquo;keeping up&amp;rdquo; actually demands, has waits measured in days.&#xA;&lt;strong&gt;A process that only functions when you are never tired, never in a meeting, and never sick is not a process; it is a delayed failure.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;There is a second failure that follows the first.&#xA;An overloaded reviewer does not stop reviewing, the reviewer degrades first.&#xA;You skim.&#xA;You approve what the tests already cover.&#xA;You rubber-stamp the fourth pull request of the evening.&#xA;&lt;strong&gt;The queue does not just grow, it silently stops protecting anything, because code merged by a rubber stamp appears reviewed without being reviewed.&lt;/strong&gt;&#xA;Rubber-stamped merges are worse than a visible backlog: the backlog at least admits the work is not being checked.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Reframe&#xA;    &lt;div id=&#34;the-reframe&#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-reframe&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The useful way to look at this is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;theory of constraints&lt;/a&gt;.&#xA;A system&amp;rsquo;s constraint sets its throughput, and the prescribed moves are to exploit the constraint (spend constraint time only on work only the constraint can do), elevate the constraint (add capacity or automation), and subordinate everything else to the constraint (upstream steps keep the constraint fed with work worth its time).&lt;/p&gt;&#xA;&lt;p&gt;Read that list again with names attached.&#xA;The constraint is you.&#xA;Exploiting the constraint means your reading time goes only to changes that genuinely need human judgment.&#xA;Elevating the constraint means automated gates absorb what does not need your eyes.&#xA;Subordinating to the constraint means your coworker&amp;rsquo;s job changes: keep the queue full of cheap-to-judge, high-value changes instead of merely full.&lt;/p&gt;&#xA;&lt;p&gt;Guilt is the wrong response to being the constraint, and so is heroics.&#xA;&lt;strong&gt;Bottleneck is a role in a system, not a verdict on a person, and roles can be redesigned.&lt;/strong&gt;&#xA;The question stops being &amp;ldquo;how do I review faster&amp;rdquo; and becomes &amp;ldquo;what should be allowed to arrive at this queue at all, and how should the queue drain&amp;rdquo;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Your Coworker Should Do&#xA;    &lt;div id=&#34;what-your-coworker-should-do&#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-your-coworker-should-do&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When generation is cheap, producing more changes is trivial and producing mergeable changes is the actual work.&#xA;&lt;strong&gt;Your coworker&amp;rsquo;s job is no longer to produce changes; the job is to produce changes that are cheap to say yes to.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Measure time-to-merge, not pull requests opened.&#xA;A pull request that sits for a week is not output, it is inventory, and inventory that waits long enough turns into rebase conflicts and stale specs.&lt;/p&gt;&#xA;&lt;p&gt;Concretely, every pull request should arrive with four things.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A specification written before the code.&lt;/strong&gt;&#xA;Acceptance criteria that existed before generation started, not a description reverse-engineered from the diff afterward.&#xA;Reviewing a plan takes minutes; reviewing an unexplained implementation takes an hour, and the plan is where your disagreement is cheap.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Evidence that the change works.&lt;/strong&gt;&#xA;A failing test turned green by the fix, a before-and-after recording, a benchmark.&#xA;A fix is not fixed until something independent of the model says so, which is &lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;the acceptance gap&lt;/a&gt; in miniature.&#xA;Evidence converts your review from &amp;ldquo;verify by hand&amp;rdquo; to &amp;ldquo;check the verification&amp;rdquo;, and those tasks differ by an order of magnitude in cost.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;An annotation of the risk.&lt;/strong&gt;&#xA;A self-review pass that flags the dangerous hunks, states the blast radius, and says which parts the coworker is unsure about.&#xA;The risk annotation is the single most effective habit of the four, because it tells you where your scarce attention belongs and proves a human actually read the output before demanding that you do.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A summary that enables a thirty-second judgment.&lt;/strong&gt;&#xA;What changed, why, what could break, how to roll it back.&lt;/p&gt;&#xA;&lt;p&gt;Beyond per-PR discipline, two structural commitments matter more.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Respect a work-in-progress limit.&lt;/strong&gt;&#xA;At most two or three open pull requests at a time.&#xA;When the cap is reached, the surplus capacity goes to writing tests, improving gates, and refining the next spec, not to opening a fourth PR that will age out in the queue.&#xA;&lt;strong&gt;The most productive use of a fast producer&amp;rsquo;s spare time is reducing the review burden itself: gates, encoded conventions, and tooling that make every future change cheaper to judge, not just the producer&amp;rsquo;s own.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Stay attached after merge.&lt;/strong&gt;&#xA;Bugs in generated code route back to the generator for a window of time, because the person who captured the benefit of fast production should carry the first round of the cost.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What You Should Do&#xA;    &lt;div id=&#34;what-you-should-do&#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-you-should-do&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Your side of the contract is to stop being a per-diff reader and become the designer of how the queue drains.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Classify instead of read.&lt;/strong&gt;&#xA;A README typo and a schema migration are both pull requests and do not need the same gate.&#xA;Compute blast radius and reversibility per change, auto-merge the low-risk class on green, and hold only the risky minority for human eyes.&#xA;The majority of what arrives is routine, and routine work is what machines are for.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Encode your recurring comments.&lt;/strong&gt;&#xA;Every review comment you have written more than twice is a gate you have not built yet.&#xA;Complexity limits, dead code detection, coverage thresholds, forbidden dependency classes.&#xA;Each encoded check is a category of attention you never spend again, and a category of queue pressure that disappears permanently.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Move your attention upstream.&lt;/strong&gt;&#xA;Review the spec before the code is generated, not the diff after.&#xA;Ten minutes on a plan prevents an hour on a wrong implementation, and your disagreement lands while it still costs a conversation instead of a rework.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Match your coworker&amp;rsquo;s tools.&lt;/strong&gt;&#xA;Your coworker generates with a model; you triage with one.&#xA;Running a first-pass review that flags anomalies, summarizes each diff, and ranks the queue by risk is not cheating, it is symmetrical.&#xA;A pipeline where one side is machine-accelerated and the other is capped at human reading speed is broken by construction, whether the asymmetry is malicious or accidental.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Batch reviews into fixed windows.&lt;/strong&gt;&#xA;Two scheduled review blocks a day, instead of interrupt-driven approval sessions.&#xA;Predictable service beats heroic bursts because Kingman&amp;rsquo;s formula punishes variability itself, and every interruption you remove shrinks the waits more than the raw time saved suggests.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make the queue visible.&lt;/strong&gt;&#xA;Arrival rate versus service rate, time-to-merge, queue depth, on a dashboard both of you see.&#xA;Numbers turn a feels-bad conversation (&amp;ldquo;you are slow&amp;rdquo;, &amp;ldquo;you flood me&amp;rdquo;) into an engineering conversation (&amp;ldquo;our arrival rate is triple our service rate, so we change one of them&amp;rdquo;).&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What You Agree On Together&#xA;    &lt;div id=&#34;what-you-agree-on-together&#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-you-agree-on-together&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fix is a contract, not a truce.&lt;/p&gt;&#xA;&lt;p&gt;Define merge-ready: the checklist a pull request satisfies before it even enters your queue.&#xA;Set the WIP limit at your sustainable service rate, and treat the limit as the throttle that keeps arrival below service.&#xA;Agree on the escalation path for the small set of changes (the irreversible ones, the trust-boundary ones) that deserve synchronous human attention while your coworker waits.&#xA;Agree on where surplus producer capacity goes when the queue is full, because idle generation capacity pointed at more PRs is how the problem restarts.&lt;/p&gt;&#xA;&lt;p&gt;Then change what you both measure.&#xA;&lt;strong&gt;The unit of team output is merged changes, not opened pull requests&lt;/strong&gt;, and every metric that rewards opening over merging rebuilds the queue you just dismantled.&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;p&gt;Tomorrow, your coworker attaches the four things (spec, evidence, risk annotation, summary) to every new pull request, and you classify the existing backlog into auto-merge-gate versus needs-my-eyes, resolving nothing yet, just sorting.&lt;/p&gt;&#xA;&lt;p&gt;This week, set the WIP limit and move your two most-repeated review comments into CI.&lt;/p&gt;&#xA;&lt;p&gt;This month, make spec review the meeting that replaced diff review, and put time-to-merge on the dashboard next to queue depth.&lt;/p&gt;&#xA;&lt;p&gt;The queue was never a verdict on how fast you read.&#xA;The queue is a design decision your team made without noticing, and a decision made by accident can be made on purpose.&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;https://tomrochette.com/you-cannot-out-review-a-machine-by-hand/&#34; &gt;You Cannot Out-Review a Machine by Hand&lt;/a&gt; - the same queue math in its adversarial form, where the tooling asymmetry is deliberate rather than accidental&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - how to classify changes by blast radius so only the risky minority needs a human approval&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the case that judgment belongs upstream in specifications and gates rather than downstream in diffs&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - what counts as independent evidence that a change works, the evidence your coworker should attach to every pull request&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-maintains-the-slop/&#34; &gt;Who Maintains the Slop?&lt;/a&gt; - why the generator must stay attached to the code after it merges, the ownership window this article&amp;rsquo;s contract requires&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://en.wikipedia.org/wiki/Kingman%27s_formula&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Kingman&amp;rsquo;s formula&lt;/a&gt; - the queueing result that explains why waits explode as utilization approaches one hundred percent&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Theory of constraints&lt;/a&gt; - the exploit, elevate, subordinate framework applied to the reviewer as the constraint&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Queueing_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Queueing theory&lt;/a&gt; - the general study of arrival and service rates, the model underneath the review queue&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub Blog, &amp;ldquo;Agent pull requests are everywhere&amp;rdquo;&lt;/a&gt; - the data showing agent-generated pull requests are already a large fraction of reviews&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>You Cannot Out-Review a Machine by Hand</title>
      <link>https://tomrochette.com/you-cannot-out-review-a-machine-by-hand/</link>
      <pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/you-cannot-out-review-a-machine-by-hand/</guid>
      <category>ai</category><category>llm</category><category>software-engineering</category><category>review</category><category>productivity</category><category>negotiation</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A counterparty who uses LLMs to generate changes, documents, and requests has a throughput you cannot match by hand.&#xA;&lt;strong&gt;If they then forbid you from using LLMs to review that same work, they have not raised the quality bar; they have rigged the queue.&lt;/strong&gt;&#xA;You will fall behind, and the falling behind is the point.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Setup&#xA;    &lt;div id=&#34;the-setup&#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-setup&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The pattern is specific.&#xA;On their side, a model drafts the pricing changes, the proposals, the redlines, the spec revisions, the follow-up questions, faster and in greater volume than any human would produce alone.&#xA;On your side, the same work arrives as items to read, reconcile, and answer.&#xA;And somewhere in the engagement letter, the process doc, or the spoken rule, there is a line: review must be human, no AI.&lt;/p&gt;&#xA;&lt;p&gt;The asymmetry is not accidental.&#xA;One side of the pipeline is unbounded.&#xA;&lt;strong&gt;The other is capped at the speed of a single person reading.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The rigged pipeline looks like this:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Model-assisted drafting climbs steeply while hand review stays capped, and the shaded gap of unread volume grows every hour&#34;&#xA;    src=&#34;https://tomrochette.com/you-cannot-out-review-a-machine-by-hand/images/review-race.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Math Is the Problem&#xA;    &lt;div id=&#34;the-math-is-the-problem&#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-math-is-the-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Review is a queue.&#xA;Items arrive at the producer&amp;rsquo;s production rate and leave at your review rate.&#xA;&lt;strong&gt;If production rate exceeds review rate, which it must when one side uses a model and the other does not, the queue grows without bound.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The only tool that could lift your review rate to match is the one being banned.&#xA;A model can triage a hundred documents, flag the three that matter, and summarize the rest in the time it takes you to open the first one.&#xA;That is exactly the capacity the rule removes from your side.&#xA;&lt;strong&gt;Forbid the reviewer&amp;rsquo;s LLM and you have not protected quality; you have guaranteed the reviewer cannot keep up.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is not a question of effort or discipline.&#xA;No amount of reading faster, working longer hours, or caring more will close a gap between a human&amp;rsquo;s reading speed and a machine&amp;rsquo;s generation speed.&#xA;The two rates are different categories.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Rule Is Never Applied to Production&#xA;    &lt;div id=&#34;the-rule-is-never-applied-to-production&#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-rule-is-never-applied-to-production&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every time I ask what justifies the rule, I get the same reasons.&#xA;Quality.&#xA;Confidentiality.&#xA;&amp;ldquo;I want an actual human looking at this.&amp;rdquo;&#xA;Trust.&lt;/p&gt;&#xA;&lt;p&gt;None of those reasons are applied to the producer.&#xA;If quality required a human, the producer&amp;rsquo;s output would be human-written too.&#xA;If confidentiality forbade a model, it would forbid the model on both sides.&#xA;&lt;strong&gt;A rule that binds only the reviewer is not a rule about quality; it is a rule about leverage.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The giveaway is the asymmetry itself.&#xA;A counterparty who genuinely believed human attention was the safeguard would insist on it for the work they send you, not only for the work you send back.&#xA;When the standard runs in one direction, the standard is a tactic.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Flood Is an Old Tactic; LLMs Made It Cheap&#xA;    &lt;div id=&#34;flood-is-an-old-tactic-llms-made-it-cheap&#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;#flood-is-an-old-tactic-llms-made-it-cheap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Overwhelming a reviewer with volume is one of the oldest leverage moves in negotiation and review.&#xA;Hide the clause in the volume, and exhaust the reader until they accept.&#xA;It used to cost considerable effort to produce that volume, which capped the abuse.&lt;/p&gt;&#xA;&lt;p&gt;LLMs removed the cap.&#xA;Producing fifty variations, fifty justifications, and fifty follow-up questions now costs minutes and cents.&#xA;&lt;strong&gt;The producer can flood at marginal cost while demanding the reviewer meet each item with marginal human effort.&lt;/strong&gt;&#xA;That is not a process; it is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Denial-of-service_attack&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;denial-of-service&lt;/a&gt; on your attention, presented as a quality standard.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Review Becomes on a Flood&#xA;    &lt;div id=&#34;what-review-becomes-on-a-flood&#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-review-becomes-on-a-flood&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the queue exceeds what a human can read carefully, the review degrades in one of two directions, and both favor the producer.&lt;/p&gt;&#xA;&lt;p&gt;You triage, skimming for flags, and the unflagged majority passes unread.&#xA;Or you tire, and you approve without checking.&#xA;Either way, the work ships with less scrutiny than a smaller, human-paced batch would have received.&#xA;&lt;strong&gt;The flood does not get reviewed more rigorously for being human-reviewed; it gets reviewed less, because humans have a finite attention budget and the producer is spending it for them.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The irony is precise.&#xA;The rule meant to guarantee careful human review is the rule that guarantees there is not enough human attention to go around.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Push Back on the Symmetry&#xA;    &lt;div id=&#34;push-back-on-the-symmetry&#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;#push-back-on-the-symmetry&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fix is not to read faster.&#xA;It is to refuse the asymmetric pipeline.&lt;/p&gt;&#xA;&lt;p&gt;If they produce with a model, you triage with one, or the queue is illegitimate.&#xA;Say it out loud, early, before the volume arrives.&#xA;&lt;strong&gt;A review process is only fair when both sides have comparable tools on the queue.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Make the producer carry the cost of their own volume.&#xA;Require a summary with every batch, written by them, stating what changed and what it means.&#xA;Require structured, machine-checkable submissions instead of free-form documents.&#xA;Cap the intake per day the way you would cap any rate-limited service.&#xA;If the volume is genuine, the producer can absorb the cost of making it reviewable; if it is tactical, the requirement exposes the tactic.&lt;/p&gt;&#xA;&lt;p&gt;And if the rule forbidding your LLM is non-negotiable, name it for what it is.&#xA;It is a one-sided throttle, and agreeing to it is agreeing to lose on the schedule.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Principle&#xA;    &lt;div id=&#34;the-principle&#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-principle&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Review is not a virtue test.&#xA;It is a throughput match between two sides of a pipeline.&#xA;&lt;strong&gt;Whoever sets the tooling asymmetry sets the outcome, and a reviewer forbidden the only tool that matches the production rate has already lost.&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;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the same production-versus-consumption asymmetry, applied to reading the field; this piece applies it to a single adversarial counterparty&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why line-by-line review of machine-generated work is low-leverage, the exact assumption the flood-and-forbid tactic exploits&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - why &amp;ldquo;produced&amp;rdquo; is not &amp;ldquo;accepted&amp;rdquo;; the gap is precisely where a flood-and-forbid tactic hides items you never truly reviewed&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the constraint-moving pattern; here the bottleneck is deliberately pinned on the reviewer and frozen there&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://en.wikipedia.org/wiki/Information_overload&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Information overload&lt;/a&gt; - the long-standing name for the underlying problem, here weaponized rather than accidental&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Denial-of-service_attack&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Denial-of-service attack&lt;/a&gt; - grounds the metaphor: exhaust a finite resource (reviewer attention) by overwhelming it with cheap requests&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Iterating on Agent Skills: The Loop That Keeps Them Improving</title>
      <link>https://tomrochette.com/iterating-on-agent-skills/</link>
      <pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/iterating-on-agent-skills/</guid>
      <category>ai</category><category>llm</category><category>agent-skills</category><category>workflow</category><category>skills</category><category>software-engineering</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A skill file is not done when it ships.&#xA;The first version of a &lt;code&gt;SKILL.md&lt;/code&gt; is a hypothesis: that this sequence of steps, sent to a model, will produce the result you want.&#xA;Hypotheses get tested every time the agent runs, and most hypotheses fail in small ways you only notice on the fifth or tenth run.&#xA;&lt;strong&gt;A skill is a depreciating asset, and the only thing that keeps it paying off is a deliberate loop you run on it after it ships: notice the failure, explain what happened to a fresh agent session, iterate with the agent on a patch, verify the patch, and periodically shrink the whole library back down.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The rest of this piece is that loop, in the order I run it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why skills decay&#xA;    &lt;div id=&#34;why-skills-decay&#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;#why-skills-decay&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Three forces pull at a skill from the day you write it, and any one of them is enough to make a good skill go stale.&lt;/p&gt;&#xA;&lt;p&gt;The model changes underneath it.&#xA;A skill that was necessary to spell out every step for last year&amp;rsquo;s model is over-specified for this year&amp;rsquo;s model, and the over-specification starts to fight the model instead of helping it.&lt;/p&gt;&#xA;&lt;p&gt;The task drifts.&#xA;The repo layout moves, the tool&amp;rsquo;s CLI changes, the team&amp;rsquo;s convention evolves, and the skill keeps calling the old path.&lt;/p&gt;&#xA;&lt;p&gt;And your own understanding improves.&#xA;Six months after writing the skill, you know a shorter, cleaner way to express the same instruction, but the file still holds the first, clunkier version.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A skill that nobody touches is a skill that is quietly getting worse, because the world around it is not standing still.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; makes the same argument about filters: the asset you built at the last model generation may be miscalibrated for the current generation, and you will not notice because the failure is silent.&#xA;Skills fail silently the same way.&#xA;The agent still produces output.&#xA;The output is just a little more wrong, a little more verbose, a little more off, and you compensate for the drift in your head without ever writing the fix back into the file.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The loop&#xA;    &lt;div id=&#34;the-loop&#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-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I run the same five-step loop on every skill, whether I noticed a failure today or I am doing a monthly sweep.&#xA;The order matters, because each step is cheap only if the previous step ran.&lt;/p&gt;&#xA;&lt;p&gt;My part of the loop is the noticing and the judgment.&#xA;The diagnosing and the patching belong to the agent, and the split is the point: I explain, the agent analyzes, and the skill gets fixed without me becoming the bottleneck the loop exists to remove.&lt;/p&gt;&#xA;&lt;p&gt;The cycle, and the split of labor inside it, looks like this.&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    S1[1. Notice the failure] --&amp;gt;|correction becomes a session| S2[2. Fresh session diagnoses]&#xA;    S2 --&amp;gt;|diagnosis picks the patch| S3[3. Iterate to a small patch]&#xA;    S3 --&amp;gt;|patch the skill, not the output| S4[4. Verify against the failed run]&#xA;    S4 --&amp;gt;|still failing| S1&#xA;    S4 --&amp;gt;|periodic sweep| S5[5. Shrink or delete]&#xA;    S5 --&amp;gt;|model catches up| S1&lt;/pre&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. Notice the failure&#xA;    &lt;div id=&#34;1-notice-the-failure&#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;#1-notice-the-failure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A skill only improves when one of its failures gets explained, and most failures never get explained.&lt;/p&gt;&#xA;&lt;p&gt;The default behavior after a bad run is to fix the output by hand, move on, and forget the skill was ever wrong.&#xA;The hand fix is the failure mode, because the next run will produce the same bad output the same way, and you will apply another hand fix.&lt;/p&gt;&#xA;&lt;p&gt;I do not keep failure notes, and I do not stop to work out what went wrong.&#xA;When the agent produces something I have to correct, I open a new agent session and explain what happened: the bad output, what I expected instead, and which skill produced the run.&#xA;The explanation is the whole capture.&#xA;Explaining takes a minute, needs no template, and the session holds the failure so I do not have to remember it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The rule is simple: if I had to correct the output, the skill has to hear about the correction.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The rule is the encoding loop from &lt;a href=&#34;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow&lt;/a&gt; turned outward.&#xA;There, the rule was that every time I caught myself remembering to do something, the reminder became a skill.&#xA;Here, the rule is that every time I catch myself correcting the agent, the correction becomes a session about the skill that produced the output.&#xA;Both rules turn a private, forgettable moment into a durable, improvable artifact.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;2. Explain it to a fresh session&#xA;    &lt;div id=&#34;2-explain-it-to-a-fresh-session&#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;#2-explain-it-to-a-fresh-session&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The session has to be new, and the newness does useful work.&#xA;The session that produced the bad output is the worst investigator of the bad output, because the agent in that session is attached to the reasoning that went wrong.&#xA;A fresh session reads the skill the way a new maintainer would, with no stake in the run that failed.&lt;/p&gt;&#xA;&lt;p&gt;My message states what happened, not why.&#xA;The bad output, what I expected instead, and anything about the run that surprised me.&#xA;Then I let the session read the skill and tell me what went wrong, and the diagnosis lands on one of a handful of causes.&lt;/p&gt;&#xA;&lt;p&gt;The skill was missing context the model needed.&#xA;It referenced a file that was not in scope, or assumed a convention that was never stated.&lt;/p&gt;&#xA;&lt;p&gt;The skill was over-specified.&#xA;It pinned a step-by-step recipe that the current model does better on its own, and the pin is now producing worse output than letting go.&lt;/p&gt;&#xA;&lt;p&gt;The skill was ambiguous.&#xA;Two reasonable readings of the same instruction exist, and the model picked the wrong reading.&lt;/p&gt;&#xA;&lt;p&gt;The skill called the wrong tool, or called the right tool the wrong way.&lt;/p&gt;&#xA;&lt;p&gt;Or the failure was not the skill at all.&#xA;The model was weaker than the skill assumed, the input was bad, or I asked for the wrong thing.&lt;/p&gt;&#xA;&lt;p&gt;The diagnosis matters because each cause gets a different patch.&#xA;Missing context gets added.&#xA;Over-specification gets cut.&#xA;Ambiguity gets rewritten with one clear reading.&#xA;A wrong tool call gets corrected.&#xA;And a failure that is not the skill&amp;rsquo;s fault gets parked, not patched, because editing a skill to compensate for a bad input is how skills accumulate defensive cruft they do not need.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Most skill decay is over-specification, not under-specification, and the instinct to add more instructions is usually wrong.&lt;/strong&gt;&#xA;The model is almost always more capable than the day the skill was written, and the smallest patch that fixes the failure class is very often a deletion.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;3. Iterate to a patch&#xA;    &lt;div id=&#34;3-iterate-to-a-patch&#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;#3-iterate-to-a-patch&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The agent writes the patch, and I iterate with the agent until the patch is right.&#xA;My job in the session is judgment, not authorship: keep the patch aimed at the failure class, and keep the patch small.&lt;/p&gt;&#xA;&lt;p&gt;The patch edits the &lt;code&gt;SKILL.md&lt;/code&gt;, not the output.&lt;/p&gt;&#xA;&lt;p&gt;The discipline is to patch the failure class, not the failing instance.&#xA;A patch that fixes one bad run without addressing the kind of bad run is a patch that will be re-applied, in a different form, to the next bad run, and to the bad run after that.&#xA;The skill accumulates special cases and never gets cleaner.&lt;/p&gt;&#xA;&lt;p&gt;Each iteration should end with a smaller diff, not a bigger one.&#xA;Add the one missing piece of context.&#xA;Rewrite the one ambiguous sentence.&#xA;Delete the step the model now does on its own.&#xA;A small patch is easy to review and easy to revert if the patch makes things worse; a large patch that tries to fix the skill end to end is almost always a sign the diagnosis was incomplete.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The patch is also where the skill gets shorter, not just longer.&lt;/strong&gt;&#xA;If the session cannot make the failing skill better without also making the skill longer, the session is probably patching a symptom.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;4. Verify&#xA;    &lt;div id=&#34;4-verify&#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;#4-verify&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A patched skill is another hypothesis, and a hypothesis that is not tested is a guess.&lt;/p&gt;&#xA;&lt;p&gt;The cheapest verification is to re-run the skill against the run that failed, and to read the new output for the specific problem the session was asked to fix.&#xA;If the explanation captured the failure well, the check takes a minute.&lt;/p&gt;&#xA;&lt;p&gt;For skills whose output can render, the pattern from &lt;a href=&#34;https://tomrochette.com/agent-skills-that-render/&#34; &gt;Teach Your Agent Skills to Use Tools That Render&lt;/a&gt; is worth it here.&#xA;A skill that emits a diagram, a table, or a diff is a skill I can verify by looking, and looking stays cheap when reading the prose would take too long.&#xA;A skill that emits only paragraphs is a skill I can only verify by reading, and reading is the bottleneck that started the whole problem.&lt;/p&gt;&#xA;&lt;p&gt;For skills that touch code, the verification runs the project&amp;rsquo;s own checks.&#xA;The linter, the type checker, the test suite.&#xA;The skill does not need its own separate verification when the repository already runs these checks, the same way &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; leans on objective signals from the tools rather than on a human re-reading every diff.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A skill without a verification step is a skill that drifts back to broken the moment you stop looking.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;5. Shrink or delete&#xA;    &lt;div id=&#34;5-shrink-or-delete&#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;#5-shrink-or-delete&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Shrink-or-delete is the step most people skip, and also the step that matters most over the long run.&lt;/p&gt;&#xA;&lt;p&gt;Every skill is a bet that the model cannot do the task reliably on its own.&#xA;The models keep getting better.&#xA;The bet that was correct when the skill was written is incorrect now for some percentage of the library, and that percentage grows every model generation.&lt;/p&gt;&#xA;&lt;p&gt;When a skill&amp;rsquo;s failures have stopped, and the agent produces the right output from a prompt alone, the skill no longer justifies the cost of keeping it.&#xA;The skill is scaffolding around a capability the model now holds on its own, and the right move is to take the scaffolding down, not maintain the skill.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow&lt;/a&gt; makes the same argument: the skills are a temporary scaffold for the gap between what the model can do today and what the model will do on its own tomorrow, and a good chunk of the work is knowing which scaffold to take down next.&lt;/p&gt;&#xA;&lt;p&gt;Shrinking applies within a single skill too.&#xA;A step that the model now does reliably on its own is a step that should leave.&#xA;An instruction that only existed to work around an old model limitation is an instruction whose time is up.&#xA;A skill that has not been shortened in six months is almost certainly carrying unnecessary instructions from a weaker model generation.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Deletion is not loss.&#xA;Deletion is the most positive outcome a skill can have, because deletion means the model now has the capability the skill was supporting.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The review sweep&#xA;    &lt;div id=&#34;the-review-sweep&#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-review-sweep&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;One failure at a time is too slow a pace to keep a library healthy, the same way one pull request at a time is too slow a pace to keep a codebase clean.&lt;/p&gt;&#xA;&lt;p&gt;I run a periodic sweep over the whole library, the same way &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; describes raking a codebase instead of chasing every leaf.&#xA;&lt;strong&gt;The sweep is a small set of questions asked of every skill, not the deep rewrite of any one skill.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Which skills have I not edited in three months?&#xA;Skills untouched for three months are the most likely to have decayed, because the world moved and the skill did not.&lt;/p&gt;&#xA;&lt;p&gt;Which skills reference files, tools, or paths that no longer exist?&#xA;Broken references are the cheapest bug to find and fix.&lt;/p&gt;&#xA;&lt;p&gt;Which skills overlap with each other?&#xA;Two skills that do almost the same thing should become one, because the duplication will drift and one will go stale while the other gets maintained.&lt;/p&gt;&#xA;&lt;p&gt;Which skills did I not run at all this month?&#xA;A skill that is never invoked is either redundant or forgotten, and both states are reasons to consider deletion.&lt;/p&gt;&#xA;&lt;p&gt;Which skills did I run but correct every time?&#xA;Skills that need correcting every run are the candidates for the next session.&lt;/p&gt;&#xA;&lt;p&gt;A sweep takes an hour and its value lasts a quarter, because each finding is an iteration the per-failure loop would have taken months to surface.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Skills about skills&#xA;    &lt;div id=&#34;skills-about-skills&#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;#skills-about-skills&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The loop has a recursive quality, because the compounding happens in the recursion.&lt;/p&gt;&#xA;&lt;p&gt;The act of iterating on a skill is itself a repeatable task, and repeatable tasks become skills.&#xA;I run a &lt;code&gt;review-skills&lt;/code&gt; pass that does the sweep described above.&#xA;I run an &lt;code&gt;improve-skill&lt;/code&gt; pass that takes a single skill and proposes high-value, low-risk patches to the skill.&#xA;The failure session from step 2 is the same move, held by hand: I supply the failure and the judgment, the agent supplies the analysis and the patch.&lt;/p&gt;&#xA;&lt;p&gt;The recursion is the multiplier.&#xA;&lt;strong&gt;Once the iteration loop is itself a skill, the library improves itself at the pace the agent can run, not the pace I can read.&lt;/strong&gt;&#xA;I still make the calls, because deciding which patch lands and which skill gets deleted is a judgment the model does not yet make well.&#xA;But the amount I have to remember shrinks every time an iteration step is encoded, and the part I do myself narrows to the calls that genuinely need judgment.&lt;/p&gt;&#xA;&lt;p&gt;The end state matches what &lt;a href=&#34;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt; describes for codebases, applied one layer up: a library of skills that observes its own failures, proposes its own patches, and shrinks itself as the model grows, with the human left only at the checkpoint that needs taste.&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;p&gt;Pick one skill you have already run more than five times.&#xA;Find the last run where you corrected the output.&#xA;Open a new agent session, paste the bad output, and explain what you expected instead.&#xA;You have just run steps 1 and 2 of the loop.&lt;/p&gt;&#xA;&lt;p&gt;Then let the session read the skill and propose the diagnosis: missing context, over-specification, ambiguity, or the wrong tool call.&#xA;Push the session until the patch is small and makes the skill shorter, and re-run the skill against the run that failed.&#xA;You have just run steps 3 and 4.&lt;/p&gt;&#xA;&lt;p&gt;If you cannot remember the last time a skill failed, you are either very lucky or, more likely, you have stopped noticing.&#xA;Run a sweep instead.&#xA;Open every skill, ask when the skill was last edited, and assume anything over three months old has decayed.&#xA;You will be right more often than not.&lt;/p&gt;&#xA;&lt;p&gt;And every quarter, ask which skills you can delete.&#xA;The library that only grows is the library that is losing, because the library is carrying scaffolding for problems the model has already solved.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The goal is not a large library.&#xA;The goal is a small library that is exactly the size of the gap between the model and the work, and a library that shrinks every time the model catches up.&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;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow: The Skills Are the Part That Compounds&lt;/a&gt; - the case that skills are the durable asset, and the encoding loop this piece turns outward onto the skills themselves&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agent-skills-that-render/&#34; &gt;Teach Your Agent Skills to Use Tools That Render&lt;/a&gt; - the verification step of the loop, made cheap by rendering output instead of writing more prose&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; - the sweep pattern, applied there to a codebase and here to the skill library&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 when the iteration loop on skills is itself automated&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the argument that any filter built at one model generation must be re-audited, which is exactly what the skill sweep does&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://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzx/agents&lt;/a&gt; - the skills library this loop is run against, including the &lt;code&gt;review-skills&lt;/code&gt; and &lt;code&gt;improve-skill&lt;/code&gt; passes that operationalize the sweep and the patch&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://agentskills.io&#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=agentskills.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Agent Skills format&lt;/a&gt; - the open skill format that makes each skill small enough to iterate on independently&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Anger Is a Tactic: How to Deal With People Who Use Aggression to Get Their Way</title>
      <link>https://tomrochette.com/anger-is-a-tactic/</link>
      <pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/anger-is-a-tactic/</guid>
      <category>workplace</category><category>leadership</category><category>team-management</category><category>conflict-resolution</category><category>psychology</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;You know the person.&#xA;The meeting gets tense, their voice rises, maybe a fist lands on the table, and within a minute the room gives in and they get their way.&#xA;Later someone whispers &amp;ldquo;that&amp;rsquo;s just how they are&amp;rdquo; and the decision stands.&lt;/p&gt;&#xA;&lt;p&gt;I never believed that framing.&#xA;&lt;strong&gt;Temper at work is rarely just an emotional reaction, it is a negotiation move, and the research on it is unusually clear: it extracts concessions from people who cannot walk away, it destroys value everywhere else, and it collapses the moment the target stops cooperating.&lt;/strong&gt;&#xA;Once you see it as a tactic, dealing with it stops being therapy and becomes strategy.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Outburst Is Making an Argument&#xA;    &lt;div id=&#34;the-outburst-is-making-an-argument&#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-outburst-is-making-an-argument&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Start with the finding that explains why the behavior persists: anger works, in the short term, on the people it is aimed at.&lt;/p&gt;&#xA;&lt;p&gt;In a series of classic experiments, negotiators who were told their opponent was angry conceded more than negotiators who were told the opponent was happy (&lt;a href=&#34;https://doi.org/10.1037/0022-3514.86.1.57&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef, De Dreu &amp;amp; Manstead, 2004&lt;/a&gt;).&#xA;The interesting part is the mechanism.&#xA;The targets were not scared into submission; they reasoned about it.&#xA;They read the anger as information about the opponent&amp;rsquo;s limit, concluded the opponent would not move, and adjusted their demands to avoid impasse.&#xA;Related experiments found that angry negotiators win larger concessions from their counterparts (&lt;a href=&#34;https://doi.org/10.1016/j.jesp.2005.05.002&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sinaceur &amp;amp; Tiedens, 2006&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;The mechanism is a single inference on the target&amp;rsquo;s side, and that inference stops working under one condition:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;An angry outburst leads the target to infer no movement; if the target cannot walk away the target concedes and the tactic pays, and if the target has power the target retaliates and the tactic backfires&#34;&#xA;    src=&#34;https://tomrochette.com/anger-is-a-tactic/images/anger-tactic-payoff.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;Anger also buys status.&#xA;Across four studies, people who expressed anger were judged more competent than people who expressed sadness, and observers conferred higher status and even higher salary offers on them (&lt;a href=&#34;https://doi.org/10.1037/0022-3514.80.1.86&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tiedens, 2001&lt;/a&gt;).&#xA;We read anger as confidence, and we promote what reads as confidence.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;So the person yelling in the meeting is using a tactic that has worked for years: volume signals a hard limit, the limit signals competence, and everyone else absorbs the cost of avoiding the fight.&lt;/strong&gt;&#xA;Expecting them to stop out of politeness is expecting them to abandon a winning move.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the Tactic Stops Working&#xA;    &lt;div id=&#34;where-the-tactic-stops-working&#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;#where-the-tactic-stops-working&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The same literature that shows anger working also shows precisely where it fails, and the boundary matters more than the effect.&lt;/p&gt;&#xA;&lt;p&gt;First, the signal only works while the behavior is consistent with it.&#xA;In the 2004 experiments, when the &amp;ldquo;angry&amp;rdquo; opponent started making large concessions, the effect vanished; targets stopped trusting the display and went back to their own numbers (&lt;a href=&#34;https://doi.org/10.1037/0022-3514.86.1.57&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef et al., 2004&lt;/a&gt;).&#xA;Anger is an argument about a limit, and any behavior that contradicts the argument wins.&lt;/p&gt;&#xA;&lt;p&gt;Second, the tactic depends on who is receiving the anger.&#xA;When researchers pitted anger against power, low-power participants conceded to an angry adversary regardless of whether the anger was appropriate, but high-power participants confronted with inappropriate anger retaliated and demanded more, not less (&lt;a href=&#34;https://doi.org/10.1037/0021-9010.92.6.1557&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef &amp;amp; Côté, 2007&lt;/a&gt;).&#xA;Anger extracts value downward and invites punishment sideways or upward.&lt;/p&gt;&#xA;&lt;p&gt;Third, field data from hundreds of actual online dispute mediations found that anger expression lowered resolution rates overall, in significant part because it triggered angry responses from the other party; only when the counterpart was especially vulnerable did the anger fail to hurt the expresser&amp;rsquo;s outcome (&lt;a href=&#34;https://doi.org/10.1037/0021-9010.89.2.369&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Friedman et al., 2004&lt;/a&gt;).&#xA;In relationships that continue past the transaction, anger mostly burns the expresser.&lt;/p&gt;&#xA;&lt;p&gt;And the flow is almost entirely one-directional.&#xA;Sutton summarizes the frequency data in &lt;a href=&#34;https://en.wikipedia.org/wiki/The_No_Asshole_Rule&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The No Asshole Rule&lt;/a&gt;: perceived nastiness is estimated to run downward (boss to subordinate) in 50 to 80 percent of workplace occurrences, versus roughly 1 percent upward.&#xA;Interview studies of workplace anger episodes found the same asymmetry from the other side: subordinates were the least likely to confront the target of their anger and the most likely to consider the incident unresolved (&lt;a href=&#34;https://doi.org/10.1002/%28SICI%291099-1379%28200003%2921%3A2%3C147::AID-JOB35%3E3.0.CO;2-T&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fitness, 2000&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Aggression depends on a power difference and on the target&amp;rsquo;s silence, which is why the people who use it are so often leaders and so rarely peers.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Hidden Cost&#xA;    &lt;div id=&#34;the-hidden-cost&#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-hidden-cost&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The defense of these people is always the same: they get results.&#xA;The research says those results carry costs nobody tracks.&lt;/p&gt;&#xA;&lt;p&gt;The founding study of abusive supervision followed 712 employees and found that those who perceived their supervisor as abusive were more likely to quit, and the ones who stayed showed lower job and life satisfaction, lower commitment, and depressed perceptions of justice (&lt;a href=&#34;https://doi.org/10.5465/1556375&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tepper, 2000&lt;/a&gt;).&#xA;Fifteen-plus years of follow-up research, synthesized in Tepper&amp;rsquo;s &lt;a href=&#34;https://doi.org/10.1146/annurev-orgpsych-041015-062539&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Annual Review&lt;/a&gt;, established the pattern as one of the most robust in organizational psychology.&#xA;The abuse also cascades: managers mistreated by their own bosses go on to mistreat their subordinates (&lt;a href=&#34;https://doi.org/10.1111/j.1744-6570.2012.01246.x&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mawritz et al., 2012&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;If you think that is soft-outcome stuff, the hard-outcome studies are worse.&#xA;Researchers randomized 24 neonatal intensive care teams to either neutral comments or a few mildly rude remarks from a visiting &amp;ldquo;expert,&amp;rdquo; rudeness deliberately unrelated to the team&amp;rsquo;s actual performance.&#xA;The rudeness-only teams&amp;rsquo; diagnostic and procedural performance dropped significantly (2.6 vs 3.2 and 2.8 vs 3.3 on the judged scales), with rudeness alone explaining nearly 12 percent of performance variance.&#xA;The cause was social: the teams stopped sharing information and asking each other for help (&lt;a href=&#34;https://doi.org/10.1542/peds.2015-1385&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Riskin et al., 2015&lt;/a&gt;).&#xA;A few sentences of mild rudeness measurably degraded how well expert teams saved babies, and the mediators were exactly the collaborative behaviors an angry leader suppresses.&lt;/p&gt;&#xA;&lt;p&gt;Then the rudeness spreads.&#xA;Witnessing rudeness makes people more likely to judge ambiguous behavior as rude and to behave rudely themselves (&lt;a href=&#34;https://doi.org/10.1037/apl0000037&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Foulk, Woolum &amp;amp; Erez, 2016&lt;/a&gt;).&#xA;Witnesses of bullying report increased stress and fear of becoming targets (&lt;a href=&#34;https://en.wikipedia.org/wiki/The_No_Asshole_Rule&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sutton&lt;/a&gt;).&#xA;Prevalence data suggests nearly everyone experiences incivility: across 14 years of polling, 98 percent of workers reported uncivil behavior, and by 2011 half reported being treated rudely at least weekly, up from a quarter in 1998 (&lt;a href=&#34;https://hbr.org/2013/01/the-price-of-incivility&#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=hbr.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Porath &amp;amp; Pearson, HBR&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The aggressor&amp;rsquo;s visible win is genuine, but it comes with losses nobody tracks in everyone else&amp;rsquo;s judgment, information flow, and retention.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why They Do It&#xA;    &lt;div id=&#34;why-they-do-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;#why-they-do-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Two findings changed how I read these people.&lt;/p&gt;&#xA;&lt;p&gt;The first is causal: power plus felt incompetence produces aggression.&#xA;Across studies, people with power who doubted their own competence were the most aggressive toward subordinates, and competent subordinates were the preferred targets of their put-downs (&lt;a href=&#34;https://doi.org/10.1111/j.1467-9280.2009.02452.x&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fast &amp;amp; Chen, 2009&lt;/a&gt;).&#xA;The boss who lashes out at the strongest engineer in the room is often reacting to exactly that engineer&amp;rsquo;s competence.&lt;/p&gt;&#xA;&lt;p&gt;The second is Sutton&amp;rsquo;s distinction between the temporary and the certified asshole: someone having a bad day versus someone &amp;ldquo;persistently nasty&amp;rdquo; who leaves targets oppressed and humiliated and aims at people less powerful (&lt;a href=&#34;https://en.wikipedia.org/wiki/The_No_Asshole_Rule&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The No Asshole Rule&lt;/a&gt;).&#xA;The distinction matters because the responses differ.&#xA;A bad day deserves grace; a pattern will keep extracting concessions until someone raises the cost of using it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Read aggression as information: it tells you the person&amp;rsquo;s other tools are insufficient for the situation, which is exactly why the tactic concentrates at the top, where it is tolerated, and among the insecure, where it is needed.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Playbook&#xA;    &lt;div id=&#34;the-playbook&#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-playbook&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The research maps to a small number of concrete moves.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. Separate the claim from the volume.&lt;/strong&gt;&#xA;The outburst is an argument that a limit has been reached.&#xA;Answer the argument, not the volume: ask what specifically is unacceptable, what they need, and what would change their position.&#xA;Asking those questions works because the mechanism is inference; when you engage the substance and your own behavior contradicts the &amp;ldquo;hard limit&amp;rdquo; reading, the display loses its informational value (&lt;a href=&#34;https://doi.org/10.1037/0022-3514.86.1.57&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef et al., 2004&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. Do not reciprocate.&lt;/strong&gt;&#xA;The field evidence is unambiguous that reciprocated anger is what destroys outcomes (&lt;a href=&#34;https://doi.org/10.1037/0021-9010.89.2.369&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Friedman et al., 2004&lt;/a&gt;).&#xA;Matching their tone converts a solvable disagreement into a status fight, and status fights involving a leader have exactly one winner available.&#xA;Stay slow, stay concrete, and let the asymmetry between your tone and theirs become visible to the room.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. Name the behavior once it crosses the line.&lt;/strong&gt;&#xA;The dual threshold model of anger in organizations distinguishes an expression threshold (communicate rather than suppress) from an impropriety threshold (display that violates norms and starts doing damage) (&lt;a href=&#34;https://doi.org/10.5465/amr.2007.25275495&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Geddes &amp;amp; Callister, 2007&lt;/a&gt;).&#xA;Functional anger sits between the thresholds; the person who pounds the table is past the second one.&#xA;Naming it does not have to be dramatic: &amp;ldquo;I want to solve this, and I need you to lower your voice so we can&amp;rdquo; is a boundary, not an attack.&#xA;The key is to do it early, because subordinates who swallow anger consistently rate their incidents unresolved, and unresolved incidents compound (&lt;a href=&#34;https://doi.org/10.1002/%28SICI%291099-1379%28200003%2921%3A2%3C147::AID-JOB35%3E3.0.CO;2-T&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fitness, 2000&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;4. Attack the dependency, not the person.&lt;/strong&gt;&#xA;Anger extracts concessions from those who cannot walk away and invites retaliation from those who can (&lt;a href=&#34;https://doi.org/10.1037/0021-9010.92.6.1557&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef &amp;amp; Côté, 2007&lt;/a&gt;; &lt;a href=&#34;https://doi.org/10.1037/0021-9010.89.2.369&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Friedman et al., 2004&lt;/a&gt;).&#xA;The practical translation is simple: build alternatives.&#xA;Document your contributions where others see them, cultivate sponsors outside your reporting line, keep your skills portable, keep your savings accessible.&#xA;You do not need to quit to be less dependent; you need the aggressor&amp;rsquo;s threat model about you to weaken.&#xA;Half the power of the tactic disappears the day they are no longer sure you would stay.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;5. Contain the contagion.&lt;/strong&gt;&#xA;If you manage anyone exposed to the aggressor, protect their collaborative behavior deliberately.&#xA;Debrief the incident, keep information flowing, and make help-seeking explicitly safe, because those are the first two things rudeness shuts down (&lt;a href=&#34;https://doi.org/10.1542/peds.2015-1385&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Riskin et al., 2015&lt;/a&gt;; &lt;a href=&#34;https://doi.org/10.1037/apl0000037&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Foulk et al., 2016&lt;/a&gt;).&#xA;Teams absorb an aggressor&amp;rsquo;s mood by default (&lt;a href=&#34;https://doi.org/10.1037/0021-9010.90.2.295&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sy, Côté &amp;amp; Saavedra, 2005&lt;/a&gt;); somebody has to interrupt the absorption.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;6. If you have organizational power, make it a firing matter.&lt;/strong&gt;&#xA;The strongest evidence-based organizational response is also the bluntest: refuse the trade.&#xA;Netflix&amp;rsquo;s culture memo says it in one line: &amp;ldquo;No matter how brilliant someone may be, there&amp;rsquo;s no place in our Dream Team for people who don&amp;rsquo;t treat their colleagues with decency and respect&amp;rdquo; (&lt;a href=&#34;https://jobs.netflix.com/culture&#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=jobs.netflix.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Netflix culture memo&lt;/a&gt;).&#xA;Sutton&amp;rsquo;s cost arithmetic (he calls it Total Cost of Assholes: HR hours, turnover, witnesses&amp;rsquo; lost productivity, legal exposure; one executive&amp;rsquo;s estimate for a single engineer ran to about $160,000 a year) exists so leaders stop pricing these employees by output alone (&lt;a href=&#34;https://en.wikipedia.org/wiki/The_No_Asshole_Rule&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The No Asshole Rule&lt;/a&gt;).&#xA;And people must feel safe before anyone will name the problem: Google&amp;rsquo;s Project Aristotle found psychological safety the most important of the five dynamics separating its effective teams from the rest (&lt;a href=&#34;https://www.nytimes.com/2016/02/28/magazine/what-google-learned-from-its-quest-to-build-the-perfect-team.html&#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=www.nytimes.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Duhigg, &amp;ldquo;What Google Learned From Its Quest to Build the Perfect Team&amp;rdquo;&lt;/a&gt;).&#xA;Psychological safety is precisely what a chronic aggressor destroys.&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;p&gt;&lt;strong&gt;Pick the next encounter and prepare one sentence for it.&lt;/strong&gt;&#xA;Something like &amp;ldquo;I will engage with the problem when we can discuss it calmly,&amp;rdquo; said once, neutrally, and then silence.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Inventory your dependency while calm: who else knows your work, how portable are your skills, how many months of runway do you have.&lt;/strong&gt;&#xA;The inventory is not defeatism; it converts you from a low-power target, the only kind this tactic works on, into a high-power one.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write down the incidents, dates included.&lt;/strong&gt;&#xA;Patterns need data, and data is what turns &amp;ldquo;I feel uncomfortable&amp;rdquo; into a case a leader or HR can act on.&lt;/p&gt;&#xA;&lt;p&gt;And if you have power over one of these people, stop asking whether they are worth the trouble and start computing what they cost; the research says the cost is much larger than their manager has ever seen.&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;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt; - the team-level counterpart: how one resolved disagreement sets the template for whether the loudest person wins from then on&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://doi.org/10.1037/0022-3514.86.1.57&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef, De Dreu &amp;amp; Manstead, &amp;ldquo;The Interpersonal Effects of Anger and Happiness in Negotiations&amp;rdquo; (2004)&lt;/a&gt; - the mechanism: targets concede to anger because they infer a tough limit&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1037/0021-9010.92.6.1557&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Van Kleef &amp;amp; Côté, &amp;ldquo;Expressing Anger in Conflict: When It Helps and When It Hurts&amp;rdquo; (2007)&lt;/a&gt; - the boundary: low-power targets concede, high-power targets retaliate against inappropriate anger&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1037/0021-9010.89.2.369&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Friedman et al., &amp;ldquo;The Positive and Negative Effects of Anger on Dispute Resolution&amp;rdquo; (2004)&lt;/a&gt; - field evidence that reciprocated anger destroys resolution rates&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1037/0022-3514.80.1.86&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tiedens, &amp;ldquo;Anger and Advancement Versus Sadness and Subjugation&amp;rdquo; (2001)&lt;/a&gt; - anger reads as competence and earns status and salary&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1016/j.jesp.2005.05.002&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sinaceur &amp;amp; Tiedens, &amp;ldquo;Get Mad and Get More Than Even&amp;rdquo; (2006)&lt;/a&gt; - angry negotiators win larger concessions&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.5465/1556375&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tepper, &amp;ldquo;Consequences of Abusive Supervision&amp;rdquo; (2000)&lt;/a&gt; - the founding study of what abusive bosses do to retention, satisfaction, and commitment&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1542/peds.2015-1385&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Riskin et al., &amp;ldquo;The Impact of Rudeness on Medical Team Performance&amp;rdquo; (2015)&lt;/a&gt; - randomized evidence that mild rudeness degrades expert teams&amp;rsquo; diagnostic and procedural performance&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1037/apl0000037&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Foulk, Woolum &amp;amp; Erez, &amp;ldquo;Catching Rudeness Is Like Catching a Cold&amp;rdquo; (2016)&lt;/a&gt; - rudeness is contagious&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1111/j.1744-6570.2012.01246.x&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mawritz et al., &amp;ldquo;A Trickle-Down Model of Abusive Supervision&amp;rdquo; (2012)&lt;/a&gt; - abuse flows down the hierarchy&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1111/j.1467-9280.2009.02452.x&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fast &amp;amp; Chen, &amp;ldquo;When the Boss Feels Inadequate&amp;rdquo; (2009)&lt;/a&gt; - power plus felt incompetence predicts aggression toward competent subordinates&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.5465/amr.2007.25275495&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Geddes &amp;amp; Callister, &amp;ldquo;Crossing the Line(s): A Dual Threshold Model of Anger in Organizations&amp;rdquo; (2007)&lt;/a&gt; - the expression/impropriety threshold model used in the playbook&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1002/%28SICI%291099-1379%28200003%2921%3A2%3C147::AID-JOB35%3E3.0.CO;2-T&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fitness, &amp;ldquo;Anger in the Workplace&amp;rdquo; (2000)&lt;/a&gt; - interview evidence that subordinates suppress anger and leave incidents unresolved&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1146/annurev-orgpsych-041015-062539&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tepper, Simon &amp;amp; Park, &amp;ldquo;Abusive Supervision&amp;rdquo; (2017)&lt;/a&gt; - the 15-plus year synthesis of the abusive supervision literature&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_No_Asshole_Rule&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sutton, The No Asshole Rule (2007)&lt;/a&gt; - the practitioner frame: recognition tests, certified vs temporary, and the Total Cost of Assholes&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hbr.org/2013/01/the-price-of-incivility&#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=hbr.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Porath &amp;amp; Pearson, &amp;ldquo;The Price of Incivility&amp;rdquo; (2013)&lt;/a&gt; - prevalence trend data on workplace incivility&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jobs.netflix.com/culture&#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=jobs.netflix.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Netflix culture memo&lt;/a&gt; - the reference policy rejecting brilliant people who fail the decency bar&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.nytimes.com/2016/02/28/magazine/what-google-learned-from-its-quest-to-build-the-perfect-team.html&#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=www.nytimes.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Duhigg, &amp;ldquo;What Google Learned From Its Quest to Build the Perfect Team&amp;rdquo; (2016)&lt;/a&gt; - Project Aristotle: psychological safety was the most important of Google&amp;rsquo;s five team-effectiveness dynamics&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Getting Noticed in the LLM Flood: Compete on What Cannot Be Generated</title>
      <link>https://tomrochette.com/getting-noticed-in-the-llm-flood/</link>
      <pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/getting-noticed-in-the-llm-flood/</guid>
      <category>ai</category><category>llm</category><category>attention-economy</category><category>information-overload</category><category>self-promotion</category><category>content</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;For most of the internet&amp;rsquo;s life, the rule was simple: make something good, put it somewhere findable, and the channels would handle the rest.&#xA;That rule assumed a scarcity that no longer holds.&#xA;&lt;strong&gt;When a model can draft a competent essay, tutorial, landing page, or thread in seconds, the supply of &amp;ldquo;good enough&amp;rdquo; writing goes effectively infinite, and good stops being the thing that gets you noticed.&lt;/strong&gt;&#xA;The scarce thing is no longer content but the trust that lets any single reader pick your work out of the flood.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Flood Has Two Sides&#xA;    &lt;div id=&#34;the-flood-has-two-sides&#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-flood-has-two-sides&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A flood that is impossible to read is also a flood that is impossible to be read in.&#xA;These are the same problem seen from opposite ends.&lt;/p&gt;&#xA;&lt;p&gt;The reader&amp;rsquo;s version is a filtering problem: too much coming at you, too little time to sort it (see &lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt;).&#xA;The maker&amp;rsquo;s version is a discovery problem: your work is one drop in a self-replenishing ocean, and the ocean refills faster than anyone can drink.&lt;/p&gt;&#xA;&lt;p&gt;The root cause is identical.&#xA;As &lt;a href=&#34;https://en.wikipedia.org/wiki/Attention_economy&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Herbert Simon&lt;/a&gt; put it half a century before LLMs, &amp;ldquo;a wealth of information creates a poverty of attention.&amp;rdquo;&#xA;&lt;strong&gt;What changed is that the wealth of information stopped requiring people to produce it, so the supply curve bent from steep to vertical.&lt;/strong&gt;&#xA;Attention did not scale with it.&#xA;That leaves every creator competing for a fixed resource against a supply that has no ceiling.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;&amp;ldquo;Good&amp;rdquo; Is Now the Floor&#xA;    &lt;div id=&#34;good-is-now-the-floor&#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;#good-is-now-the-floor&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It used to mean something to publish clear, well-structured, useful writing, because producing it took time, skill, and effort, and that effort was itself a signal.&#xA;When the median post can be generated in seconds and is, on the surface, as clean as anything a careful human would produce, clarity and structure stop signaling much.&#xA;They become the default, the minimum readers expect and immediately forget.&lt;/p&gt;&#xA;&lt;p&gt;This is &lt;a href=&#34;https://en.wikipedia.org/wiki/Sturgeon%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sturgeon&amp;rsquo;s law&lt;/a&gt; (&amp;ldquo;ninety percent of everything is crud&amp;rdquo;) at its extreme: not only is most content mediocre, but the mediocre is now polished enough to pass for good, which forces readers to assume everything is mediocre until proven otherwise.&#xA;&lt;strong&gt;The practical effect is that competence no longer earns attention; it merely keeps the reader from leaving immediately.&lt;/strong&gt;&#xA;You cannot out-write the flood, because the flood is now competently written.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Compete on What Cannot Be Generated&#xA;    &lt;div id=&#34;compete-on-what-cannot-be-generated&#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;#compete-on-what-cannot-be-generated&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If the surface layer is commoditized, the advantage moves to the layers a model cannot generate, and almost all of them are slow, specific, and human.&#xA;Kevin Kelly named these the &amp;ldquo;generatives&amp;rdquo; in &lt;a href=&#34;https://kk.org/thetechnium/better-than-fre/&#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=kk.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Better Than Free&lt;/a&gt;: the qualities that stay valuable precisely because copies are free.&#xA;His list, written in 2008 about an earlier wave of abundance, maps almost perfectly onto the problem of being noticed now.&#xA;Four of them do most of the work.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Authenticity&lt;/strong&gt; is the sense that an actual, specific person made this for a reason they will stand behind.&#xA;A model can imitate a voice, and even the surface texture of the life behind it: a recorded mistake, a hard-won opinion, a detail only someone who was there would notice.&#xA;What it cannot provide is the underlying record that makes those details checkable, which is why authenticity has to be backed by proof rather than merely asserted (see Proof of Work, below).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Embodiment&lt;/strong&gt; is the version of the work that exists in the physical, social world: a live talk, a conversation, a workshop, a thing you can point to in a room.&#xA;It cannot be copied at all because it is not made of text, and it is where the strongest trust gets built.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Personalization&lt;/strong&gt; is work tuned to a specific reader or community rather than aimed at everyone.&#xA;The flood is generic by nature; anything that clearly was not, anything that names a particular reader&amp;rsquo;s problem in a particular context, stands out against it by contrast alone.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Findability&lt;/strong&gt; is the quality most creators neglect, and the focus of this whole article.&#xA;As Kelly wrote, &amp;ldquo;when there are millions of free things requesting our attention, being found is valuable.&amp;rdquo;&#xA;&lt;strong&gt;In a flood, distribution is not the layer you add after the work is good; it is the work.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Proof of Work Is the Signal That Survives&#xA;    &lt;div id=&#34;proof-of-work-is-the-signal-that-survives&#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;#proof-of-work-is-the-signal-that-survives&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If readers now assume competence is fake by default, the only thing that reliably reaches readers is evidence that an actual person did the thing behind the writing.&#xA;Call it proof of work, borrowing a term from systems where trust is established by demonstrating costly effort rather than by asserting it (&lt;a href=&#34;https://en.wikipedia.org/wiki/Proof_of_work&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;proof of work&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;The tempting version of this claim is that the right story reads as authentic and therefore cannot be faked.&#xA;That claim fails once models can fabricate the same story.&#xA;A fabricated postmortem with specific-sounding numbers, a plausible failure chain, and the right tonal markers passes most readers&amp;rsquo; filters, because few will check whether the project existed, whether the numbers are accurate, or whether the author lived it.&#xA;The cost asymmetry the argument depends on, expensive to produce but cheap to verify, inverts: the story is now nearly free to generate, verification still costs actual effort, and readers rarely pay it.&lt;/p&gt;&#xA;&lt;p&gt;What cannot be faked at scale is not the story but the record it claims to be based on.&#xA;An actual project leaves a wide trail, commits, issues, deployed systems, other people who remember it, a history you can point to.&#xA;The postmortem itself is cheap to hallucinate; the artifacts it references are not.&#xA;The durable signal is not &amp;ldquo;does this read like lived experience&amp;rdquo; but &amp;ldquo;can I trace it to something independent of the author&amp;rsquo;s word,&amp;rdquo; and that is a harder bar than most writing clears.&lt;/p&gt;&#xA;&lt;p&gt;The verification chain a claim has to survive looks like this.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Funnel: claims with a verification surface trace to commit history, incident reports, or people who remember the work and earn trust, while claims with nothing to check are assumed generated and skipped&#34;&#xA;    src=&#34;https://tomrochette.com/getting-noticed-in-the-llm-flood/images/proof-of-work-funnel.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;That bar is why the familiar examples matter only when they are traceable.&#xA;A postmortem of a project that failed, with concrete numbers and concrete reasons, matters if you can link the project, the commit that introduced the bug, the incident report.&#xA;An experiment you actually ran, with setup and outcome, matters if the setup is reproducible and the data is there.&#xA;A thing you built and genuinely use matters if the repository exists, has a history, and other people can run it.&#xA;Strip the traceability and the same sentences are indistinguishable from hallucination.&#xA;&lt;strong&gt;Proof of work is not a quality you can write into a paragraph; it is a verification surface you either leave behind or do not, and the cost that makes it trustworthy is paid in building that record, not in describing it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Proof of work is the producer&amp;rsquo;s version of the moat argument elsewhere on this blog: when the easy-to-copy layer is free, the advantage relocates to the layers that compound through time and cannot be cloned (see &lt;a href=&#34;https://tomrochette.com/feature-parity-is-not-a-moat/&#34; &gt;Feature Parity Is Not a Moat&lt;/a&gt;).&#xA;For a creator, those layers are a track record, a body of specific work, and the relationships built around it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Be a Source, Not an Echo&#xA;    &lt;div id=&#34;be-a-source-not-an-echo&#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;#be-a-source-not-an-echo&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most generated content restates things other people already said, which means most of the flood is echo.&#xA;The way to stop being part of the flood is to be the thing it is restating.&lt;/p&gt;&#xA;&lt;p&gt;A source is someone who produces a fact, an observation, a measurement, an argument, or a story that did not exist in that form before they wrote it.&#xA;An echo is everyone, human or machine, who restates it.&#xA;&lt;strong&gt;The flood is almost entirely echo, which means even a small amount of genuine source material stands out clearly against it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The method is to bias every piece toward the thing only you could have written: the result you observed, the mistake you made, the opinion you hold and can defend, the specific reader you are addressing.&#xA;Narrow is better than broad here, because narrow allows specificity, and specificity is what an echo cannot manufacture.&#xA;A durable body of narrow work also compounds: ten pieces on the same corner of a problem make you the primary source for that problem, where ten unrelated pieces make you another drop.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Relationships Are the Distribution Layer That Does Not Saturate&#xA;    &lt;div id=&#34;relationships-are-the-distribution-layer-that-does-not-saturate&#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;#relationships-are-the-distribution-layer-that-does-not-saturate&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every algorithmic channel is now full, and getting fuller, and the trend goes in one direction.&#xA;The one channel that does not saturate the same way is direct human relationship, the small set of people who know you, trust your work, and pass it on because they want to.&lt;/p&gt;&#xA;&lt;p&gt;These are not &amp;ldquo;followers&amp;rdquo; in the metric sense; they are the thin layer of genuine acquaintance, &lt;a href=&#34;https://en.wikipedia.org/wiki/Parasocial_interaction&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;parasocial&lt;/a&gt; or otherwise, that turns &amp;ldquo;I made a thing&amp;rdquo; into &amp;ldquo;someone I trust made a thing.&amp;rdquo;&#xA;&lt;strong&gt;Trust is the only distribution medium that the flood dilutes more slowly than it dilutes everything else, because trust cannot be manufactured by a model either.&lt;/strong&gt;&#xA;This is why the unglamorous work of replying, citing, collaborating, and being present over years outperforms any broadcast tactic in a saturated feed.&#xA;It is also the version of distribution that compounds, while a clever hook compounds for about a day.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bottleneck Moved to Trust&#xA;    &lt;div id=&#34;the-bottleneck-moved-to-trust&#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-bottleneck-moved-to-trust&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The uncomfortable reading of all this is that &amp;ldquo;make good things&amp;rdquo; was never the whole strategy; it was a strategy that worked while good things were scarce.&#xA;They are not scarce anymore, and they will not be again.&lt;/p&gt;&#xA;&lt;p&gt;What is scarce, and getting scarcer, is the trust that lets a reader choose one piece out of a million.&#xA;&lt;strong&gt;Trust is built only from the inputs a model cannot generate: your time, your experience, your track record, and your relationships.&lt;/strong&gt;&#xA;Getting noticed in the flood is not a louder version of the old approach; it is the decision to stop competing on the layer that went free, and to put everything onto the layers that never will.&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;p&gt;&lt;strong&gt;Stop optimizing for volume.&lt;/strong&gt;&#xA;Posting more into an infinite stream makes you more of the stream, not more visible inside it, and the marginal post now competes with machines that post faster, for free.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bias every piece toward proof of work.&lt;/strong&gt;&#xA;If a reader cannot tell whether an actual person did the thing behind the writing, they will assume not, so leave a verification surface they can actually check: link the repository, the data, the incident report, the commit, so the claim rests on something independent of your word rather than on how lived the prose sounds.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write what only you can write, and narrow until that is true.&lt;/strong&gt;&#xA;Specificity is the cheapest signal that survives generation, and a narrow, durable body of work is what makes you the primary source for a problem instead of a drop in the flood.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Treat distribution as the work, not the afterthought.&lt;/strong&gt;&#xA;Findability is a generative in its own right, and in a flood it is the generative that decides whether any of the rest gets read.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Build the channels that do not saturate.&lt;/strong&gt;&#xA;A small set of genuine relationships, maintained over years, will carry your work further than any algorithmic tactic, and it is the one distribution layer a model cannot generate.&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;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the reader&amp;rsquo;s side of the same flood; this article is the producer&amp;rsquo;s mirror image&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/feature-parity-is-not-a-moat/&#34; &gt;Feature Parity Is Not a Moat&lt;/a&gt; - when the copyable layer is free, advantage moves to layers that compound and cannot be cloned, the same relocation trust depends on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the pattern of the constraint moving one level up whenever a lower one is automated, here from content production to trust&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://en.wikipedia.org/wiki/Attention_economy&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Attention economy (Wikipedia)&lt;/a&gt; - Simon&amp;rsquo;s &amp;ldquo;a wealth of information creates a poverty of attention,&amp;rdquo; the root framing for why a content flood is a trust problem&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kk.org/thetechnium/better-than-fre/&#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=kk.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Kevin Kelly, &amp;ldquo;Better Than Free&amp;rdquo;&lt;/a&gt; - the &amp;ldquo;generatives&amp;rdquo; that stay valuable when copies are free, including authenticity, embodiment, personalization, and findability&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sturgeon%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sturgeon&amp;rsquo;s law (Wikipedia)&lt;/a&gt; - &amp;ldquo;ninety percent of everything is crud,&amp;rdquo; sharpened here by the fact that the crud is now polished enough to pass for good&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Information_overload&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Information overload (Wikipedia)&lt;/a&gt; - the long-standing name for the reader&amp;rsquo;s condition this article takes as its starting point&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Proof_of_work&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Proof of work (Wikipedia)&lt;/a&gt; - trust established by demonstrating costly effort rather than by assertion, the property that lets genuine work stand out against generated content&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Parasocial_interaction&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Parasocial interaction (Wikipedia)&lt;/a&gt; - the one-to-many relationship layer that distributes work without saturating the way algorithmic feeds do&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Teach Your Agent Skills to Use Tools That Render</title>
      <link>https://tomrochette.com/agent-skills-that-render/</link>
      <pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agent-skills-that-render/</guid>
      <category>ai</category><category>llm</category><category>agent-skills</category><category>tools</category><category>mermaid</category><category>sdlc</category><category>visualization</category><category>software-engineering</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The cheapest upgrade I have made to an agent skill was not a better prompt or a bigger model.&#xA;It was teaching the skill to emit a &lt;a href=&#34;https://mermaid.js.org/&#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=mermaid.js.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mermaid&lt;/a&gt; diagram instead of a paragraph.&#xA;Once the skill could draw, I could check its work by looking instead of reading, and looking is the one verification that stays fast no matter how much prose there is.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The most effective change you can make to an agent skill is to wire it to a small tool that renders, because a rendered artifact shifts verification from reading to looking, and looking is cheap, fast, and rarely misleads you.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why prose-only skills plateau&#xA;    &lt;div id=&#34;why-prose-only-skills-plateau&#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;#why-prose-only-skills-plateau&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A skill that only writes prose hands you prose to verify.&#xA;Prose asks you to read, and reading is exactly the step that working with agents turned into the limiting factor: the scarce, serial, finite attention you have left once generation became free (&lt;a href=&#34;https://tomrochette.com/attention-engineering/&#34; &gt;Attention Engineering&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;The problem is that prose feels productive to generate and expensive to check.&#xA;The agent writes a fluent paragraph describing the data flow, the spec, or the migration plan, and you skim it and approve it, because reading it carefully would cost more attention than you have.&#xA;&lt;strong&gt;A skill that outputs only text forces you to check it with the slowest checker you own, the one that tires first, which is you, reading.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The pattern: pair the skill with a tool that renders&#xA;    &lt;div id=&#34;the-pattern-pair-the-skill-with-a-tool-that-renders&#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-pattern-pair-the-skill-with-a-tool-that-renders&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fix is to give the skill a tool that turns text into something you can inspect at a glance.&#xA;The tool does the deterministic part, the layout, the rendering, the syntax checking, and the skill does the generative part, deciding what to put in the diagram.&#xA;The concerns separate cleanly, and the output becomes inspectable in a way prose never is.&lt;/p&gt;&#xA;&lt;p&gt;The split of labor looks like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    S[Skill, the generative half] --&amp;gt; T[Text source, mermaid or DBML]&#xA;    T --&amp;gt; R[Renderer, the deterministic half]&#xA;    R --&amp;gt; A[Inspectable artifact]&#xA;    A --&amp;gt; H[You, the fast checker]&#xA;    T --&amp;gt; G[Git, so changes are reviewable]&lt;/pre&gt;&#xA;&lt;p&gt;Pairing a skill with a renderer is the same approach as &lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt;, applied to the artifacts a skill produces: stop trying to read, start trying to verify, and pick for each artifact the cheapest checker that catches the failure you care about.&#xA;&lt;strong&gt;For a lot of artifacts, the cheapest checker is a picture.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Mermaid in the SDLC process&#xA;    &lt;div id=&#34;mermaid-in-the-sdlc-process&#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;#mermaid-in-the-sdlc-process&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I started adding &lt;a href=&#34;https://mermaid.js.org/&#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=mermaid.js.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mermaid&lt;/a&gt; diagrams to my SDLC skills, and the payoff was immediate.&#xA;A plan that used to be three paragraphs of &amp;ldquo;first we do this, then that, and this component talks to that one&amp;rdquo; now ships with a sequence diagram.&#xA;A spec now ships with a state diagram or a flowchart of the happy path.&lt;/p&gt;&#xA;&lt;p&gt;The diagrams fail in ways prose hides.&#xA;A sequence diagram with a message that has no receiver makes a missing step obvious.&#xA;A flowchart with two boxes that both claim to write the same column makes a race condition visible before a line of code exists.&#xA;&lt;strong&gt;The wrong diagram is obvious in two seconds; the wrong paragraph may take four readings to spot, if you spot it at all.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Mermaid is the right tool for a skill for three reasons.&#xA;It is text, so the agent generates it directly, the same way it generates any other output.&#xA;It renders natively where the work already happens, because GitHub renders &lt;code&gt;```mermaid&lt;/code&gt; blocks in Markdown and most static site generators do too.&#xA;And it diffs cleanly, because the source is text, so a change to the plan shows up in the pull request as a diff you can review instead of a picture you have to compare by eye.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Text-based tools are the best fit for skills&#xA;    &lt;div id=&#34;text-based-tools-are-the-best-fit-for-skills&#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;#text-based-tools-are-the-best-fit-for-skills&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The mermaid case generalizes into a rule I now follow.&#xA;&lt;strong&gt;When you pick a tool for a skill to drive, prefer a text-based one, because text is what the agent generates, what git tracks, and what renders to the artifact you inspect.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://dbml.dbdiagram.io/docs/&#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=dbml.dbdiagram.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DBML&lt;/a&gt; is the database-schema version of the same idea.&#xA;It is a small markup language for tables, columns, and foreign keys, and a few lines of it render to a full entity-relationship diagram on &lt;a href=&#34;https://dbdiagram.io/&#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=dbdiagram.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;dbdiagram.io&lt;/a&gt;.&#xA;A skill that describes a schema now emits DBML, and I see the structure of the data model, the missing relationship, the redundant table, before I have read a single column definition.&lt;/p&gt;&#xA;&lt;p&gt;The text basis is what makes it fit an agent workflow.&#xA;The agent writes DBML the way it writes code, the file lives next to the migration that creates the tables, it reviews and diffs like code, and the rendered diagram is a view of the same text rather than a separate artifact that can diverge.&#xA;When the schema changes, the DBML changes in the same commit, and the diagram is never stale.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the visual tool fits: on the human side&#xA;    &lt;div id=&#34;where-the-visual-tool-fits-on-the-human-side&#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;#where-the-visual-tool-fits-on-the-human-side&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Preferring text-based tools does not mean GUI tools have no place.&#xA;&lt;a href=&#34;https://drawdb.app/&#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=drawdb.app&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;drawdb&lt;/a&gt; is the visual counterpart of DBML: a browser editor where you drag tables and draw relationships by hand, and it exports the SQL for whatever you sketched.&lt;/p&gt;&#xA;&lt;p&gt;The division of labor that works for me is to let the agent drive the text-based tools and let myself drive the visual ones.&#xA;I sketch in drawdb when I am still figuring the model out, when I want to move boxes around and explore the design interactively, and then the SQL/DBML it exports becomes an input the agent works from.&#xA;I let the agent drive DBML when the schema is already decided and I want a rendered view of it inside the repository.&#xA;&lt;strong&gt;Text-based tools belong in the skill, where the agent is fast and generation is cheap; visual tools belong with me, where exploration is slow and taste is required.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How to pick the next tool to wire in&#xA;    &lt;div id=&#34;how-to-pick-the-next-tool-to-wire-in&#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;#how-to-pick-the-next-tool-to-wire-in&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Three tests decide whether a tool is worth wiring into a skill.&lt;/p&gt;&#xA;&lt;p&gt;The tool must be text-based, or have a text representation the agent can produce.&#xA;The whole pattern breaks if the agent cannot generate the source the renderer consumes.&lt;/p&gt;&#xA;&lt;p&gt;The tool must render to something inspectable, a diagram, a table, a diff, a graph.&#xA;If the output is still prose, you have added a dependency and gained no new kind of check.&lt;/p&gt;&#xA;&lt;p&gt;And the tool must be narrow enough that the skill can use it reliably.&#xA;&lt;a href=&#34;https://mermaid.js.org/&#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=mermaid.js.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mermaid&lt;/a&gt; and &lt;a href=&#34;https://dbml.dbdiagram.io/docs/&#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=dbml.dbdiagram.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DBML&lt;/a&gt; work well here because they are small languages with a fixed grammar, not sprawling APIs the model has to guess at.&#xA;&lt;strong&gt;A tool the model gets wrong half the time is worse than prose, because you spend your attention debugging the tool instead of the idea.&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;p&gt;Pick one skill you already run that emits prose and teach it to render.&#xA;If it describes a flow, teach it mermaid.&#xA;If it describes data, teach it DBML.&#xA;If it describes a sequence of messages between components, teach it a sequence diagram.&lt;/p&gt;&#xA;&lt;p&gt;Then read the next output it produces as a picture instead of a paragraph, and notice what you can see in two seconds that you would have missed in twenty minutes of reading.&#xA;&lt;strong&gt;That gap, between the cost of looking and the cost of reading, is the whole reason to give your skills tools that render.&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;https://tomrochette.com/my-ai-workflow/&#34; &gt;My AI Workflow: The Skills Are the Part That Compounds&lt;/a&gt; - the case that skills, not models or shells, are the durable asset, and the library where these examples live&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the larger pattern this applies to artifacts: replace one slow reader with many cheap, tireless checkers&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/attention-engineering/&#34; &gt;Attention Engineering&lt;/a&gt; - why reading is the bottleneck a prose-only skill quietly pushes onto you&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - why a text-based, versioned artifact you can both see beats a transcript as shared context&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://mermaid.js.org/&#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=mermaid.js.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mermaid&lt;/a&gt; - text-based diagramming that renders in GitHub and most docs, the tool I wired into the SDLC skills&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dbml.dbdiagram.io/docs/&#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=dbml.dbdiagram.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DBML syntax&lt;/a&gt; - a markup language for database schemas that renders to entity-relationship diagrams&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dbdiagram.io/&#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=dbdiagram.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;dbdiagram.io&lt;/a&gt; - the renderer for DBML, where the text turns into a diagram&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drawdb.app/&#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=drawdb.app&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;drawdb&lt;/a&gt; - a browser-based visual ER editor for sketching schemas by hand and exporting SQL&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What the Author Brings When the Model Writes</title>
      <link>https://tomrochette.com/what-the-author-brings-when-the-model-writes/</link>
      <pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-the-author-brings-when-the-model-writes/</guid>
      <category>ai</category><category>llm</category><category>writing</category><category>content</category><category>authorship</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Producing sentences was never the part that made writing worth reading.&#xA;&lt;strong&gt;When a model can produce clean, well-structured prose about anything in seconds, the value of an author stops being the prose and becomes the one thing the model cannot supply: a reason the words should exist at all.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Writing Was Always Two Jobs&#xA;    &lt;div id=&#34;writing-was-always-two-jobs&#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;#writing-was-always-two-jobs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For as long as writing was hard, two very different jobs were combined in it.&#xA;One was mechanical: choosing words, ordering sentences, matching the register a reader expects.&#xA;The other was everything that made the writing worth a stranger&amp;rsquo;s time: deciding what was true, which detail mattered, what to assert and what to leave out, what claim I would stand behind if someone pushed back.&lt;/p&gt;&#xA;&lt;p&gt;The two jobs looked like one task because the same person did both, and because the judgment was invisible unless the prose was done well.&#xA;&lt;strong&gt;LLMs did not replace the author; they split the author in two and automated only the half that was always the easier one to learn.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The split looks like this:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Stacked bar splitting writing into the mechanical half that the model automates and the judgment half that stays with the author as the entire product&#34;&#xA;    src=&#34;https://tomrochette.com/what-the-author-brings-when-the-model-writes/images/author-split.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Model Is Fluent and Has Nothing to Say&#xA;    &lt;div id=&#34;the-model-is-fluent-and-has-nothing-to-say&#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-model-is-fluent-and-has-nothing-to-say&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A model trained on the corpus of everything humans have written can generate plausible text on any subject, and that fluency looks like understanding from the outside.&#xA;It is closer to a &lt;a href=&#34;https://en.wikipedia.org/wiki/Lossy_compression&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;lossy compression&lt;/a&gt; of everything already said, as Ted Chiang argued in calling ChatGPT a &lt;a href=&#34;https://www.newyorker.com/tech/annals-of-technology/chatgpt-is-a-blurry-jpeg-of-the-web&#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=www.newyorker.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;blurry JPEG of the web&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The model can only recombine what exists; it has nothing of its own to add.&#xA;It has not run the experiment, taken the risk, held the opinion, or been wrong in public and had to fix it.&#xA;&lt;strong&gt;Fluency without experience produces prose that could have been written by anyone, which is exactly the prose the internet now has too much of.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What the Author Brings That the Model Cannot&#xA;    &lt;div id=&#34;what-the-author-brings-that-the-model-cannot&#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-the-author-brings-that-the-model-cannot&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Four things matter most, and each is scarce for the same reason: it cannot be obtained by typing alone.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Something to say.&lt;/strong&gt; A piece of writing worth reading starts from an observation, a result, a mistake, or a conviction that did not exist in the corpus in that form.&#xA;The author has lived something the model has not.&#xA;The trace of that experience, a number that was actually measured, a failure that actually happened, a stance the author will defend, is the only material the model cannot manufacture.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Judgment about what is true.&lt;/strong&gt; The model will produce a confident answer either way, which is why its confidence is worth almost nothing as a signal.&#xA;An author commits: this is right, this matters, this is the claim I am making.&#xA;That willingness to be wrong, narrowing a broad range of plausible claims down to one assertion a reader can check or reject, is the act the model cannot perform, because the model has no stake in being correct.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Stakes and accountability.&lt;/strong&gt; Writing with a name on it can be wrong, criticized, quoted against its author, and remembered.&#xA;That risk is precisely what gives the words weight to a reader, who is deciding whether to trust a person, not a process.&#xA;&lt;strong&gt;A model has nothing to lose from a false sentence: the sentence costs it nothing, costs an author something, and readers sense that asymmetry even when they cannot name it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The thinking that writing forces.&lt;/strong&gt; Writing is not the transcription of finished thought; for most authors, myself included, it is how the thought gets finished at all.&#xA;Offload the whole job and I keep the artifact but lose the part that changed me, the slow, uncomfortable work of discovering what I actually believe by being forced to say it precisely.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Trap of Offloading the Wrong Half&#xA;    &lt;div id=&#34;the-trap-of-offloading-the-wrong-half&#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-trap-of-offloading-the-wrong-half&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Prose generation is so cheap and so good that I am tempted to also let the model decide what to say, and then edit a draft into something shippable.&#xA;Let the model choose the claim on every piece and the work becomes indistinguishable from the flood, because the work is the flood, recompressed from the same corpus by a slightly different prompt.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The moment you let the model choose the claim, you have stopped being the author and started being the first reader of the model&amp;rsquo;s writing.&lt;/strong&gt;&#xA;That arrangement produces a less substantial kind of work, the kind that does not earn the trust that makes anyone return.&lt;/p&gt;&#xA;&lt;p&gt;The useful distinction is not &amp;ldquo;human-written&amp;rdquo; versus &amp;ldquo;AI-written,&amp;rdquo; and never was (see &lt;a href=&#34;https://tomrochette.com/written-by/&#34; &gt;Written by&lt;/a&gt; for how this blog labels AI involvement).&#xA;The useful distinction is whether a human mind made the decisions that determine whether the piece is worth reading: what to assert, what to omit, what experience it is based on, and whether the claim is one the author will stand behind.&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;p&gt;Decide what the piece is for and what claim it is making before the model writes a single sentence, because that decision is the work and the prose follows from it.&lt;/p&gt;&#xA;&lt;p&gt;Base every piece on something the corpus does not contain.&#xA;A measurement you took, a failure you caused, an opinion you hold and can defend, a reader you are specifically addressing, is the only material that keeps the writing from being echo.&lt;/p&gt;&#xA;&lt;p&gt;Put your name behind it and mean it.&#xA;The accountability is not a cost you pay for publishing; it is the source of the weight the writing carries.&#xA;A reader can feel its presence or absence in the first paragraph.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The prose is now the cheapest output. The judgment behind it is the entire product.&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;https://tomrochette.com/getting-noticed-in-the-llm-flood/&#34; &gt;Getting Noticed in the LLM Flood&lt;/a&gt; - the producer&amp;rsquo;s counterpart to this piece: once the writing is good enough to be the minimum standard, attention moves to trust and distribution&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the pattern of the constraint moving one level up when a lower one is automated, here from prose production to judgment&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - the parallel problem in code: the model produces, deciding it is acceptable is the human part that stays&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/written-by/&#34; &gt;Written by&lt;/a&gt; - this blog&amp;rsquo;s disclosure policy, which exists because the author-versus-echo distinction matters&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the reader&amp;rsquo;s side: why more fluent content is the wrong thing to optimize for&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://www.newyorker.com/tech/annals-of-technology/chatgpt-is-a-blurry-jpeg-of-the-web&#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=www.newyorker.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Ted Chiang, &amp;ldquo;ChatGPT Is a Blurry JPEG of the Web&amp;rdquo;&lt;/a&gt; - the model as lossy compression of the corpus, which is why it can recombine but not originate&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sturgeon%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sturgeon&amp;rsquo;s law (Wikipedia)&lt;/a&gt; - &amp;ldquo;ninety percent of everything is crud,&amp;rdquo; made worse by the fact that the crud is now fluently written&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Lossy_compression&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Lossy compression (Wikipedia)&lt;/a&gt; - the technical basis for why generated prose is a recompression of what already exists&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Attention Engineering: Your Attention Is the Bottleneck</title>
      <link>https://tomrochette.com/attention-engineering/</link>
      <pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/attention-engineering/</guid>
      <category>ai</category><category>llm</category><category>attention-engineering</category><category>productivity</category><category>cognitive-load</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Generation stopped being the expensive part of working with LLMs.&#xA;You describe, the model produces, and a plausible answer arrives in seconds.&#xA;&lt;strong&gt;The expensive part is now your attention, and almost nobody has updated how they spend it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;We kept the habits from when writing the code was the hard part.&#xA;We hover over the agent while it works, we read every diff it produces, we re-check by hand what a check could check for us, and we call the exhaustion that follows &amp;ldquo;using AI well.&amp;rdquo;&#xA;It is not.&#xA;It is attention spent on the half of the problem that is already solved, while the half that still needs a human mind gets whatever attention is left.&lt;/p&gt;&#xA;&lt;p&gt;Attention engineering is the deliberate practice of treating your own attention as the scarce resource, and allocating it to the parts of an agent workflow where a mind is required.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Attention Is Not Time&#xA;    &lt;div id=&#34;attention-is-not-time&#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;#attention-is-not-time&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first mistake is to confuse attention with time.&#xA;Time expands to fit the work; attention does not.&#xA;You can run eight agent sessions in parallel in the same number of hours, but you cannot read, judge, and decide on eight outputs in parallel.&#xA;The part that parallelizes is generation, which is the part that no longer needs you.&#xA;The part that needs you, deciding what is good enough, is strictly serial and strictly finite.&lt;/p&gt;&#xA;&lt;p&gt;This is why &lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;spawning more sessions&lt;/a&gt; often makes you slower, not faster.&#xA;Each open session is a claim on working memory, and working memory is small and slow to refill after a switch.&#xA;The literature on &lt;a href=&#34;https://en.wikipedia.org/wiki/Cognitive_load&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;cognitive load&lt;/a&gt; has been clear about this for decades: heavy switching fragments attention and produces shallow processing, and the cost is paid by the task you switched into, not the one you left.&#xA;&lt;strong&gt;Parallel agents increase generation capacity and reduce decision capacity at the same time, and decision capacity is the one that matters.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where Attention Leaks&#xA;    &lt;div id=&#34;where-attention-leaks&#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;#where-attention-leaks&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Most of the fatigue people blame on AI is misallocated attention.&lt;/strong&gt;&#xA;It leaks in four predictable places.&lt;/p&gt;&#xA;&lt;p&gt;Watching the agent generate.&#xA;The stream of tokens is mesmerizing and almost useless.&#xA;You cannot usefully steer a model at token speed, and the sense of &amp;ldquo;supervising&amp;rdquo; it is a feeling of productivity, not productivity itself.&#xA;You are attending to a process you cannot improve by attending to it.&lt;/p&gt;&#xA;&lt;p&gt;Re-verifying what a check could verify.&#xA;The model says the bug is fixed, and instead of trusting a test, you re-read the diff looking for the fix with your own eyes.&#xA;This is &lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;the acceptance gap&lt;/a&gt; run backwards: you spend scarce, taste-grade attention on correctness, the one thing that can be encoded and handed off.&#xA;A minute of writing the check would have saved an hour of reading, forever.&lt;/p&gt;&#xA;&lt;p&gt;Context-switching between sessions mid-judgment.&#xA;You decide on session A until a notification pulls you to session B, and back.&#xA;Each switch leaves a residue of the previous task in your head, and the decision you return to is made with half your mind still elsewhere.&#xA;The work feels continuous and is actually being done in shallow fragments.&lt;/p&gt;&#xA;&lt;p&gt;Signing off without attending.&#xA;The pull request opens, CI is green, the description looks right, and a feeling forms before the code is read.&#xA;We have known for a long time that &lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;most review works this way&lt;/a&gt;, and the arrival of machines writing the diff has not made the reading more rigorous, only the ritual more exhausting.&#xA;And attention collapses fastest on the work you had no investment in to begin with: it defends itself on what you care about and quietly gives up on what you do not (&lt;a href=&#34;https://tomrochette.com/the-cost-of-work-you-did-not-choose/&#34; &gt;The Cost of Work You Did Not Choose&lt;/a&gt;).&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Leverage Ranking&#xA;    &lt;div id=&#34;the-leverage-ranking&#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-leverage-ranking&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Not every part of an agent workflow needs your attention equally, and the error is treating them the same.&#xA;Rank them by how much they need a human mind.&lt;/p&gt;&#xA;&lt;p&gt;Here is the workflow as a pipeline with the attention budget laid over it:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Bar chart of human attention per pipeline stage: specification takes a great deal, generation none, verification very little, and judgment all of it&#34;&#xA;    src=&#34;https://tomrochette.com/attention-engineering/images/attention-allocation.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;Generation needs none.&#xA;Stop attending to it.&#xA;Hand over a finished intent and walk away.&lt;/p&gt;&#xA;&lt;p&gt;Verification, the question of whether it did the thing, needs very little, once you encode it as a check.&#xA;A failing test that must pass is attention that pays itself forever, for free, whether or not you are watching.&#xA;The residual cost is exactly the set of things you have not yet bothered to encode.&lt;/p&gt;&#xA;&lt;p&gt;Specification, the question of what you actually want, needs a great deal, and it is upstream.&#xA;Attention spent writing the spec pays a higher dividend than attention spent editing the output it produced, because a good spec prevents the wrong output from existing at all.&lt;/p&gt;&#xA;&lt;p&gt;Judgment, the question of whether the result is the thing you wanted, needs all of it, and it cannot be delegated.&#xA;This is the taste decision, the &amp;ldquo;good enough, ship it&amp;rdquo; moment, and it is the last compounding thing you do.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The skill is to spend little attention on the first two and most of it on the last two.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Attention Engineering, In Practice&#xA;    &lt;div id=&#34;attention-engineering-in-practice&#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;#attention-engineering-in-practice&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A few rules hold up.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Spend attention upstream, not downstream.&lt;/strong&gt;&#xA;The hour you invest in the specification is worth ten hours of fixing the generated output, because the output is downstream of the spec and inherits all of its omissions.&#xA;If you keep editing what the agent produced, the problem is usually the prompt you did not write, not the model.&lt;/p&gt;&#xA;&lt;p&gt;Encode correctness until it costs you nothing.&#xA;&lt;strong&gt;Every check you write is attention you never have to spend again.&lt;/strong&gt;&#xA;The goal is to shrink the &amp;ldquo;verify by hand&amp;rdquo; pile to the set of things that genuinely cannot be expressed as a check, which is smaller than most people think.&lt;/p&gt;&#xA;&lt;p&gt;Parallelize generation, serialize judgment.&#xA;Let many sessions run at once, but do all your deciding in one focused pass, one session at a time, with the others closed or paused.&#xA;The model is the part that benefits from parallelism.&#xA;Your judgment does not, and pretending otherwise is how you ship work you never read.&lt;/p&gt;&#xA;&lt;p&gt;Refuse to supervise.&#xA;If you find yourself watching the agent work, you have either failed to specify the task well enough to walk away, or you have not built the check that would let you trust the result without watching.&#xA;Both are fixable, and fixing them is a better use of attention than the watching.&lt;/p&gt;&#xA;&lt;p&gt;Protect the taste decision.&#xA;It is small in duration and enormous in leverage, and it is the one thing no tool will ever do for you, which is exactly why it is worth protecting from the noise of everything else.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Implication&#xA;    &lt;div id=&#34;the-implication&#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-implication&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The constraint has done what it always does when a layer gets automated: it moved up the chain, from generating the work to deciding whether it is good enough (&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;).&#xA;What is new is that the new constraint is not another task you can delegate.&#xA;It is your own attention.&lt;/p&gt;&#xA;&lt;p&gt;The ceiling on what you produce with agents is not the model, not the tooling, and not how many sessions you can spawn at once.&#xA;&lt;strong&gt;It is how much focused attention you can bring to the few decisions that require a mind, and how ruthlessly you keep that attention off the many that do not.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The people who get the most out of LLMs are not the ones with the cleverest prompts.&#xA;They are the ones who learned to walk away from generation, to encode everything checkable, and to save their finite attention for the specification and the taste that only they can supply.&lt;/p&gt;&#xA;&lt;p&gt;Working with agents is not a prompting skill.&#xA;It is an attention skill, and the sooner you treat your attention as the bottleneck it has become, the more of it you will have for the work that is yours to do.&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;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - the core insight this article builds on: generation is solved, acceptance is the bottleneck, and the taste half of acceptance is the last human loop&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the upstream pattern: automating a layer moves the constraint to the layer above it, here from generation to deciding&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - where parallel sessions make the attention bottleneck acute and turn it into human cognitive load&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; - the failure mode this article warns against: signing off on output you never actually attended to&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-cost-of-work-you-did-not-choose/&#34; &gt;The Cost of Work You Did Not Choose&lt;/a&gt; - why attention defends itself on work you care about and collapses on work you do not&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://en.wikipedia.org/wiki/Cognitive_load&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cognitive load&lt;/a&gt; - grounds why attention is finite: working memory is small, and heavy context switching fragments it into shallow processing&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My Philosophy</title>
      <link>https://tomrochette.com/my-philosophy/</link>
      <pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/my-philosophy/</guid>
      <category>philosophy</category><category>thoughts</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;If you read enough of what I have written, one sentence underlies all of it: &lt;strong&gt;encode your judgment into artifacts that outlive your attention&lt;/strong&gt;.&#xA;The artifacts change, the principle does not.&lt;/p&gt;&#xA;&lt;p&gt;A blog post is such an artifact.&#xA;A skill file is one.&#xA;The principles file I keep is one.&#xA;These artifacts range from trivial to deeply meaningful, and the same instinct produces all of them: I do not trust my attention to be present when it matters, so I put the judgment somewhere it can survive without me.&lt;/p&gt;&#xA;&lt;p&gt;This is not a philosophy of throughput, though it can look like one.&#xA;I am not trying to do more.&#xA;I am trying to do things that keep mattering after I stop doing them.&#xA;The victory condition I keep describing, in different vocabularies, is to &lt;strong&gt;make myself unnecessary at the layer I currently occupy&lt;/strong&gt;, so I am free to go find the next one.&#xA;That is what I am optimizing for, and once you see it, the rest follows.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The frame: the constraint always moves&#xA;    &lt;div id=&#34;the-frame-the-constraint-always-moves&#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-frame-the-constraint-always-moves&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;My master mental model is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Theory of Constraints&lt;/a&gt;, and I reach for it more than any other.&#xA;&lt;strong&gt;Every system has exactly one binding constraint at a time, and improving anything other than that constraint is wasted effort.&lt;/strong&gt;&#xA;The moment you relieve the constraint, it relocates: it does not disappear, it just moves.&#xA;Automate code production and verification becomes the bottleneck; solve verification and feature selection becomes the bottleneck; solve feature selection and the question of what deserves to exist at all becomes the bottleneck.&lt;/p&gt;&#xA;&lt;p&gt;The sequence I keep working through looks like this, and it never ends:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Staircase of the relocating constraint: code production is automated, then verification is solved, then feature selection is solved, leaving what deserves to exist as the frontier&#34;&#xA;    src=&#34;https://tomrochette.com/my-philosophy/images/shifting-bottleneck.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;I find this frame everywhere, because it is everywhere.&#xA;A team&amp;rsquo;s output is bounded by its weakest coordination path, not by how hard anyone works.&#xA;A career is bounded by the skill you keep avoiding, not by the one you keep sharpening.&#xA;A life is bounded by the activity you will not stop doing even though it stopped mattering years ago.&#xA;The work is always the same: find the layer where the constraint currently lives, push there, and then go find it again.&#xA;The people who look busy and ineffective are usually pushing somewhere the constraint is not.&#xA;The people who look calm and effective have simply learned to feel where it is.&lt;/p&gt;&#xA;&lt;p&gt;Games are one of the places I reach for when I want an analogy, because they externalize the thing I am trying to say.&#xA;Factorio, StarCraft, World of Warcraft, RollerCoaster Tycoon: each is a simulation with a binding constraint, a compounding resource, and a goal that is easy to forget while you optimize a sub-goal, which is why I wrote a &lt;a href=&#34;https://tomrochette.com/code-factories-factorio/&#34; &gt;series mapping each onto software&lt;/a&gt;.&#xA;The factory exists to launch the rocket, not the other way around, and every optimization that does not serve the product is wasted.&#xA;Analogies are not how I think all day; they are how I explain, and sometimes how I notice a pattern I had not named yet.&#xA;A trade-off that sounds abstract in software can become obvious when you see its equivalent in a game: you spent the minerals on the wrong unit, you hit the supply cap, you optimized a belt that leads nowhere.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The axis: compounding versus depreciating&#xA;    &lt;div id=&#34;the-axis-compounding-versus-depreciating&#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-axis-compounding-versus-depreciating&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If the constraint frame tells me where to push, &lt;strong&gt;the compounding axis tells me what is worth pushing on at all&lt;/strong&gt;.&#xA;Every activity, skill, fix, and artifact is either compounding or depreciating.&#xA;Compounding things leave future me more valuable for having done them: foundation knowledge, taste, specifications, encoded standards, durable mental models, relationships with people who grow.&#xA;Depreciating things lose value as the environment moves: boilerplate, syntax, one-off patches, anything the next model release will do for free.&lt;/p&gt;&#xA;&lt;p&gt;My decision tool is the two-year test: if I let this continue for two more years, does the me that emerges become more or less valuable?&#xA;This looks like a time-management question, but it is actually an ethical one.&#xA;It encodes a belief that a life is something you invest in, not something you spend.&lt;/p&gt;&#xA;&lt;p&gt;The discipline is asymmetric, and I state it as a rule: &lt;strong&gt;delegate depreciating activities ruthlessly, and protect compounding activities ferociously&lt;/strong&gt;.&#xA;Protecting a depreciating activity in the name of craft is not craft; it is nostalgia, and the environment will end it.&#xA;But delegating a compounding activity in the name of efficiency is not efficiency; it destroys your capability a little at a time.&#xA;The number to watch is not how much I delegate; it is how much of my remaining time lands on compounding work.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The method: write everything down&#xA;    &lt;div id=&#34;the-method-write-everything-down&#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-method-write-everything-down&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I do not trust my brain to hold anything important, because I have watched it drop too many important things.&#xA;So I externalize compulsively: notes, daily questions, workstacks, process documents, this blog.&#xA;Anything you keep only in your head is lost the moment you switch teams, or get tired, or get interrupted.&#xA;Writing does not degrade as it passes through people; speech does, so I write decisions down.&lt;/p&gt;&#xA;&lt;p&gt;Writing also does something the brain cannot: &lt;strong&gt;it makes what is implicit explicit, so it can be iterated on instead of left unrecorded&lt;/strong&gt;.&#xA;A principle in the head is a feeling that I roughly agree with; a principle on the page is a sentence I can sharpen, test against a counterexample, version, and improve.&#xA;I treat my own notes and principles the way I treat code: something to refactor when it no longer holds, not something to revere because I wrote it once.&#xA;An unrecorded thought cannot be revised; it can only be had again, slightly differently, next year.&lt;/p&gt;&#xA;&lt;p&gt;And, finally, I write because I do not know what I think until I do.&#xA;The first beneficiary of anything I write is me, because the act of writing is the act of finding out what I believe.&#xA;A verbal decision is just an opinion that has not been replaced yet; a written decision reaches people I am not with and argues for itself without me.&#xA;Writing is why the blog exists, why the &lt;a href=&#34;https://tomrochette.com/principles/&#34; &gt;principles file&lt;/a&gt; exists, why the daily questions exist.&#xA;They are not records of conclusions I had already reached.&#xA;They are how I reach those conclusions.&lt;/p&gt;&#xA;&lt;p&gt;Then I encode.&#xA;If a rule exists only in my review comments, it runs only when I am awake, looking, and willing to argue.&#xA;If it is recorded in a gate, a template, a supported default, it runs always.&#xA;&lt;strong&gt;A standard runs whether or not anyone agrees with it. An opinion stops applying the moment you go on vacation.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Verify, do not trust&#xA;    &lt;div id=&#34;verify-do-not-trust&#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;#verify-do-not-trust&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I am an empiricist by temperament, and &lt;strong&gt;I do not trust output; I trust the verification system behind it&lt;/strong&gt;.&#xA;A claim without an independent check is a hypothesis, not a result.&#xA;Its confidence is not evidence.&#xA;Once a system can produce faster than I can read it, review stops being a useful gate and becomes an empty ritual.&#xA;The right approach is to push human attention upstream to specification, let machines verify compliance downstream, and operate on reality rather than prediction.&#xA;A canary, a feature flag, a test that actually runs: these are more reliable than a tired human scanning a diff.&lt;/p&gt;&#xA;&lt;p&gt;The same skepticism turns inward.&#xA;I treat my own practices and opinions as hypotheses to test, not identities to defend.&#xA;When I change my mind I try to do it structurally, not shamefully; the meta-process compounds while the specific answer does not.&#xA;Consistently wrong is worse than inconsistently right, and the only way to avoid being consistently wrong is to keep asking what would change my mind.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Attention is the one resource I cannot manufacture&#xA;    &lt;div id=&#34;attention-is-the-one-resource-i-cannot-manufacture&#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;#attention-is-the-one-resource-i-cannot-manufacture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Attention is the binding constraint of my life, so I treat it as the thing the whole system is designed to protect.&lt;/strong&gt;&#xA;Keeping up is a losing strategy; the target moves faster than any consumption can match.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The move is not to consume more but to build a funnel that throws almost everything away, confidently and without guilt.&lt;/strong&gt;&#xA;Treat urgency as something someone benefits from exaggerating.&#xA;Prefer pull over push: knowing where to find something when I need it beats knowing it now.&#xA;Re-audit the filter periodically, because filters are themselves depreciating assets.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Asymmetry favors the tighter filter.&lt;/strong&gt;&#xA;I would rather miss something than be overwhelmed by it, and I would rather be surprised by a concept I can reuse for a decade than briefed on ten things I will forget next week.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The moral register&#xA;    &lt;div id=&#34;the-moral-register&#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-moral-register&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I keep this part out of most of my writing, because it does not look like the rest, but it is central.&#xA;My philosophy is Stoic.&#xA;The happiness of your life depends upon the quality of your thoughts.&#xA;People are frugal in guarding their property but wasteful of the one thing in which it is right to be stingy, which is time.&#xA;He who spares the wicked injures the good.&#xA;These are not decorative quotes to me; they are the axioms the rest has to be consistent with.&lt;/p&gt;&#xA;&lt;p&gt;From which: tolerate bad behavior and you harm the good; never discourage anyone who continually makes progress no matter how slow; a fast, clear no is a gift, not an injury; skip the blame during the incident and save it for the post-mortem; a father who can admit in writing where he failed gives his children permission to be imperfect too.&#xA;I keep a register of my own failures, not as self-punishment, but because a rule without the failure that produced it is a slogan, and that failure is the part worth passing on.&lt;/p&gt;&#xA;&lt;p&gt;I am existentialist about meaning and utilitarian about consequences, and I see no contradiction.&#xA;&lt;strong&gt;Life does not have a meaning. You define the meaning of your life.&lt;/strong&gt;&#xA;From there, the reasonable goal is to reduce pain or increase capability for the largest population you can reach, accepting that capitalism will mostly reward you for producing work whose purpose is, in the end, about survival.&#xA;I do not find this grim; I find it clarifying.&#xA;It means the meaning is mine to assign and the assignment is allowed to be revised.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Set your own standard&#xA;    &lt;div id=&#34;set-your-own-standard&#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;#set-your-own-standard&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Do not define your identity by what the people around you do.&lt;/strong&gt;&#xA;If their standards are lower than yours and they do things you do not want to see done, that is not permission to lower yours to match.&#xA;Most people drift toward the average of their environment without noticing, and the excuse is always that everyone else is doing it.&#xA;The fact that someone else does something wrong does not make it right.&lt;/p&gt;&#xA;&lt;p&gt;Be your own standard setter.&#xA;Be what you would want others to be, regardless of whether they are.&#xA;&lt;strong&gt;The standard is not a comparison to the people next to you; it is a comparison to the person you decided to be, and who you were before.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;In one sentence&#xA;    &lt;div id=&#34;in-one-sentence&#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;#in-one-sentence&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Encode your judgment into artifacts that outlive your attention, from the skill file to the principles file, because that is the only move that simultaneously finds the bottleneck, compounds the foundation, protects the taste, and lets you become unnecessary at the layer you have finished building.&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;https://tomrochette.com/principles/&#34; &gt;Principles&lt;/a&gt; - the compiled list of operating rules that this article distills into a single thesis&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-meaning-of-life/&#34; &gt;The Meaning of Life&lt;/a&gt; - the existentialist core that the moral register section rests on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the constraint frame as it applies to software and AI&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ai-maxxing-vs-fighting-against-it/&#34; &gt;AI-Maxxing and Resistance Are the Same Mistake&lt;/a&gt; - the compounding-versus-depreciating axis and the two-year test&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://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Theory of Constraints&lt;/a&gt; - the master mental model the frame section is built on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Marcus_Aurelius&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Marcus Aurelius&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Seneca&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Seneca&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Zeno_of_Citium&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Zeno&lt;/a&gt; - the three Stoic axioms quoted in the moral register&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Whoever Ships First Decides</title>
      <link>https://tomrochette.com/whoever-ships-first-decides/</link>
      <pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/whoever-ships-first-decides/</guid>
      <category>software-engineering</category><category>team-management</category><category>decision-making</category><category>code-quality</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;I looked at a feature a colleague shipped last week, and it was wrong in the ways I would have predicted.&#xA;Not broken, just built on shortcuts I knew we would pay for later.&#xA;I had no time to spare, and reopening the decision would have taken a meeting, a design argument, and most of a sprint.&#xA;So I said nothing, and his version became the version the team now supports.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is how the standard on a team actually gets set: not by what anyone agrees is correct, but by what someone was willing to ship before the rest of us could object.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The interesting question is not whether the work was bad.&#xA;The interesting question is why bad work, once shipped, almost never gets undone, even when everyone quietly knows it is bad.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;&amp;ldquo;Done&amp;rdquo; Changes the Question&#xA;    &lt;div id=&#34;done-changes-the-question&#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;#done-changes-the-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before the work exists, the question the team is asking is &amp;ldquo;is this the right approach?&amp;rdquo;&#xA;Once it ships, the question quietly becomes &amp;ldquo;is it worth fighting to change this?&amp;rdquo;&#xA;Those are different questions, and the second one is almost always answered no.&lt;/p&gt;&#xA;&lt;p&gt;The reason is not that the work got better when it merged.&#xA;It is that reversing it now costs something it did not cost before.&#xA;You have to schedule a conversation, justify the rework to someone who already feels they finished, and spend credibility you were saving for your own work.&#xA;Letting it stand costs nothing in the hour you notice it.&#xA;So you let it stand, and so does everyone else who noticed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A piece of work does not have to be good to survive.&#xA;It only has to be done, because done work turns a technical judgment into a political cost, and political costs are paid by the person who raises them.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cost to Object Is Concentrated. The Cost to Absorb Is Hidden.&#xA;    &lt;div id=&#34;the-cost-to-object-is-concentrated-the-cost-to-absorb-is-hidden&#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-cost-to-object-is-concentrated-the-cost-to-absorb-is-hidden&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The whole pattern depends on this one asymmetry.&lt;/p&gt;&#xA;&lt;p&gt;Objecting to bad work is expensive in the moment, and you pay the full bill yourself.&#xA;It is your afternoon, your difficult conversation, your reputation as the person who slows things down.&#xA;The benefit of objecting, if you win, is spread across the team and across the next year, and most of it lands on people who will never know you objected.&lt;/p&gt;&#xA;&lt;p&gt;Absorbing the bad work is the opposite.&#xA;It is free in the moment, and its cost is distributed across the whole team and deferred into the future, where it shows up as the friction of working around a decision nobody loved.&lt;/p&gt;&#xA;&lt;p&gt;Faced with a cost that is large, immediate, and personal, against a cost that is small, deferred, and shared, almost everyone picks the second one.&#xA;That is not laziness.&#xA;It is a rational response to badly priced incentives.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The bad call survives not because anyone thinks it is good, but because the person who would have objected was busy, and objecting then would have cost them their afternoon, and they did not have an afternoon.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bar Drifts to the Most Willing Shipper&#xA;    &lt;div id=&#34;the-bar-drifts-to-the-most-willing-shipper&#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-bar-drifts-to-the-most-willing-shipper&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once you accept that done work is hard to undo and objection is expensive, a consequence follows that most teams never state out loud.&lt;/p&gt;&#xA;&lt;p&gt;The effective quality bar is not set by what the team agrees is correct.&#xA;It is set by whoever has the lowest bar and the highest willingness to act first.&lt;/p&gt;&#xA;&lt;p&gt;If you ship before anyone can object, your version becomes the default, and the default is what everyone else now has to spend energy to change.&#xA;The person who cares about doing it right is at a structural disadvantage.&#xA;Doing it right takes longer than doing it fast, and by the time the careful version is ready, the fast version is already in place.&lt;/p&gt;&#xA;&lt;p&gt;The disadvantage compounds.&#xA;Other people copy the shortcut, because the shortcut is now the pattern the codebase rewards.&#xA;The exception becomes the convention.&#xA;A year later, nobody remembers that the pattern started as a shortcut someone shipped under deadline.&#xA;Defending the shortcut has become the team&amp;rsquo;s default position.&lt;/p&gt;&#xA;&lt;p&gt;The drift compounds in one direction:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;One-way timeline from a shortcut shipped under deadline to it becoming the default, being copied, becoming the convention, and being defended by default&#34;&#xA;    src=&#34;https://tomrochette.com/whoever-ships-first-decides/images/shortcut-to-convention.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;&lt;strong&gt;Teams do not converge on their best engineer&amp;rsquo;s standard.&#xA;They converge on whatever the most active shipper leaves behind, and they call it the way things are done here.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cost Was Never Avoided. It Was Moved.&#xA;    &lt;div id=&#34;the-cost-was-never-avoided-it-was-moved&#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-cost-was-never-avoided-it-was-moved&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every time a team absorbs bad work, it tells itself the absorption was free.&#xA;It was not.&lt;/p&gt;&#xA;&lt;p&gt;The cost was simply transferred, from one person&amp;rsquo;s afternoon of objection to the whole team&amp;rsquo;s months of working around the decision, and from a bill addressed to the moment into a bill addressed to the future.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Then the rework arrives, and it is always larger than the objection would have been.&lt;/strong&gt;&#xA;By the time the shortcut finally breaks badly enough to force a rewrite, other code has been built on top of it, the original author has moved on, and the team is paying to redo work it already paid to do once.&lt;/p&gt;&#xA;&lt;p&gt;This is the cruel accounting of absorption.&#xA;It looked like the cheap option only because the cost arrived later and was borne by someone else.&#xA;The full cost, plus interest, lands on whoever still works near the code when it finally fails.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Decision Was Usually Unsound for a Reason&#xA;    &lt;div id=&#34;the-decision-was-usually-unsound-for-a-reason&#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-decision-was-usually-unsound-for-a-reason&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It is worth noticing why the shipped work is so often the wrong call, because it is rarely because the author was incompetent.&lt;/p&gt;&#xA;&lt;p&gt;The person who ships first is usually optimizing for the thing in front of them, getting something working, hitting a deadline, unblocking a demo.&#xA;The costs they are creating live somewhere they cannot see: in the downstream maintenance, in the constraints they did not know about, in the parts of the system their shortcut quietly contradicts.&lt;/p&gt;&#xA;&lt;p&gt;They made a locally reasonable decision that is globally wrong.&#xA;Nobody was in the room to add the global view, because the work was already done by the time the people who held that view heard about it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The person who does the work is rarely the person the consequences land on, and shipping first lets them decide for everyone without ever bearing the cost.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The pattern is not only a problem with AI-generated code, though &lt;a href=&#34;https://tomrochette.com/who-maintains-the-slop/&#34; &gt;cheap generation has made it worse&lt;/a&gt;.&#xA;It is the older and more general problem of whoever acts first setting the default for everyone who acts later, and it applies just as cleanly to a human&amp;rsquo;s rushed pull request as to a model&amp;rsquo;s confident output.&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;p&gt;You cannot make objection free.&#xA;You can make it cheap enough that it happens before the bad work becomes the default, and that is where the leverage is.&lt;/p&gt;&#xA;&lt;p&gt;Object in writing the moment you see it, even if you cannot fix it now.&#xA;A single line saying &amp;ldquo;this shortcut will cost us in X&amp;rdquo; takes two minutes, costs almost no political capital, and does two things at once.&#xA;It puts the author on notice that the decision was not unanimous, and it leaves a record so that when the cost arrives later, the pattern is traceable instead of invisible.&#xA;The absence of objection is not consent.&#xA;It is a measure of how busy everyone was, and writing it down stops that absence from being read as agreement.&lt;/p&gt;&#xA;&lt;p&gt;Price the absorption out loud.&#xA;When you absorb bad work to keep moving, say so, and say who will pay: &amp;ldquo;I am taking this as-is to hit the date, and we will redo it next quarter, and that rewrite is the cost of shipping it now.&amp;rdquo;&#xA;Naming that cost prevents the team from pretending the absorption was free, which is the pretense that lets the pattern repeat.&lt;/p&gt;&#xA;&lt;p&gt;Lower the cost of the conversation.&#xA;A ten-minute &amp;ldquo;I would build this differently, here is why&amp;rdquo; is cheaper than a rework, and cheaper than the resentment that builds when you say nothing for six months.&#xA;Most engineers respond well to a specific, early objection, and badly to a vague, late one, so timing matters more than wording.&lt;/p&gt;&#xA;&lt;p&gt;Make the shipper own the consequences for a period.&#xA;The person who shipped the shortcut remains responsible for the bugs it produces, instead of routing them to whoever happens to be nearby.&#xA;This does not require blame; it just re-attaches the cost of the decision to the person who captured the benefit of shipping it, which is the alignment the current default removes.&lt;/p&gt;&#xA;&lt;p&gt;And if you are the one who shipped, treat silence as the weak signal it is.&#xA;&amp;ldquo;Nobody objected&amp;rdquo; does not mean everyone agreed.&#xA;It means everyone was busy, and the most accurate reading of a quiet merge is that no one stopped you, not that you were right.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The standard on a team is set by what survives, and what survives is whatever was too expensive to undo.&#xA;If you want a higher standard, do not ask people to object harder.&#xA;Make objection cheap, make absorption visible, and make the cost of shipping bad work land on the person who shipped it, and the bar stops drifting on its own.&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;https://tomrochette.com/the-cost-of-work-you-did-not-choose/&#34; &gt;The Cost of Work You Did Not Choose&lt;/a&gt; - the inverse of this pattern: work handed to you to finish, where here the work is already done and you inherit the burden of supporting it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-maintains-the-slop/&#34; &gt;Who Maintains the Slop?&lt;/a&gt; - the AI-era intensification of the same asymmetry, where cheap generation lets the producer capture the benefit and the maintainer pay the cost&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/distributed-product-management-cheap-to-decide-costly-to-undo/&#34; &gt;Distributed Product Management: Cheap to Decide, Costly to Undo&lt;/a&gt; - the same cost asymmetry at the level of product direction, where cheap decisions accumulate faster than they can be corrected&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream, Fixes Must Flow Upstream&lt;/a&gt; - why the rework tax on absorbed bad work always exceeds the cost of fixing it at the source&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/when-a-closed-decision-reopens/&#34; &gt;When a Closed Decision Reopens&lt;/a&gt; - how to make a decision durable in writing; here the decision never became durable because it never got properly made&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://en.wikipedia.org/wiki/Status_quo_bias&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Status quo bias&amp;rdquo;&lt;/a&gt; - the cognitive preference for the current state, which is why shipped work survives even when everyone knows it is wrong&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Default_effect&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Default effect&amp;rdquo;&lt;/a&gt; - the tendency to accept whatever is already in place, the mechanism by which the shipped version becomes the standard&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Principal%E2%80%93agent_problem&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Principal-agent problem&amp;rdquo;&lt;/a&gt; - the split between the person deciding to ship and the people bearing the maintenance cost&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Technical_debt&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Technical debt&amp;rdquo;&lt;/a&gt; - the deferred, compounding cost of the shortcut, which arrives later as rework&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Loss_aversion&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Loss aversion&amp;rdquo;&lt;/a&gt; - why the concentrated cost of objecting feels larger than the amortized cost of absorbing, even when the absorption costs more overall&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Distributed Product Management: Cheap to Decide, Costly to Undo</title>
      <link>https://tomrochette.com/distributed-product-management-cheap-to-decide-costly-to-undo/</link>
      <pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/distributed-product-management-cheap-to-decide-costly-to-undo/</guid>
      <category>product-management</category><category>software-engineering</category><category>ai</category><category>llm</category><category>decision-making</category><category>team-management</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Distributed product management is what happens when there is no dedicated product owner, and the people building the product also decide what the product should be.&#xA;Each engineer, or each small team, makes product calls inside their own area, and those calls aggregate into the product without anyone coordinating the whole.&#xA;&lt;strong&gt;The arrangement removes a genuine bottleneck, the single product manager, and it removes something less obvious at the same time: the friction that used to force independent decisions to agree with each other.&#xA;In the age of LLMs that friction is already gone, which is why a structure that used to be merely risky has become quietly destructive.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Distributed Product Management Actually Is&#xA;    &lt;div id=&#34;what-distributed-product-management-actually-is&#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-distributed-product-management-actually-is&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The dedicated product owner is a specific role: one person who holds the product&amp;rsquo;s direction, decides what gets built and what does not, and is accountable when the result is incoherent.&#xA;Distributed product management dissolves that role and spreads its responsibilities across the engineers doing the work.&lt;/p&gt;&#xA;&lt;p&gt;It shows up in a few familiar forms.&#xA;Small teams that never hired a product manager and let the founders or lead engineer set direction.&#xA;Open-source projects, where maintainers decide what to accept and what to build, with no owner above them.&#xA;&amp;ldquo;Empowered teams,&amp;rdquo; in the sense &lt;a href=&#34;https://www.svpg.com/books/&#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=www.svpg.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Marty Cagan describes&lt;/a&gt;, where a cross-functional team is given a problem to solve rather than a feature to implement, and the team decides the solution itself.&#xA;And, increasingly, engineering cultures where LLM-assisted development has made shipping so cheap that waiting on a product decision feels slower than just making one.&lt;/p&gt;&#xA;&lt;p&gt;In all of these, the same property holds.&#xA;&lt;strong&gt;The person deciding what to build is the person building it, and there is nobody whose job is to keep the pieces coherent.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Case For It&#xA;    &lt;div id=&#34;the-case-for-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;#the-case-for-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The merits are genuine, and I do not want to understate them, because they explain why the arrangement is so common.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It removes a genuine bottleneck.&lt;/strong&gt;&#xA;A single product manager is a single point of coordination.&#xA;When they are slow, blocked, or absent, the whole team waits.&#xA;When there is no owner in the path, decisions move at the speed of engineering.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Decisions sit with the people closest to the problem.&lt;/strong&gt;&#xA;The engineer implementing the feature usually has more context about the technical reality and the user&amp;rsquo;s actual behavior than a product owner who learned the domain indirectly.&#xA;Moving the decision to the people who already have the context avoids a translation step, and it avoids the gap between a spec and what the spec was supposed to mean.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Ownership produces motivation.&lt;/strong&gt;&#xA;People who decide what they work on care about the work in a way that people handed a task do not, a cost I have felt directly &lt;a href=&#34;https://tomrochette.com/the-cost-of-work-you-did-not-choose/&#34; &gt;in finishing work I did not choose&lt;/a&gt;.&#xA;Distributed product management lets engineers keep that investment.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It scales without growing an organization.&lt;/strong&gt;&#xA;A dedicated product owner has a finite span of attention.&#xA;As a product grows, either the owner becomes a bottleneck or you have to hire and coordinate more of them.&#xA;Distributed product management scales with the number of engineers by default.&lt;/p&gt;&#xA;&lt;p&gt;Each of these is a good argument.&#xA;Together they explain why the structure keeps reappearing, and why it often works well for a while.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Case Against It&#xA;    &lt;div id=&#34;the-case-against-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;#the-case-against-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The problems are also genuine, and they take longer to show up, which is why they are consistently underestimated.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The product loses coherence.&lt;/strong&gt;&#xA;A product is a system of decisions that have to agree with each other.&#xA;When each decision is made locally and optimally, the result is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Local_optimum&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;local optimum&lt;/a&gt;: every piece is reasonable on its own, and the whole is worse than any of its parts.&#xA;Two engineers build two ways of doing the same thing.&#xA;A new feature uses a pattern that contradicts the one shipped last quarter.&#xA;The surface area grows, and nothing ties it together.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Nobody owns the whole.&lt;/strong&gt;&#xA;Coherence is not a side effect of good local decisions.&#xA;It is a separate concern, the job of noticing the global pattern and sacrificing a local win when it would break that pattern.&#xA;Without an owner, that job has no home, which means it does not get done.&#xA;This is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Tragedy_of_the_commons&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tragedy of the commons&lt;/a&gt; applied to a product: the shared surface that everyone uses and nobody maintains.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Nobody is paid to say no.&lt;/strong&gt;&#xA;The hardest part of product work is deciding what not to build.&#xA;A dedicated owner can kill a feature because they are accountable for focus.&#xA;An engineer building in their own area has no incentive to decline their own idea, and no authority to decline anyone else&amp;rsquo;s.&#xA;The result is feature accumulation, the same failure mode that turns a &lt;a href=&#34;https://tomrochette.com/backlog-management-best-practices/&#34; &gt;backlog into a dumping ground&lt;/a&gt;, except it ships directly into the product.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cross-cutting decisions have no owner.&lt;/strong&gt;&#xA;Some decisions only make sense globally: the pricing model, the data model, the API conventions, the identity of the product.&#xA;These decisions occasionally require one team to accept a worse local outcome so the whole can stay consistent.&#xA;Distributed product management has no mechanism for that trade, because no one is authorized to impose a cost on one part to benefit another.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The strategy drifts, silently.&lt;/strong&gt;&#xA;When every team optimizes for the metric in front of it, the product as a whole drifts toward whatever those local metrics reward, and that direction is rarely the one the company would have chosen deliberately.&#xA;This is &lt;a href=&#34;https://en.wikipedia.org/wiki/Goodhart%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Goodhart&amp;rsquo;s law&lt;/a&gt; at the level of the product roadmap: each local signal looks reasonable, and the aggregate stops pointing anywhere worth going.&lt;/p&gt;&#xA;&lt;p&gt;The common thread is that distributed product management is excellent at producing decisions and bad at producing a coherent product.&#xA;For a long time, that trade was manageable, because the cost of building kept the decision rate low.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why LLMs Make the Trade Worse&#xA;    &lt;div id=&#34;why-llms-make-the-trade-worse&#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;#why-llms-make-the-trade-worse&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the part that has changed.&lt;/p&gt;&#xA;&lt;p&gt;The friction that used to keep distributed product management tolerable was the cost of implementation.&#xA;Building a feature took days or weeks, and that cost forced a conversation before the work started.&#xA;An engineer who wanted to ship something had to justify the time, coordinate with the people whose work it touched, and get the change reviewed.&#xA;The friction was accidental, but it had a useful effect: it throttled the rate at which independent decisions could accumulate.&lt;/p&gt;&#xA;&lt;p&gt;LLMs have removed that friction.&#xA;An engineer who wants to ship a feature can now spec it, generate it, and open a pull request in an afternoon, without asking anyone whether the feature should exist.&#xA;&lt;strong&gt;The cost of making a product decision and the cost of the decision&amp;rsquo;s consequence have been decoupled.&#xA;The first one collapsed toward zero.&#xA;The second one did not.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is what makes distributed product management destructive in the current era rather than merely inefficient.&#xA;When decisions were expensive, an incoherent product was a slow problem that you could notice and correct.&#xA;When decisions are nearly free, the incoherence arrives faster than any human can track it, and the cost shows up downstream: in a codebase nobody wants to touch, in a feature surface nobody can fully use, in the slow accumulation of a &lt;a href=&#34;https://tomrochette.com/the-foundation-predicts-the-house-of-cards/&#34; &gt;house of cards&lt;/a&gt; built from locally reasonable additions.&lt;/p&gt;&#xA;&lt;p&gt;The deeper problem is that cheap decisions change who decides.&#xA;When a product decision required a meeting, the decision belonged to whoever ran the meeting.&#xA;When it requires only a prompt, the decision belongs to whoever types first.&#xA;That is a change in governance that looks like a change in speed, and most teams have not noticed it happened.&lt;/p&gt;&#xA;&lt;p&gt;It is worth saying what this argument is not claiming.&#xA;It is not claiming that engineers are bad at product judgment.&#xA;Many are excellent at it, and the &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;bottleneck has moved toward exactly that judgment&lt;/a&gt; as implementation has been automated.&#xA;It is claiming that good individual judgment, applied independently and at machine speed, with no coherence layer above it, produces a worse product than the same judgment applied inside a shared frame.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Question Is Which Decisions to Distribute&#xA;    &lt;div id=&#34;the-question-is-which-decisions-to-distribute&#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-question-is-which-decisions-to-distribute&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The way out is not to bring back the single product manager as a gatekeeper.&#xA;That would reintroduce the bottleneck distributed product management was right to remove.&#xA;The way out is to notice that &amp;ldquo;product decisions&amp;rdquo; is not one category, and that the right structure differs by decision type.&lt;/p&gt;&#xA;&lt;p&gt;A useful split comes from the &lt;a href=&#34;https://en.wikipedia.org/wiki/Disagree_and_commit&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;one-way door versus two-way door&lt;/a&gt; distinction.&#xA;Some decisions are reversible.&#xA;If you ship the wrong notification wording, or pick the suboptimal layout for a single screen, you can change it next week with low cost.&#xA;These decisions should be distributed, because distributing them removes friction without risking much.&lt;/p&gt;&#xA;&lt;p&gt;Other decisions are effectively irreversible.&#xA;What the product is, which problem it solves, which abstractions it commits to, how the pieces fit together, these set the trajectory of everything built on top of them.&#xA;Once a thousand features depend on a data model, the model is no longer negotiable.&#xA;These decisions need a single owner, not because the owner is smarter but because coherence requires that someone be able to choose the global over the local.&lt;/p&gt;&#xA;&lt;p&gt;The split is a routing rule, and it is easiest to apply as a decision:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    D[A product decision] --&amp;gt; Q{Is it reversible}&#xA;    Q --&amp;gt;|yes, a two-way door| R[Distribute it to the team closest to the context]&#xA;    Q --&amp;gt;|no, a one-way door| O[Single decision-maker plus a written record]&#xA;    O --&amp;gt; G[Someone can choose the global over the local]&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;The failure mode of distributed product management is not that it distributes decisions.&#xA;It is that it distributes the irreversible ones along with the reversible ones.&lt;/strong&gt;&#xA;Most teams that suffer from &amp;ldquo;no product owner&amp;rdquo; are actually suffering from no owner for the small set of trajectory-setting decisions, while the reversible ones are handled fine.&#xA;Diagnosing which set is causing the pain is more useful than arguing about whether to have a product manager at all.&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;p&gt;If your team operates without a dedicated product owner and the product is becoming inconsistent, a few concrete moves help.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write the product direction down, in one place, and keep it current.&lt;/strong&gt;&#xA;This is the single highest-leverage action, and it is the same lesson as &lt;a href=&#34;https://tomrochette.com/when-a-closed-decision-reopens/&#34; &gt;breaking the scope relitigation cycle&lt;/a&gt;: a direction that is not written down cannot outlast the next person or the next quarter.&#xA;A short, written statement of direction, the milestones you are committing to now, and the constraints that forced the compromise, give distributed decisions something to check themselves against.&#xA;Without it, every engineer is optimizing for a slightly different product that exists only in their head.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Separate the two questions explicitly.&lt;/strong&gt;&#xA;On every non-trivial decision, ask first whether it is reversible or trajectory-setting.&#xA;Distribute the first.&#xA;Force the second through a single decision-maker and a written record, even if that decision-maker is a rotating engineer rather than a hired product manager.&#xA;The role matters less than the fact that someone owns it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Encode product-level invariants the way you encode engineering conventions.&lt;/strong&gt;&#xA;The teams that keep coherence without a full-time owner are the ones that have externalized their standards into a form the work has to satisfy: style guides for the product surface, principles for which features are in scope, a definition of what the product is not.&#xA;This is the same mechanism that lets a mature team &lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;scale its conventions into the model&lt;/a&gt;.&#xA;A convention that is not written down is advice that gets ignored.&#xA;A convention in a written principle is a constraint that gets enforced.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Keep a thin, intent-level review for product decisions, as a backstop and not a bottleneck.&lt;/strong&gt;&#xA;The point is not to gate every change.&#xA;The point is to catch the small fraction of changes that are individually reasonable and collectively incoherent, the second implementation of an existing feature, the new pattern that contradicts the established one, the locally optimal choice that breaks a global invariant.&#xA;This is the product equivalent of the intent check I keep on &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;LLM-generated code&lt;/a&gt;: light by default, held back for the changes that carry genuine risk.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reallocate the time you saved on implementation into judgment.&lt;/strong&gt;&#xA;The instinct, once implementation is cheap, is to ship more.&#xA;The correct response is to decide more carefully, because the cost of being wrong has not come down even though the cost of acting has.&#xA;Time spent on problem selection and direction now buys more than time spent on execution ever did.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Dedicated Owner&amp;rsquo;s Job Was Coherence&#xA;    &lt;div id=&#34;the-dedicated-owners-job-was-coherence&#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-dedicated-owners-job-was-coherence&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Distributed product management is not wrong.&#xA;It removes a genuine bottleneck, it puts decisions close to the context, and it scales without growing an organization.&#xA;The mistake is concluding that because the dedicated owner was unnecessary, the thing the owner was doing is also unnecessary.&lt;/p&gt;&#xA;&lt;p&gt;It was not.&#xA;The owner&amp;rsquo;s actual job was coherence: understanding the whole product, killing the features that did not fit, and choosing the global over the local when the two disagreed.&#xA;Remove the person and you still have to keep the function, or accept that the product will be built faster than anyone can keep it coherent.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;In an era when a product decision costs an afternoon and its consequences last for years, the scarce resource is no longer the ability to decide.&#xA;It is the ability to decide in a way that still makes sense next to every other decision the team is making at the same time.&lt;/strong&gt;&#xA;That is the bottleneck distributed product management has to solve, and LLMs have made it urgent rather than theoretical.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why the constraint has climbed from implementation to deciding what to build, the exact layer where distributed product management lives&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - the team-level view of the same shift, and the case for specification as the highest-leverage skill once execution is cheap&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/feature-parity-is-not-a-moat/&#34; &gt;Feature Parity Is Not a Moat&lt;/a&gt; - the danger of accumulating shallow surface area, which undirected distributed decisions produce on fast-forward&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/when-a-closed-decision-reopens/&#34; &gt;When a Closed Decision Reopens&lt;/a&gt; - the case for writing direction down so it survives the next conversation, the mechanism that lets distributed decisions stay aligned&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-foundation-predicts-the-house-of-cards/&#34; &gt;The Foundation Predicts the House of Cards&lt;/a&gt; - why encoded conventions and written judgment outrank tacit ones, applied here to product direction&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/backlog-management-best-practices/&#34; &gt;Backlog Management Best Practices&lt;/a&gt; - the discipline of saying no and keeping focus, the function a coherence owner was quietly performing&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://www.svpg.com/books/&#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=www.svpg.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Marty Cagan, &amp;ldquo;Inspired: How to Create Tech Products Customers Love&amp;rdquo;&lt;/a&gt; - the empowered-team model, the legitimate form of distributed product management, which pairs distributed execution with a strong shared vision&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Local_optimum&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Local optimum&amp;rdquo;&lt;/a&gt; - the formal version of the coherence problem: locally optimal decisions producing a globally suboptimal product&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Tragedy_of_the_commons&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Tragedy of the commons&amp;rdquo;&lt;/a&gt; - the dynamic by which a shared product surface, used by everyone and maintained by no one, degrades&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Goodhart%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Goodhart&amp;rsquo;s law&amp;rdquo;&lt;/a&gt; - how optimizing local signals causes the product&amp;rsquo;s aggregate direction to drift away from any deliberately chosen target&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Disagree_and_commit&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Disagree and commit&amp;rdquo;&lt;/a&gt; - the one-way door versus two-way door distinction that separates decisions which can be distributed from those which need an owner&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What I&#39;ve built and what I need: July 2026</title>
      <link>https://tomrochette.com/what-ive-built-and-what-i-need/2026-07/</link>
      <pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-ive-built-and-what-i-need/2026-07/</guid>
      <category>what-ive-built-and-what-i-need</category><category>personal-update</category><category>llm</category><category>ai-agents</category><category>automation</category><category>sdlc</category><category>workflows</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The headline this month was &lt;strong&gt;llm-augmented-workflows carrying an issue all the way through to a human gate&lt;/strong&gt;.&#xA;I also spent the month maturing the SDLC pipeline, reworking PR validation around visual proof, and shipping several new skills.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Have Been Working On&#xA;    &lt;div id=&#34;what-i-have-been-working-on&#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-i-have-been-working-on&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Iterating on &lt;a href=&#34;https://github.com/TomzxCode/llm-augmented-workflows&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-augmented-workflows&lt;/a&gt;.&lt;/strong&gt;&#xA;The project is still rough, but it now moves an issue through actual stages instead of demoing a single one.&#xA;A cycle looks like this: an issue is created, it gets triaged, and the appropriate workflow runs until it hits a stage that requires a human.&#xA;For feature requests, the workflow runs triage into a plan PR for review, and once the plan merges, continues to an implementation PR.&#xA;For bug fixes, the flow goes from triage into a fix PR rather than stopping at reproduction.&#xA;Triage is handled end to end, which closes a point I&amp;rsquo;d written about in earlier posts.&#xA;I&amp;rsquo;m building it to support both human-gated and fully autonomous modes from the start, so the same flow can run with or without checkpoints.&lt;/p&gt;&#xA;&lt;p&gt;The cycle is easiest to follow as a flow:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    I[Issue created] --&amp;gt; T[Triage]&#xA;    T --&amp;gt;|feature request| P[Plan PR]&#xA;    P --&amp;gt; R[Human review]&#xA;    R --&amp;gt;|plan merges| IMP[Implementation PR]&#xA;    T --&amp;gt;|bug fix| F[Fix PR]&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Building &lt;a href=&#34;https://github.com/TomzxCode/github-board&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;github-board&lt;/a&gt;.&lt;/strong&gt;&#xA;github-board is a frontend-only web application, served directly via GitHub Pages, that lets you build columns and rows from any field on a GitHub issue or pull request.&#xA;It turns issue and PR data into a configurable board view with no backend.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Adding the &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/resolve-pr-conflicts/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;resolve-pr-conflicts&lt;/a&gt; skill.&lt;/strong&gt;&#xA;I now run the skill daily across the repositories I contribute to.&#xA;It scans for my open pull requests that have merge conflicts and resolves each one in parallel, fanning out a separate agent session per PR into its own worktree.&#xA;Each session merges the base branch, resolves the conflict markers, runs the project&amp;rsquo;s verification, and pushes, aborting ambiguous or verify-failing resolutions rather than guessing them.&#xA;The practical effect is that my PRs stay mergeable without me managing rebase loops by hand.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Refactored the SDLC pipeline.&lt;/strong&gt;&#xA;Feature directories dropped the &lt;code&gt;FEAT-NNNN-&lt;/code&gt; prefix for &lt;code&gt;N-&amp;lt;slug&amp;gt;&lt;/code&gt;, and pending items now carry a &lt;code&gt;p&lt;/code&gt; prefix with a promotion flow through &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-placeholder-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-placeholder-issue&lt;/a&gt;.&#xA;The old &lt;code&gt;questions.md&lt;/code&gt; drift log is gone, replaced by a &lt;code&gt;review-verdict&lt;/code&gt; regression that &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-sdlc&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/backpropagate-sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;backpropagate-sdlc&lt;/a&gt; track across phases.&#xA;Review findings now persist to files instead of disappearing, and I slimmed the &lt;code&gt;create-*&lt;/code&gt; family by roughly 750 lines by pointing each at templates and giving it a self-check checklist.&#xA;Each phase skill is now explicitly loaded before it runs, and a needs-assessment template joined the pipeline.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reworked PR validation around visual proof.&lt;/strong&gt;&#xA;Visual proof capture moved out of &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-pr&lt;/a&gt; into a dedicated &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/validate-implementation/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;validate-implementation&lt;/a&gt; skill, which writes a proof manifest before the PR is ever opened, so recording happens before creation rather than during it.&#xA;Bug fixes now capture before/after recordings via &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/reproduce-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;reproduce-issue&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/fix-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;fix-issue&lt;/a&gt;.&#xA;And &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/validate-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;validate-pr&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/verify-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;verify-pr&lt;/a&gt; now check against the issue&amp;rsquo;s acceptance criteria rather than the PR&amp;rsquo;s own claims, with body and footer split for GitHub attribution.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Shipped several new skills.&lt;/strong&gt;&#xA;Slack and memory support landed with &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/slackx/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slackx&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sessions-memory/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sessions-memory&lt;/a&gt;, which turns archived sessions into PARA memory.&#xA;Team docs gained &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-team-api/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-team-api&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-team-charter/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-team-charter&lt;/a&gt;.&#xA;Codebase upkeep got &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/improve-codebase/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;improve-codebase&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/improve-skill/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;improve-skill&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-documentation/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-documentation&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-opinions/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-opinions&lt;/a&gt;.&#xA;Planning expanded with &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-goals/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-goals&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-service-levels/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-service-levels&lt;/a&gt; and their &lt;code&gt;review-*&lt;/code&gt; counterparts, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-mockups/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-mockups&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-placeholder-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-placeholder-issue&lt;/a&gt;.&#xA;Issue triage gained &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/check-issue-status/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;check-issue-status&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/check-issues-status/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;check-issues-status&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/check-linked-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;check-linked-pr&lt;/a&gt;.&#xA;Demo tooling arrived with &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/research-topic/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;research-topic&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/record-asciinema/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;record-asciinema&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/record-playwright/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;record-playwright&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tidied conventions.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;gh-cached&lt;/a&gt; was replaced by &lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; and removed, with every skill reference switched over.&#xA;The &lt;code&gt;dot-claude&lt;/code&gt; directory was renamed to &lt;code&gt;agents&lt;/code&gt;.&#xA;The AGENTS.md vocabulary now avoids &amp;ldquo;shape&amp;rdquo;, &amp;ldquo;honest&amp;rdquo;, and &amp;ldquo;load bearing&amp;rdquo;.&#xA;SDLC status pages went mobile-friendly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Experimenting with article-to-video.&lt;/strong&gt;&#xA;I started generating short videos from the articles I write, to post on YouTube and TikTok.&#xA;The pipeline combines text-to-speech narration with visuals that follow the article&amp;rsquo;s content.&#xA;The experiment is early, but it&amp;rsquo;s a plausible way to reach a wider audience with the ideas I&amp;rsquo;ve been working through.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Resolved from last month.&lt;/strong&gt;&#xA;Scheduled issue-to-PR automation (&lt;a href=&#34;https://github.com/tomzx/agents/issues/8&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;#8&lt;/a&gt;) and automatic context clearing between execution and review (&lt;a href=&#34;https://github.com/tomzx/agents/issues/9&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;#9&lt;/a&gt;) both landed through llm-augmented-workflows.&#xA;The automation was generalized beyond OpenChamber, and the context clearing came free because each phase runs in its own session.&#xA;Skill usage tracking (&lt;a href=&#34;https://github.com/tomzx/agents/issues/7&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;#7&lt;/a&gt;) is handled after I extended &lt;a href=&#34;https://github.com/kenn-io/agentsview&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agentsview&lt;/a&gt; to collect skill-usage statistics from its SQLite database.&#xA;Because the data is queryable, an agent can search session logs for skill calls and extract which skill ran, and the same approach works across every harness agentsview supports.&#xA;Reliable bug reproduction comments (&lt;a href=&#34;https://github.com/tomzx/agents/issues/10&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;#10&lt;/a&gt;) are handled by llm-augmented-workflows, which can enforce an expected outcome and, when the agent doesn&amp;rsquo;t deliver it, resume the last session and ask again.&#xA;The llm-augmented-workflows flexibility rework is done.&#xA;I&amp;rsquo;ve also fully switched to opencode, though support for other harnesses isn&amp;rsquo;t there yet.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Partial progress.&lt;/strong&gt;&#xA;The SDLC status report got significant improvements, but a status script in &lt;a href=&#34;https://github.com/TomzxCode/sdlc&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;TomzxCode/sdlc&lt;/a&gt; now duplicates the report and drifts out of sync with the agents-repo skill.&#xA;Loops only run at the start and end of day, week, and month so far.&#xA;The easiest remaining task I have not picked up is auto-running &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/validate-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;validate-pr&lt;/a&gt;, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/verify-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;verify-pr&lt;/a&gt;, and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-pr&lt;/a&gt; on PRs waiting on me.&#xA;And validation of other people&amp;rsquo;s changes is now covered by validate-pr and verify-pr, but for my own changes I still default to manual testing instead of delegating to an agent.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Currently Need&#xA;    &lt;div id=&#34;what-i-currently-need&#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-i-currently-need&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Five needs from earlier months are still open.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/6&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Memory that agents manage automatically&lt;/a&gt;, which I keep delaying for reasons I can&amp;rsquo;t identify.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;a href=&#34;https://github.com/tomzx/agents/issues/5&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;accuracy pass on daily summaries&lt;/a&gt;, where nothing has moved.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/4&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Contextual Slack support&lt;/a&gt;, which still has no workflow.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/14&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Automated triage follow-up conversations&lt;/a&gt;, untouched because I rarely use that skill.&lt;/li&gt;&#xA;&lt;li&gt;Routines and event-driven triggering, still unstarted.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Clarity on verdict propagation.&lt;/strong&gt;&#xA;I need to confirm how a verdict (approve, reject, needs-changes) made at one stage propagates to downstream stages.&#xA;Until I can trust that the right decision always carries forward, I can&amp;rsquo;t confidently run the autonomous path without a human checking each handoff.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A full pass on flow definitions.&lt;/strong&gt;&#xA;The flow definitions still have issues I haven&amp;rsquo;t fully mapped.&#xA;I need a round of end-to-end testing to find where the definitions diverge from intended behavior, so the defects get fixed rather than worked around.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A faster path to implementation.&lt;/strong&gt;&#xA;For feature work, I need to figure out which SDLC steps can be safely skipped or compressed to reach implementation faster.&#xA;The full chain is thorough but slow, and it&amp;rsquo;s still unclear which steps are essential and which are ceremonial.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;State tracking for an orchestrator-only llm-augmented-workflows.&lt;/strong&gt;&#xA;Resolving the context-clearing need surfaced a bigger question: the engine could run as its own orchestrator instead of always depending on a GitHub issue.&#xA;The blocker is that without an issue to hold state, the engine needs another way to track where a run is, and I haven&amp;rsquo;t decided what that state store should be.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A set of PDLC skills, mirroring the SDLC ones.&lt;/strong&gt;&#xA;At work I&amp;rsquo;m spending a meaningful share of my time on product management work, and I want the same repeatability there that the SDLC skills give to engineering.&#xA;I need a structured set of product development lifecycle skills for discovery, framing, prioritization, and measurement, so the product side gets done properly and the same way every time rather than ad hoc.&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;https://tomrochette.com/what-ive-built-and-what-i-need/2026-06/&#34; &gt;What I&amp;rsquo;ve built and what I need: June 2026&lt;/a&gt; - the previous entry in this series; July builds directly on its open needs.&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 broader vision of automating a GitHub project end to end with LLMs that llm-augmented-workflows is now realizing.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; - the scheduling layer that runs skills unattended, which underpins daily runs like resolve-pr-conflicts.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - why isolating context between phases matters, the problem the per-session design solves.&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://github.com/TomzxCode/llm-augmented-workflows&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-augmented-workflows&lt;/a&gt; - the engine driving the issue-to-PR pipeline described throughout.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents&lt;/a&gt; - the skill library where the SDLC refactor, validation rework, and new skills landed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/kenn-io/agentsview&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agentsview&lt;/a&gt; - the session archive extended to track skill usage across harnesses.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/sdlc&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;TomzxCode/sdlc&lt;/a&gt; - the static SDLC status pages, whose report script now overlaps the agents-repo skill.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/github-board&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;github-board&lt;/a&gt; - the frontend-only issue and PR board view shipped this month.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; - the GitHub CLI that replaced gh-cached across the skill library.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Cost of Work You Did Not Choose</title>
      <link>https://tomrochette.com/the-cost-of-work-you-did-not-choose/</link>
      <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-cost-of-work-you-did-not-choose/</guid>
      <category>software-engineering</category><category>team-management</category><category>productivity</category><category>motivation</category><category>communication</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A colleague handed me a task last week.&#xA;The job was to take their work, get it running, and get it merged.&#xA;I did not volunteer for it, and nobody asked whether I wanted it.&#xA;It took me almost three days.&lt;/p&gt;&#xA;&lt;p&gt;I want to be careful here, because the easy reading of this story is a complaint about a colleague, and that is not the interesting part.&#xA;The interesting part is why a piece of work that should have taken hours took days instead, and what that delay says about how work gets assigned.&#xA;&lt;strong&gt;Work you did not choose takes longer, not because it is harder, but because nothing motivates you to finish it.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Task Was Not Hard. The Task Was Not Mine.&#xA;    &lt;div id=&#34;the-task-was-not-hard-the-task-was-not-mine&#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-task-was-not-hard-the-task-was-not-mine&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The work itself was not especially complex.&#xA;What made it slow was that I had no reason to care about it.&#xA;I had not chosen the problem, I had not designed the solution, and I had nothing to gain from its completion except the relief of being done with it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;There is a motivation tax on work you did not choose, and it is larger than most people account for.&lt;/strong&gt;&#xA;When a task is yours, the friction of a confusing codebase or a failing test is something you want to work through.&#xA;When a task has been given to you, that same friction is an obstacle between you and being somewhere else, and every obstacle feels harder to get past.&lt;/p&gt;&#xA;&lt;p&gt;The three days were not a measure of the task&amp;rsquo;s difficulty.&#xA;They were a measure of how little reason I had to care.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Finishing Someone Else&amp;rsquo;s Work Is Not Half the Job&#xA;    &lt;div id=&#34;finishing-someone-elses-work-is-not-half-the-job&#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;#finishing-someone-elses-work-is-not-half-the-job&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a common assumption that handing off nearly-finished work is cheap, because the hard part is done.&#xA;This is almost always wrong.&#xA;Code that someone else wrote carries their hidden decisions: names that made sense to them, assumptions they never wrote down, edge cases they handled in their head and nowhere else.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;To get another person&amp;rsquo;s work to a mergeable state, you have to reconstruct the intent of a person whose reasoning you never saw.&lt;/strong&gt;&#xA;You can only infer their intent from the commits.&#xA;And unlike your own code, where you remember why you wrote each line, here every unfamiliar line is a small investigation.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Get this merged&amp;rdquo; sounds like a small favor.&#xA;It is a request to absorb someone else&amp;rsquo;s unfinished thinking, under a deadline you did not set, for a result you will not own.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Distractions Stick When There Is No Pull&#xA;    &lt;div id=&#34;distractions-stick-when-there-is-no-pull&#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;#distractions-stick-when-there-is-no-pull&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I noticed something during those three days that I would have missed if I had been excited about the work.&#xA;Distractions did not just interrupt me.&#xA;They gave me relief.&lt;/p&gt;&#xA;&lt;p&gt;When you are working on something you care about, a notification is an annoyance you dismiss.&#xA;When you are working on something you resent, a notification is a reason to step away, and you take it every time.&#xA;The work expanded to fill three days in part because every ping, every message, every side question offered a more appealing place to put my attention, and nothing pulled me back.&lt;/p&gt;&#xA;&lt;p&gt;The same afternoon turns out two ways depending only on who chose the work:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Attention chart: chosen work holds a flat high line while assigned work decays in a sawtooth at every notification&#34;&#xA;    src=&#34;https://tomrochette.com/the-cost-of-work-you-did-not-choose/images/focus-decay.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;Distractions are not the enemy of focus.&#xA;&lt;strong&gt;They are the enemy of focus on work you do not want to do.&lt;/strong&gt;&#xA;On work you want to do, focus holds.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Failure Was the Hand-off&#xA;    &lt;div id=&#34;the-failure-was-the-hand-off&#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-failure-was-the-hand-off&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The colleague is not the villain of this story.&#xA;What failed was the assumption that a task could be moved from one person to another by declaration, without a conversation about whether it should be.&lt;/p&gt;&#xA;&lt;p&gt;When you assign work without asking, you are guessing that the person receiving it has the context, the capacity, and the motivation to carry it.&#xA;You have checked none of those things.&#xA;You have simply moved an item on a board and assumed the work would move with it.&lt;/p&gt;&#xA;&lt;p&gt;The cost of that guess does not show up on the board.&#xA;It shows up in the three days, in the half-attention, in the quiet resentment that makes the next hand-off harder to accept.&#xA;&lt;strong&gt;A task assigned without consent arrives already taxed, and the tax is paid in time.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Will Do Differently&#xA;    &lt;div id=&#34;what-i-will-do-differently&#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-i-will-do-differently&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I am not going to pretend the lesson is that I should have said no.&#xA;In a team, sometimes you absorb work that is not yours, and that is part of the job.&#xA;The lesson is narrower and more useful.&lt;/p&gt;&#xA;&lt;p&gt;When work arrives by declaration rather than by agreement, I will name the motivation cost out loud, early.&#xA;I will ask for the context I am missing instead of reconstructing it silently.&#xA;And I will be direct, with myself and with the person handing it off, about what &amp;ldquo;get this merged&amp;rdquo; actually entails, because the favor is rarely as small as it sounds from the side that is handing it off.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Work you did not choose takes longer, not because it is harder, but because nothing motivates you to finish it.&lt;/strong&gt;&#xA;The friction was not in the task.&#xA;It was in the absence of a reason to care.&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;https://tomrochette.com/task-overload/&#34; &gt;Task overload&lt;/a&gt; - the moment you have more on your plate than you can handle, and how to re-prioritize from scratch&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/task-stack/&#34; &gt;task-stack&lt;/a&gt; - a tool for managing the interruptions and context switches that compound when you have no intrinsic drive to push through&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Who Maintains the Slop?</title>
      <link>https://tomrochette.com/who-maintains-the-slop/</link>
      <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/who-maintains-the-slop/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>code-quality</category><category>team-management</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A coworker ships a feature this week.&#xA;The demo goes well, the metric moves, the credit lands on them.&#xA;Six months later the feature breaks, and the ticket is assigned to you.&#xA;You did not write it, you did not ask for it, and the person whose name is on the commits cannot explain it to you, because they did not write it either.&#xA;&lt;strong&gt;They prompted it, you inherit it, and that asymmetry is the whole problem.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The whole handoff runs like this:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;low&#34;&#xA;    alt=&#34;Ledger: generated code sends credit back to the generator and costs forward to a maintainer who never consented and pays the full cost of understanding&#34;&#xA;    src=&#34;https://tomrochette.com/who-maintains-the-slop/images/slop-ledger.svg&#34;&#xA;    &gt;&lt;/figure&gt;&#xA;&lt;p&gt;The slop handoff is not the ordinary handoff, where someone moves on and leaves their code behind.&#xA;It is a new and worse kind, because the thing being handed off carries less recoverable intent than human code ever did, and the person handing it off has less of that intent to offer than the author of human code ever had.&#xA;The slop producer walks away with the reward.&#xA;The maintainer is left with the cost, and no one asked whether they wanted to absorb it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Generation Is Cheap. Understanding Is Not.&#xA;    &lt;div id=&#34;generation-is-cheap-understanding-is-not&#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;#generation-is-cheap-understanding-is-not&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The economics of AI-assisted code are lopsided in a way most teams have not priced in.&#xA;Generating code is now nearly free, a prompt and a few seconds.&#xA;Maintaining code has gotten cheaper too, because you can now ask a model to explain the code to you, but it has not gotten cheaper by nearly as much.&#xA;Maintenance is dominated by understanding, and understanding, even with help, is still time-consuming in a way generation is not.&lt;/p&gt;&#xA;&lt;p&gt;When the cost of producing something collapses while the cost of owning it stays fixed, you get a predictable result.&#xA;People produce a great deal more of it than they are willing to maintain.&#xA;This is the same dynamic economists call a &lt;a href=&#34;https://en.wikipedia.org/wiki/Externality&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;negative externality&lt;/a&gt;: the producer captures the benefit and passes the cost to someone else who never agreed to pay it.&#xA;&lt;strong&gt;In software, the cost lands on the codebase, and the maintainers pay it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The old discipline that limited the cost-shifting was effort.&#xA;Writing a feature by hand cost days, and that cost forced a conversation about whether the feature was worth building and whether the author was ready to live with it.&#xA;Remove that cost and the conversation disappears, because the friction that produced the conversation is gone.&#xA;The feature still costs days to maintain.&#xA;It just costs someone else, later, in a currency the original author never had to spend.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Author Is No Longer the Cheapest Maintainer&#xA;    &lt;div id=&#34;the-author-is-no-longer-the-cheapest-maintainer&#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-author-is-no-longer-the-cheapest-maintainer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For a long time, software engineering ran on a principle that aligned incentive and responsibility cleanly.&#xA;Amazon stated it as &lt;a href=&#34;https://en.wikipedia.org/wiki/DevOps&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;you build it, you run it&lt;/a&gt;: the team that creates a service operates it, because they understand it best, and making them own the consequences makes them answerable for what they ship.&lt;/p&gt;&#xA;&lt;p&gt;That principle worked for a specific reason.&#xA;The person who wrote the code was also the cheapest person to maintain it, because the act of writing it left a durable model in their head.&#xA;&amp;ldquo;You build it, you run it&amp;rdquo; was efficient as well as just.&#xA;The accountability aligned with the economics.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI slop breaks that alignment.&lt;/strong&gt;&#xA;The person who generated the code did not build a model of it in their head, because they did not build it.&#xA;They saw the output, checked that it ran, verified that it did what they wanted, and moved on.&#xA;They are not the cheapest maintainer anymore.&#xA;Often nobody is.&#xA;The maintainer who inherits the code knows neither the original intent nor the code itself, and the author who might remember the intent has nothing to say about the implementation that would help.&lt;/p&gt;&#xA;&lt;p&gt;So the natural loop closes wrong.&#xA;Instead of the builder owning what they built, the code drifts to whoever is left, whoever is downstream, whoever still cares about the codebase staying healthy.&#xA;&lt;strong&gt;Maintenance becomes a tax on the people who care, levied by the people who do not.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Defining Feature of Slop Is Missing Intent&#xA;    &lt;div id=&#34;the-defining-feature-of-slop-is-missing-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;#the-defining-feature-of-slop-is-missing-intent&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It is worth being precise about what makes slop slop.&#xA;It is not only that the code is bad, because sometimes the code runs fine and passes its tests.&#xA;It is that the code carries no intent anyone can recover.&lt;/p&gt;&#xA;&lt;p&gt;Human code, even messy human code, is full of traces of the mind that wrote it.&#xA;Variable names that betray a mental model, comments that record a half-thought, a function split in a way that reflects how the author decomposed the problem.&#xA;These are imperfect signals, and they are often misleading, but they are signals.&#xA;When you inherit human code, you can work backward from it to the decisions the author made.&#xA;This is what &lt;a href=&#34;https://tomrochette.com/the-code-you-will-never-read/&#34; &gt;The Code You Will Never Read&lt;/a&gt; describes from the maintainer&amp;rsquo;s side: a growing body of code whose internals are opaque by construction.&lt;/p&gt;&#xA;&lt;p&gt;AI slop leaves no such decisions to reconstruct.&#xA;The patterns in it were not chosen by a mind that held the problem; they were chosen by a model selecting the most probable next token.&#xA;The names are plausible, the structure is conventional, and none of it is evidence of a decision you can reconstruct, because no decision was made in the way a human makes one.&#xA;&lt;strong&gt;You cannot ask the code what it meant, and increasingly you cannot ask the author either, because the author&amp;rsquo;s answer is the same guess you would make yourself.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Missing intent is what makes AI slop harder to maintain than the human mess it resembles.&#xA;The mess is not the hard part.&#xA;The hard part is that the mess came with nobody attached to it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Missing Ingredient Is Consent&#xA;    &lt;div id=&#34;the-missing-ingredient-is-consent&#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-missing-ingredient-is-consent&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The problem with the slop handoff is not only that the work is hard.&#xA;It is that the maintainer had no say in any of the decisions that produced it.&lt;/p&gt;&#xA;&lt;p&gt;They did not choose to build the feature.&#xA;They did not choose its scope, its boundaries, its dependencies, its tradeoffs.&#xA;They did not choose the abstractions it imposes on the codebase, or the patterns it will invite the next generator to copy.&#xA;All of those choices were made by a person and a model who will not be present when the consequences arrive, and they were made without the person who will carry the consequences in the room.&#xA;&lt;strong&gt;The maintainer inherits a set of decisions they were never party to, and is asked to own outcomes they could not influence.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The missing consent is the part that goes beyond &amp;ldquo;the task is annoying,&amp;rdquo; and it is why slop handoffs damage teams faster than ordinary ones.&#xA;I wrote about the motivation tax on unchosen work in &lt;a href=&#34;https://tomrochette.com/the-cost-of-work-you-did-not-choose/&#34; &gt;The Cost of Work You Did Not Choose&lt;/a&gt;.&#xA;The slop version of that tax is heavier, because the work is harder to understand and the handoff is more frequent.&#xA;When being handed other people&amp;rsquo;s AI output becomes the norm, the people who maintain the codebase start to feel that they are only there to clean up after others, in a system they did not design and are not allowed to redesign, and that feeling is a leading indicator of people leaving.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Generator Is Rational, Not Villainous&#xA;    &lt;div id=&#34;the-generator-is-rational-not-villainous&#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-generator-is-rational-not-villainous&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It is tempting to tell this story with a villain, the lazy coworker handing their slop to the team.&#xA;That story is satisfying and it is mostly wrong, and believing it will stop you from fixing the actual problem.&lt;/p&gt;&#xA;&lt;p&gt;The generator is responding rationally to the incentives the team has set.&#xA;The team rewards shipping.&#xA;It does not charge for maintenance.&#xA;It does not require ownership to persist after a feature lands.&#xA;It does not ask whether the maintainer consents to absorb the code before it merges.&#xA;Given those incentives, generating fast, shipping fast, and moving on is the behavior that gets rewarded, so it is the behavior that happens.&#xA;&lt;strong&gt;You do not fix an incentive problem by asking people to be better. You fix it by changing the prices.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The mistake is to moralize what is structural.&#xA;The slop producer is not failing at professionalism.&#xA;They are succeeding at exactly what the system measures, and the system measures velocity, not the maintenance debt that velocity leaves behind.&#xA;Until the system charges for that debt, the generator who slows down to own their output is not virtuous; they are slower than the colleague who does not, and they lose.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What to Do&#xA;    &lt;div id=&#34;what-to-do&#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&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fix is to move the price back to where the benefit was captured.&#xA;A few concrete moves, each of which closes a gap the current default leaves open.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make intent travel with the code.&lt;/strong&gt;&#xA;The maintainer should inherit a specification, acceptance criteria, and the decisions that matter, not just a diff.&#xA;When a feature lands, it lands with a written account of what it was for, what it was not for, and where the hard choices were made.&#xA;The code is downstream of the spec, as &lt;a href=&#34;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream, Fixes Must Flow Upstream&lt;/a&gt; argues, and the spec is the part that lets a future maintainer fix the source instead of patching the symptom.&#xA;If the generator cannot produce that account, that is the signal that the generator did not understand what they shipped, and the merge should wait until someone does.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make the generator sticky.&lt;/strong&gt;&#xA;The person who generates the code owns it for a window after it ships, the same way a human author would under &amp;ldquo;you build it, you run it&amp;rdquo;.&#xA;You prompt it, you run it.&#xA;Bugs in that module route back to the generator for a quarter, not to whoever happens to be nearby.&#xA;This restores the alignment that cheap generation removed: the person who captured the benefit now carries at least the first round of the cost, which is the cheapest place to charge it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Require the maintainer&amp;rsquo;s consent.&lt;/strong&gt;&#xA;No AI-generated change lands on a surface someone else owns without their sign-off.&#xA;This is the one that feels heavy and is the most important, because it is the only move that gives the maintainer a say in the decisions that will become their problem.&#xA;The owner of the affected code reviews the intent and the boundaries, not the diff.&#xA;If they would not have chosen to absorb the change, they should not be forced to, and forcing them is what produces the slop handoff in the first place.&#xA;This is the same intent-source question that decides who is qualified to act on a change in &lt;a href=&#34;https://tomrochette.com/who-resolves-the-merge-conflict/&#34; &gt;Who Resolves the Merge Conflict?&lt;/a&gt;: the person who can back the decision with intent they actually hold.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Price the handoff.&lt;/strong&gt;&#xA;If a slop producer does hand work to someone else, they owe that person context, tests, and time, not a working diff.&#xA;The handoff is not complete when the code runs.&#xA;It is complete when the receiver could explain the code to a third person without the original author in the room.&#xA;Charge the handoff in the currency the generator tried to skip, which is understanding, and watch how much less slop gets produced when understanding is the cost of walking away.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Gate generation on ownership.&lt;/strong&gt;&#xA;Before AI code can merge, there must be a named owner who will maintain it.&#xA;No owner, no merge.&#xA;This is a trivial rule and it eliminates the worst cases outright, the casual generation that lands in a shared module and becomes everyone&amp;rsquo;s problem and no one&amp;rsquo;s responsibility.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Failure Is Upstream&#xA;    &lt;div id=&#34;the-failure-is-upstream&#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-failure-is-upstream&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The pattern underneath all of this is the one &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; also arrives at from a different starting point: actual responsibility lives upstream, in the decisions that guided the work, not in the person left holding the diff at the end.&lt;/p&gt;&#xA;&lt;p&gt;The slop handoff is what happens when responsibility is allowed to drift downstream and settle on whoever is standing there when the code breaks.&#xA;The generator made the decision to generate.&#xA;The model made the decisions inside the code.&#xA;The maintainer made no decision at all, and gets to own every one of them.&lt;/p&gt;&#xA;&lt;p&gt;That is not a sustainable arrangement, and the people who notice it first are the maintainers, because they are the ones paying the tax.&#xA;They will not keep paying it quietly.&#xA;They will either push the price back upstream, where it belongs, or they will leave for a codebase where someone else has already done it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI did not invent the handoff.&lt;/strong&gt;&#xA;It made generation so cheap that handing the result off became the easiest option.&#xA;The slop producer is not a villain; they are a rational actor in a system that prices generation at zero and maintenance at full cost.&#xA;&lt;strong&gt;The fix is not to scold them.&lt;/strong&gt;&#xA;&lt;strong&gt;It is to put the price back where it was captured, in the currency that was skipped, which is understanding.&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;https://tomrochette.com/the-cost-of-work-you-did-not-choose/&#34; &gt;The Cost of Work You Did Not Choose&lt;/a&gt; - the motivation tax on work handed to you by declaration, which the slop handoff makes heavier and more frequent&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-code-you-will-never-read/&#34; &gt;The Code You Will Never Read&lt;/a&gt; - maintaining code whose internals are opaque, the condition that makes AI slop harder to inherit than the human mess it resembles&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream, Fixes Must Flow Upstream&lt;/a&gt; - the rule that the durable fix is upstream, which is why the spec must travel with the code so the maintainer inherits the source and not just the symptom&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the argument that actual responsibility lives in the decisions that guided the work, not in the person scanning the diff at the end&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-resolves-the-merge-conflict/&#34; &gt;Who Resolves the Merge Conflict?&lt;/a&gt; - the intent-source test for who is qualified to act on a change, which is the same test that decides who should own the slop&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://en.wikipedia.org/wiki/Slop_%28artificial_intelligence%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Slop (artificial intelligence)&amp;rdquo;&lt;/a&gt; - the term for low-effort, mass-produced AI content, extended here to code that ships without recoverable intent&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Externality&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Externality&amp;rdquo;&lt;/a&gt; - the economic frame for a cost imposed on a third party who did not consent, the model for slop as pollution of the codebase&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Tragedy_of_the_commons&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Tragedy of the commons&amp;rdquo;&lt;/a&gt; - why a shared resource degrades when individuals capture the benefit and socialize the cost, the codebase as commons&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Technical_debt&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Technical debt&amp;rdquo;&lt;/a&gt; - the accumulated maintenance cost deferred by fast generation, the debt the slop producer leaves behind&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/DevOps&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;DevOps&amp;rdquo;&lt;/a&gt; - the &amp;ldquo;you build it, you run it&amp;rdquo; principle that aligned authorship with ownership, which cheap generation unaligns&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Free_rider_problem&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Free rider problem&amp;rdquo;&lt;/a&gt; - the dynamic by which those who benefit without paying overwhelm those who carry the cost, the maintainer&amp;rsquo;s trap&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Principal%E2%80%93agent_problem&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Principal-agent problem&amp;rdquo;&lt;/a&gt; - the mismatch between the person deciding what gets built and the person bearing the consequences, the structure of the slop handoff&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Zero Touch Engineering</title>
      <link>https://tomrochette.com/zero-touch-engineering/</link>
      <pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/zero-touch-engineering/</guid>
      <category>llm</category><category>ai-agents</category><category>automation</category><category>software-engineering</category><category>zero-touch</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&amp;ldquo;Zero touch&amp;rdquo; has been a goal in software-adjacent fields for over a decade.&#xA;Networks provision themselves, deployments go out when the checks pass, and operations teams have been shrinking toward zero.&#xA;&lt;strong&gt;The one stage that resisted zero touch was the engineering itself: deciding what to build, writing it, and deciding it is good enough to ship.&lt;/strong&gt;&#xA;That is the part LLM agents are now closing.&lt;/p&gt;&#xA;&lt;p&gt;Zero Touch Engineering (ZTE): a change travels from an observed signal to a deployed fix with no human keystroke, no human review, and no human approval in the path.&#xA;Zero touch engineering has a clear lineage in networking and operations, and that lineage explains why software engineering was the last holdout and what it takes to close the gap.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where &amp;ldquo;zero touch&amp;rdquo; already lives&#xA;    &lt;div id=&#34;where-zero-touch-already-lives&#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;#where-zero-touch-already-lives&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The phrase comes from a precise field, and it is not software development.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Zero-touch provisioning (ZTP)&lt;/strong&gt; remotely configures network devices (switches, routers, access points) with no per-device manual setup, standardized by the IETF as Secure ZTP in &lt;a href=&#34;https://datatracker.ietf.org/doc/rfc8572/&#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=datatracker.ietf.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;RFC 8572&lt;/a&gt;.&#xA;Plug a device in and it fetches its configuration, authenticates, and joins the network on its own (&lt;a href=&#34;https://en.wikipedia.org/wiki/Zero-touch_provisioning&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Zero-touch provisioning&amp;rdquo;&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;The telecom world generalized the idea into &lt;a href=&#34;https://www.etsi.org/committee/zsm&#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=www.etsi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ETSI&amp;rsquo;s Zero-touch network and Service Management (ZSM)&lt;/a&gt;, a standards group formed in 2017 with the explicit goal of &amp;ldquo;100% automation&amp;rdquo; of operational processes, now actively working on closed-loop, AI-agent-driven architectures.&lt;/p&gt;&#xA;&lt;p&gt;Closer to software, two more ideas share the same theme.&#xA;&lt;a href=&#34;https://web.archive.org/web/20260418062521/https://www.techtarget.com/searchitoperations/definition/NoOps&#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=web.archive.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NoOps&lt;/a&gt;, coined by Forrester in 2011, is the vision that IT operations becomes so automated that developers never need to talk to an operations engineer again.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Continuous_deployment&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Continuous deployment&lt;/a&gt; removes the last human gate from delivery: every change that passes its checks goes to production, automatically.&lt;/p&gt;&#xA;&lt;p&gt;Notice what these four have in common.&#xA;Every one of them automates a stage that is deterministic.&#xA;Given a desired state and an event, the correct action is fully specified.&#xA;Provision this device.&#xA;Deploy this artifact.&#xA;Page this on-call.&#xA;There is no judgment left to encode, because the procedure was already mechanical and we just had humans performing it.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly why none of them applied to engineering.&#xA;&lt;strong&gt;Engineering is the stage that is not deterministic.&lt;/strong&gt;&#xA;Deciding what to work on, judging whether a change is worth shipping, choosing between two reasonable designs: these are judgments, not procedures.&#xA;You cannot automate a judgment you cannot first write down.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What &amp;ldquo;zero touch&amp;rdquo; actually requires&#xA;    &lt;div id=&#34;what-zero-touch-actually-requires&#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-zero-touch-actually-requires&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most discussion of AI in software focuses on the wrong stage.&#xA;It focuses on the agent writing code.&#xA;That is the easy part, and it was never the part that made a process touchless.&lt;/p&gt;&#xA;&lt;p&gt;A touchless process is a closed loop.&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart LR&#xA;    Observe --&amp;gt; Decide&#xA;    Decide --&amp;gt; Implement&#xA;    Implement --&amp;gt; Verify&#xA;    Verify --&amp;gt; Ship&#xA;    Ship --&amp;gt; Learn&#xA;    Learn --&amp;gt; Observe&lt;/pre&gt;&#xA;&lt;p&gt;Every stage must run without a human, and the output of the last stage must feed the first.&#xA;Continuous deployment automates Ship.&#xA;NoOps automates the runtime half of Observe and Learn.&#xA;ZTP automates a specific kind of Implement.&#xA;&lt;strong&gt;ZTE is what you call it when the entire loop closes, including Decide, the stage that requires judgment.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The agent writing the code is one sixth of the loop.&#xA;If you automate Implement and leave a human approving the result, you have an efficient assistant, not zero touch engineering.&#xA;The &amp;ldquo;zero touch&amp;rdquo; claim only becomes true when a bug report can become a production fix with no human at the gate, and when the system decides for itself that the fix is worth shipping.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why engineering was the holdout&#xA;    &lt;div id=&#34;why-engineering-was-the-holdout&#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;#why-engineering-was-the-holdout&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The reason ZTE lagged ZTP by a decade is not that writing code was hard.&#xA;Writing code was always the most automatable part of engineering, which is why templates, code generation, and scaffolding existed long before LLMs.&lt;/p&gt;&#xA;&lt;p&gt;The holdout was Decide.&lt;/p&gt;&#xA;&lt;p&gt;Deciding what to work on is a sequence of judgments: which problems are worth solving, which are urgent, which should be declined, which need an architectural change versus an incremental fix.&#xA;As I argued in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;, every time AI removes a constraint at one stage, the next constraint appears one level higher up the decision chain.&#xA;The constraint moved from producing code to verification.&#xA;The constraint moved from verification to deciding what to implement.&#xA;The constraint moved from deciding what to implement to deciding what to build.&lt;/p&gt;&#xA;&lt;p&gt;The bottleneck moved up until it reached the one thing that could not be mechanized: judgment about direction.&#xA;That judgment is the gate ZTE has to remove, and removing it is a different kind of change from removing a deploy button.&#xA;A deploy button is a procedure.&#xA;Direction is taste, context, and tradeoff.&lt;/p&gt;&#xA;&lt;p&gt;So ZTE is not a tool you install.&#xA;&lt;strong&gt;It is a measure of how much of your engineering judgment you have managed to make explicit.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;ZTE is proportional to encoded judgment&#xA;    &lt;div id=&#34;zte-is-proportional-to-encoded-judgment&#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;#zte-is-proportional-to-encoded-judgment&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The encoded-judgment measure gives a useful test for how close a team or project is to zero touch engineering.&#xA;&lt;strong&gt;Measure how much of the decision loop is encoded versus kept only in someone&amp;rsquo;s head.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The projects closest to ZTE encode five things: the same five I described in &lt;a href=&#34;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt;, because that article was about ZTE without using the word.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A machine-readable roadmap&lt;/strong&gt; that lets the system distinguish work that matters from work that does not.&#xA;Most triage decisions are not subtle architecture calls.&#xA;They are straightforward: this bug affects users, fix it; this request is out of scope, decline it; this dependency has a vulnerability, patch it.&#xA;If those decisions are written down, the system can make them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A verification pipeline&lt;/strong&gt; that replaces human review with multiple independent layers: tests, static analysis, property tests, mutation tests, scenario validation, adversarial probing.&#xA;Human review of agent-written code is the lowest-leverage activity in the loop, as I argued in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;.&#xA;You do not trust the code.&#xA;You trust the verification system.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A decision policy&lt;/strong&gt; that ranks competing work the way a competent maintainer would.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Guardrails&lt;/strong&gt; that bound the blast radius: budget limits, rollback on regression, escalation when a fix loop appears.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A learning loop&lt;/strong&gt; that turns every failed change into a future constraint.&lt;/p&gt;&#xA;&lt;p&gt;When all five are in place, the loop closes and the process is touchless.&#xA;When any one is missing, a human has to fill that gap.&#xA;&lt;strong&gt;The degree of zero touch is exactly the degree of encoded judgment, nothing more.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the human re-enters&#xA;    &lt;div id=&#34;where-the-human-re-enters&#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;#where-the-human-re-enters&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A fully closed loop still has one gap, and that gap is direction.&lt;/p&gt;&#xA;&lt;p&gt;A ZTE system that only reacts to observable signals will optimize for whatever those signals measure.&#xA;Bug reports as the only signal produce a system excellent at fixing bugs and terrible at anything else.&#xA;Feature requests as the only signal produce a system that accumulates features and loses coherence.&#xA;That drift is &lt;a href=&#34;https://en.wikipedia.org/wiki/Goodhart%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Goodhart&amp;rsquo;s law&lt;/a&gt; applied to engineering: when a signal becomes the target of an autonomous system, it stops being a good signal.&lt;/p&gt;&#xA;&lt;p&gt;The roadmap is what counteracts the drift, but the roadmap itself goes stale.&#xA;User needs shift; the ecosystem moves; a roadmap written in January can be wrong by July.&#xA;&lt;strong&gt;Updating the roadmap means making a judgment about what the project should become, and that judgment is the one thing current models can approximate but not fully replicate.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The pragmatic answer is not to solve the direction problem perfectly but to bound it.&#xA;Let the system make small direction adjustments based on observed signals.&#xA;Require large directional changes to pass through a human.&#xA;That split keeps the loop touchless for the vast majority of decisions while preserving human oversight for the small fraction that set long-term trajectory.&lt;/p&gt;&#xA;&lt;p&gt;The human in a ZTE system does not write code, review changes, or approve deploys.&#xA;The human authors the system that does all of those things, and intervenes only when the system&amp;rsquo;s judgment and the project&amp;rsquo;s direction diverge.&#xA;That is a different job from the one most engineers have today, but it is the job ZTE leaves behind.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The question&#xA;    &lt;div id=&#34;the-question&#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-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The networking world reached zero touch because the stages it automated were procedures.&#xA;ZTE is the claim that the remaining stages, the judgment stages, can be made procedural enough to automate too.&lt;/p&gt;&#xA;&lt;p&gt;That claim is only partly true.&#xA;You can encode most engineering judgment, enough to close the loop for routine work.&#xA;You cannot encode all of it, and the part you cannot encode is exactly the part that determines whether the project moves in a direction worth moving.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Zero touch engineering is not about removing humans from writing code.&#xA;It is about discovering, precisely, which of your judgments were ever more than procedure, and which were just procedure you had not bothered to write down yet.&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;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt; - the end-state ZTE describes, explored as a GitHub project running every maintainer function on an automated loop&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why the constraint climbs toward judgment as each lower stage is automated&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; - what changes when the entire workforce, not just the pipeline, is automated agents&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why human review is the gate ZTE has to remove, and how verification replaces it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt; - the verification-system-over-human-trust framing ZTE depends on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/llm-augmented-workflows/&#34; &gt;llm-augmented-workflows&lt;/a&gt; - a concrete engine for closing the observe-to-ship loop on GitHub&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://en.wikipedia.org/wiki/Zero-touch_provisioning&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Zero-touch provisioning&amp;rdquo;&lt;/a&gt; - the networking origin of &amp;ldquo;zero touch&amp;rdquo;, including ZTP and the ETSI ZSM lineage&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://datatracker.ietf.org/doc/rfc8572/&#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=datatracker.ietf.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;IETF RFC 8572, Secure Zero Touch Provisioning (SZTP)&lt;/a&gt; - the IETF standard showing &amp;ldquo;zero touch&amp;rdquo; as an established, standardized concept&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.etsi.org/committee/zsm&#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=www.etsi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ETSI, Zero-touch network and Service Management (ZSM)&lt;/a&gt; - the standards body owning &amp;ldquo;zero touch&amp;rdquo;, now working on closed-loop, agent-driven automation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.techtarget.com/searchitoperations/definition/NoOps&#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=www.techtarget.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;TechTarget, &amp;ldquo;NoOps&amp;rdquo;&lt;/a&gt; - the Forrester-coined vision of fully automated operations, the prior art ZTE extends from ops into engineering&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Continuous_deployment&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Continuous deployment&amp;rdquo;&lt;/a&gt; - the established zero-touch last mile of delivery that ZTE carries backward through review and authoring&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Autonomic_computing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Autonomic computing&amp;rdquo;&lt;/a&gt; - IBM&amp;rsquo;s self-managing systems vision, the intellectual ancestor of the closed-loop ZTE depends on&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Code You Will Never Read</title>
      <link>https://tomrochette.com/the-code-you-will-never-read/</link>
      <pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-code-you-will-never-read/</guid>
      <category>software-engineering</category><category>ai</category><category>llm</category><category>machine-learning</category><category>code-review</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;There is a kind of code growing around us, and growing fast.&#xA;Code that no human wrote, line by line.&#xA;Code that no human will read, line by line.&#xA;Code that no human will review, because the verification system passed and the change shipped on green.&#xA;If you are an engineer, this is supposed to make you uncomfortable.&#xA;But you can get past the discomfort, because we have gotten past it before, in several other fields, and their tricks transfer.&lt;/p&gt;&#xA;&lt;p&gt;Machine learning practitioners have been comfortable with opacity for a decade.&#xA;The trained neural network sitting behind your favorite model is, at the bottom, billions of floating-point numbers.&#xA;Nobody reads them.&#xA;Nobody can.&#xA;There is no &amp;ldquo;go to definition&amp;rdquo; for a weight.&#xA;You cannot trace a decision through the layers by opening the matrix in your editor and following the logic.&#xA;The entire artifact is illegible to a human by construction, and the field that built it accepted that a long time ago.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The code agents now produce is heading toward the same property, and the comfort ML people found is the comfort software engineers need to find next.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Model We Already Live With&#xA;    &lt;div id=&#34;the-model-we-already-live-with&#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-model-we-already-live-with&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;How did machine learning get comfortable with a thing nobody can read?&lt;/p&gt;&#xA;&lt;p&gt;Not by pretending to understand the internals.&#xA;&lt;strong&gt;By refusing to need them.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The model is a black box.&#xA;&lt;strong&gt;You understand it through what it does, never through what it is.&lt;/strong&gt;&#xA;You probe it with inputs and watch the outputs.&#xA;You assemble a test set that captures the behaviors you care about, the happy paths and the adversarial ones.&#xA;You measure accuracy, calibration, latency, and failure modes on the edge cases that would embarrass you in production.&#xA;You characterize the artifact from the outside, and you trust that characterization.&lt;/p&gt;&#xA;&lt;p&gt;Nobody on a model team ever says &amp;ldquo;let me read the weights to see if this is correct.&amp;rdquo;&#xA;That sentence is nonsense in that world.&#xA;It is becoming nonsense in ours, and the people who notice last will be the ones still trying to read code that no longer rewards reading.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Code Is Becoming That&#xA;    &lt;div id=&#34;code-is-becoming-that&#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;#code-is-becoming-that&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The parallel is not exact, but it is close, and it is closing.&lt;/p&gt;&#xA;&lt;p&gt;A neural network is opaque because its meaning is spread across billions of parameters, none of which means anything alone.&#xA;Agent-written code is opaque for a different reason and a more mundane one: there is simply too much of it, it was produced too fast, and no human has the hours to reconstruct what it does from the source.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The end state is the same from the operator&amp;rsquo;s point of view.&lt;/strong&gt;&#xA;You are handed an artifact that does something.&#xA;You cannot hold its behavior in your head by reading it.&#xA;You have to find out what it does the way you find out what a model does, by running it and watching.&lt;/p&gt;&#xA;&lt;p&gt;This is already the situation for the engineers defending codebases where agents produce faster than humans can read (&lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; describes that arithmetic).&#xA;It will be the situation for everyone soon enough.&#xA;The code you depend on, the code in your dependencies, the code that ships from the team across the hall, is increasingly code whose source you will never open, because opening it would tell you less than running it would.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Code Felt Different (And Why It Should Not)&#xA;    &lt;div id=&#34;why-code-felt-different-and-why-it-should-not&#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;#why-code-felt-different-and-why-it-should-not&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Source code used to be the thing that made software tractable.&#xA;That was the whole promise.&#xA;Unlike a compiled binary, unlike a trained network, you could open the file and follow the logic.&#xA;Reading was how you understood a system, how you debugged it, how you trusted it.&#xA;&lt;strong&gt;The fact that code was legible was the foundation engineers built their competence on.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Machine learning never had that foundation, so it never grieved losing it.&#xA;&lt;strong&gt;Software engineering did, and does, and that grief is most of what the discomfort is made of.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Strip the grief away and the practical question is simpler.&#xA;If you could not read the code anyway, would you rather have no code, or would you rather have code you can probe, test, measure, and roll back?&#xA;You would rather have the code, and you would build the same scaffolding around it that ML built around its weights.&#xA;The only thing standing between you and that scaffolding is the feeling that you ought to be able to read it, and that feeling is a habit, not a requirement.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Skills Transfer Directly&#xA;    &lt;div id=&#34;the-skills-transfer-directly&#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-skills-transfer-directly&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The practices machine learning developed for living with opacity are almost a one-to-one map onto opaque code.&#xA;You already know half of them, because software engineering reinvented them under different names.&lt;/p&gt;&#xA;&lt;p&gt;In ML, the test set captures the behaviors that matter.&#xA;In opaque code, that is the acceptance criteria written before implementation, plus a characterization suite that records what the code actually does across the inputs you care about (&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; is the full version of this system).&lt;/p&gt;&#xA;&lt;p&gt;In ML, probing with held-out and adversarial inputs is how you find where the model breaks.&#xA;In opaque code, that is property-based testing and fuzzing, generating inputs no human would think to write, exposing the edge cases reading would have missed anyway.&lt;/p&gt;&#xA;&lt;p&gt;In ML, you measure accuracy and failure rate on a benchmark, not intuition.&#xA;In opaque code, that is defect escape rate, rollback rate, time-to-detect, and change failure rate, measured per change, in production.&lt;/p&gt;&#xA;&lt;p&gt;In ML, adversarial examples are how you stress the model before it ships.&#xA;In opaque code, that is the adversarial pass: a separate agent whose only job is to break the change, with no incentive to approve (&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; covers the separation that keeps it sound).&lt;/p&gt;&#xA;&lt;p&gt;In ML, the &lt;a href=&#34;https://arxiv.org/abs/1810.03993&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;model card&lt;/a&gt; documents what the model is good at and where it fails.&#xA;In opaque code, that is the specification plus the issue, the artifact that tells you what the code was supposed to do, which matters far more than what any individual line does (&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Every tool you need to trust opaque code is a tool ML already built to trust opaque weights, renamed.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;It Is Not Just Machine Learning&#xA;    &lt;div id=&#34;it-is-not-just-machine-learning&#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;#it-is-not-just-machine-learning&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Machine learning is the most recent field to face this problem, not the only one.&#xA;Depending on an artifact you cannot fully read is an old situation, and the disciplines that met it first each invented a piece of the answer.&#xA;None of them solved it by making the artifact legible.&#xA;They solved it by changing how they interacted with it, and every one of those changes is a tool we can pick up for opaque code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Silicon.&lt;/strong&gt;&#xA;Once a chip is fabricated, you cannot read its logic from the silicon.&#xA;The hardware field answered with design for test: &lt;a href=&#34;https://en.wikipedia.org/wiki/Boundary_scan&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;boundary scan&lt;/a&gt;, built-in self-test, test vectors injected at the pins and observed at the outputs.&#xA;The lesson is structural, and it is the one our field is slowest to learn: testability has to be designed into the artifact before it exists, not bolted on after.&#xA;For code, that means the architecture carries probes, hooks, and test seams by default, so an implementation nobody reads can still be exercised by a system that does.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pharmacology.&lt;/strong&gt;&#xA;A drug interacts with a body no one fully models.&#xA;The field answered with phased clinical trials, a tiny reversible exposure first, then efficacy, then population scale, all run double-blind and followed by post-market surveillance.&#xA;The transferable pattern is staged rollout with independent evaluation and production watchfulness, which is exactly canary deployments, feature flags, a verifier separate from the author, and monitoring that treats production behavior as the actual verdict.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Behaviorism.&lt;/strong&gt;&#xA;Psychology met an opaque artifact earliest of all, the mind itself, and built a whole epistemology around it.&#xA;Stimulus and response, operational definitions, the refusal to introspect what could not be opened.&#xA;The stance is the one this article is arguing for: when you cannot inspect the internals, you understand the thing by characterizing what it does, and you stop treating that as a compromise and start treating it as the method.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cryptography.&lt;/strong&gt;&#xA;A cipher is trusted not by reading it but by trying to break it, and &lt;a href=&#34;https://en.wikipedia.org/wiki/Kerckhoffs%27s_principle&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Kerckhoffs&amp;rsquo;s principle&lt;/a&gt; says the system must stay safe even when its mechanism is fully public.&#xA;The lesson is an inversion that cuts against the instinct to trust illegible code by hoping someone read it: obscurity was never what made it safe, and dropping the reading does not drop the safety if the adversarial testing holds.&#xA;Trust comes from attack, not from inspection.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Optimizing compilers.&lt;/strong&gt;&#xA;The output of a modern optimizer is illegible to humans, and no one considers that a crisis.&#xA;Compilers are trusted through conformance suites and fuzzing, not by reading the assembly they emit.&#xA;Generated code is a new instance of a situation our own field has always been calm about, a transformation pipeline whose output you verify rather than read.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Legacy mainframes.&lt;/strong&gt;&#xA;Long before LLMs, our field operated systems no living person fully understood, COBOL cores kept alive by runbooks, golden-file tests, and behavior contracts.&#xA;The practitioners did not resign over the illegibility.&#xA;They built characterization tests that pinned observed behavior, and they ran the systems safely on those pins for decades.&#xA;That is the exact toolkit an opaque, agent-managed codebase needs.&lt;/p&gt;&#xA;&lt;p&gt;Each field contributed a distinct piece.&#xA;Hardware taught us to design testability in beforehand.&#xA;Pharmacology taught us staged exposure with independent oversight.&#xA;Behaviorism taught us the epistemology of characterization.&#xA;Cryptography taught us to trust by attack, not by inspection.&#xA;Compilers taught us that illegible output is normal and suite-verified.&#xA;Legacy systems taught us to operate on pinned behavior when comprehension is gone.&#xA;&lt;strong&gt;Stack those techniques and you have the full practice for a codebase no one reads: instrumented by design, rolled out in stages, characterized by behavior, stress-tested by adversaries, suite-verified, and pinned by contracts.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Stacked, the six lessons assemble into a single practice:&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;flowchart TD&#xA;    HW[Silicon designs testability in before the artifact exists] --&amp;gt; P[Practice for a codebase no one reads]&#xA;    PH[Pharmacology stages exposure with independent oversight] --&amp;gt; P&#xA;    BE[Behaviorism characterizes what a thing does instead of opening it] --&amp;gt; P&#xA;    CR[Cryptography trusts by attack rather than inspection] --&amp;gt; P&#xA;    CO[Compilers treat illegible output as normal and suite-verified] --&amp;gt; P&#xA;    LE[Legacy systems operate on pinned behavior when comprehension is gone] --&amp;gt; P&lt;/pre&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Understanding Means When You Cannot Read&#xA;    &lt;div id=&#34;what-understanding-means-when-you-cannot-read&#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-understanding-means-when-you-cannot-read&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Engineers are going to resist this shift, so it is worth being precise about what is lost and what is gained.&lt;/p&gt;&#xA;&lt;p&gt;Reading code gives you one kind of understanding, causal and local.&#xA;You trace a branch, follow a call, and build a mental model of why the code behaves the way it does on the inputs you happened to trace.&#xA;It is deep, but it is narrow.&#xA;It covers the paths you followed, and it depends on you being alert and unhurried while you followed them.&lt;/p&gt;&#xA;&lt;p&gt;Characterizing behavior gives you a different kind of understanding, statistical and global.&#xA;You cannot say why a specific input produces a specific output by tracing the logic.&#xA;But you can say, with evidence, how the system behaves across thousands of inputs, including the ones no human would have thought to trace.&lt;/p&gt;&#xA;&lt;p&gt;The first kind feels more satisfying because it produces a story.&#xA;The second kind is more reliable because it does not depend on which story you happened to follow on the day you read it.&lt;/p&gt;&#xA;&lt;p&gt;A reviewer who reads a diff understands a few paths well and the rest not at all.&#xA;A test suite that runs on every change understands every path it covers, every time, forever, without getting tired.&#xA;&lt;strong&gt;Reading gives you a vivid understanding of a tiny fraction of the behavior.&#xA;Probing gives you a coarse understanding of all of it, and for software that has to keep working when you are not looking, the second is the one that compounds.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Identity Problem&#xA;    &lt;div id=&#34;the-identity-problem&#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-identity-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the part nobody puts in the engineering blog posts.&lt;/p&gt;&#xA;&lt;p&gt;This shift is hardest for the people it should be easiest for.&#xA;The senior engineer, the staff engineer, the person whose entire professional identity is built on being able to open any file in the codebase and understand it, is the person being asked to surrender the exact skill that made them senior.&lt;/p&gt;&#xA;&lt;p&gt;That is a loss, and it is genuine, and pretending it is not is why so many of the arguments against unread code sound rational but run on fear.&#xA;It is not irrational fear.&#xA;If the thing you are best at is reading code, and reading code stops being the valuable thing, then you are being asked to become a beginner again, and beginners are slow and uncertain and uncomfortable.&lt;/p&gt;&#xA;&lt;p&gt;The way through it is the same way ML practitioners found.&#xA;You do not stop being valuable.&#xA;You move your value up a layer.&#xA;The ML engineer&amp;rsquo;s skill was never reading weights, it was designing the training, choosing the objective, building the evaluation that decided whether the model was good enough to ship.&#xA;The senior engineer&amp;rsquo;s skill, it turns out, was never really reading lines either.&#xA;It was knowing which behaviors matter, what the failure modes are, where the blast radius lives, and what &amp;ldquo;done&amp;rdquo; actually means for this system.&#xA;Those survive the loss of legibility intact, and they are exactly the skills the opaque-code world pays for.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;You are not losing your competence.&#xA;You are being asked to point it at the layer where it was always doing the most work.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How to Get Comfortable&#xA;    &lt;div id=&#34;how-to-get-comfortable&#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;#how-to-get-comfortable&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Comfort is not an attitude you adopt.&#xA;&lt;strong&gt;It is a confidence you earn by watching the safety net catch things.&lt;/strong&gt;&#xA;Each time a gate stops a bad change, each time a canary surfaces a regression a reader would have missed, each time a rollback undoes a problem in minutes, the illegible artifact gets a little less frightening, because the system around it is doing the job your eyes used to do.&lt;/p&gt;&#xA;&lt;p&gt;Start where the stakes are low.&#xA;Pick the changes you were never going to read carefully anyway, the small, reversible, low-blast-radius ones (&lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; is the uncomfortable proof that this is most of them).&#xA;Let those merge on green, with no human in the middle, and watch what happens.&#xA;&lt;strong&gt;If nothing breaks, your nervous system learns faster than your opinions do.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then build the probing muscles.&#xA;Write the behavioral tests before you let an agent write the code.&#xA;Add a fuzzer to the paths that carry genuine risk.&#xA;Put a blast-radius classifier on the gate, and reserve your attention for the small set of changes that actually deserve a human, the irreversible and the trust-boundary-crossing.&#xA;Measure the outcomes, and let the measurements argue for you when your instincts object.&lt;/p&gt;&#xA;&lt;p&gt;The end state is not that you stop caring about code.&#xA;It is that you stop needing to read it to trust it, the same way the ML engineer stopped needing to read weights to trust a model.&#xA;You develop a feel for the system the way they developed a feel for the model, by living with its behavior, watching it under load, and letting the evaluation be the authority instead of your eyes.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Disciplines That Already Did It&#xA;    &lt;div id=&#34;the-disciplines-that-already-did-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;#the-disciplines-that-already-did-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Machine learning is the closest mirror to what software is becoming, and it is worth noticing how comfortably it ended up.&lt;/p&gt;&#xA;&lt;p&gt;Nobody in ML talks about the illegibility of weights as a crisis.&#xA;They talk about evaluation, about distribution shift, about calibration, about the gap between benchmark and production.&#xA;The opacity is settled ground, the same way it is settled ground in chip design, in pharmacology, in every field that learned to trust an artifact it could not open.&#xA;The work happens entirely at the boundary, in the inputs you choose and the outputs you measure, because that is where understanding of an opaque artifact can live.&lt;/p&gt;&#xA;&lt;p&gt;Software engineering is arriving at the same place, later and more reluctantly, because it had something to lose that those fields never had.&#xA;The legibility of source code was a gift, and it was a gift that lasted a few decades, and it is ending, and the ending feels like a demotion when it is actually a relocation.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The code you will never read is coming regardless.&#xA;The only question is whether you learn to be comfortable with it the way half a dozen fields already are, by building the cage of tests and probes and staged rollouts and adversarial checks around it, or whether you keep insisting on reading until the volume of unread code makes the insistence irrelevant.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The first option is work.&#xA;The second option is a feeling that does not scale.&#xA;Pick the one that does.&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;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; - the diagnosis that most review already happens without reading, which is the proof that the comfort is mostly already earned.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the concrete system of tests, critics, and gates that replaces reading, and that maps almost one-to-one onto ML evaluation practices.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the case for moving human effort from the diff to the specification, which is the layer where understanding of opaque code actually lives.&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; - the arithmetic that makes unread code inevitable, and the strategy for defending a codebase against entropy produced faster than you can read.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - the root insight that a model cannot vouch for its own output, which is why the external evaluation (the ML equivalent of a test set) is the part that has to be trustworthy.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My AI Workflow: The Skills Are the Part That Compounds</title>
      <link>https://tomrochette.com/my-ai-workflow/</link>
      <pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/my-ai-workflow/</guid>
      <category>ai</category><category>llm</category><category>workflow</category><category>skills</category><category>opencode</category><category>openchamber</category><category>cursor</category><category>sdlc</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;When someone asks what my AI workflow is, the obvious answer is boring and the answer that matters is surprising.&#xA;I use a couple of coding tools and a couple of models, and none of them is the thing I would miss.&#xA;What I would miss is the body of skills I have been writing, collecting, and refining for the better part of a year.&lt;/p&gt;&#xA;&lt;p&gt;This article is a snapshot of my workflow as it stands today.&#xA;The tools come first because they are the visible part, but the main argument is that the tools are the part I expect to replace, and the skills are the part I expect to keep.&lt;/p&gt;&#xA;&lt;p&gt;I run two coding surfaces and two models, and neither is the interesting part of my setup.&#xA;At home I use &lt;a href=&#34;https://z.ai&#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=z.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GLM 5.2&lt;/a&gt; from z.ai, and at work I use &lt;a href=&#34;https://fireworks.ai/blog/glm-5p2-fast&#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=fireworks.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GLM 5.2 fast&lt;/a&gt; from &lt;a href=&#34;https://fireworks.ai&#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=fireworks.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fireworks&lt;/a&gt;.&#xA;For editing I use &lt;a href=&#34;https://www.cursor.com/&#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=www.cursor.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cursor&lt;/a&gt; at work and &lt;a href=&#34;https://code.visualstudio.com/&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;VS Code&lt;/a&gt; at home, and for anything agentic, multi-step, or long-running I use &lt;a href=&#34;https://github.com/btriapitsyn/openchamber&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber&lt;/a&gt;, which is built on &lt;a href=&#34;https://opencode.ai&#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=opencode.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenCode&lt;/a&gt;.&#xA;I never open OpenCode directly; OpenChamber is the surface, OpenCode is the engine underneath.&#xA;&lt;strong&gt;The part that actually determines the quality of my work is the library of skills I have been building and sharing in &lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzx/agents&lt;/a&gt;, and those skills run inside all four of those tools.&lt;/strong&gt;&#xA;Everything else is interchangeable.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The setup, in one paragraph&#xA;    &lt;div id=&#34;the-setup-in-one-paragraph&#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-setup-in-one-paragraph&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Cursor or VS Code is where I read, navigate, and do small edits.&#xA;The moment a task turns into a sequence of steps, create an issue, reproduce a bug, review a PR, open a PR, I move it to OpenChamber, because OpenChamber is where the work can run to a natural stopping point without me holding the state.&#xA;OpenChamber is built on OpenCode and is the control room on top of it: it gives me branchable sessions, worktree isolation, and a single surface to steer several sessions at once.&#xA;The skills are not tied to any of these surfaces; because they follow the open Agent Skills format, &lt;strong&gt;the same skill runs in Cursor, VS Code, OpenCode, or OpenChamber, so I pick the surface that fits the moment and the workflow does not change.&lt;/strong&gt;&#xA;At home the editor is VS Code and the model is GLM 5.2 on z.ai, at work the editor is Cursor and the model is GLM 5.2 fast on Fireworks, and I switch between them without changing anything else about the workflow.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The model and the shell are commodities&#xA;    &lt;div id=&#34;the-model-and-the-shell-are-commodities&#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-model-and-the-shell-are-commodities&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A year ago I would have had a strong opinion about which model to use.&#xA;Now the models are close enough that the choice is mostly about latency and price, which is why I let the environment pick: z.ai at home, Fireworks at work.&#xA;&lt;strong&gt;The model stopped being the lever once the models got good enough to follow a well-specified workflow reliably.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The same is true of the agent shell.&#xA;Cursor, VS Code, OpenCode, and Claude Code can all read a repository, edit files, and run commands, and because the skills follow an open format they run in any of them unchanged.&#xA;I use several of them because they are good at different things, but I do not expect any one of them to be the source of my advantage.&#xA;The shells will keep improving, the models will keep swapping in, and my workflow should not have to move when they do.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The skills are the workflow&#xA;    &lt;div id=&#34;the-skills-are-the-workflow&#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-skills-are-the-workflow&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Everything that matters lives in &lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzx/agents&lt;/a&gt;, a library of composable skills written in the open &lt;a href=&#34;https://agentskills.io&#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=agentskills.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Agent Skills&lt;/a&gt; format.&#xA;A skill is a self-contained &lt;code&gt;SKILL.md&lt;/code&gt; with step-by-step instructions for one repeatable task.&#xA;A compatible agent discovers skills by name, loads them on demand, and invokes them as slash commands like &lt;code&gt;/create-pr&lt;/code&gt;, &lt;code&gt;/review-pr&lt;/code&gt;, or &lt;code&gt;/end-day&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The backbone is the SDLC pipeline.&#xA;A high-level skill like &lt;code&gt;/sdlc&lt;/code&gt; orchestrates dozens of focused sub-skills into a full path from issue creation through requirements, specification, plan, implementation, tests, pull request, review, documentation, and learnings.&#xA;Each sub-skill is small enough to read in a minute and to improve independently.&#xA;&lt;strong&gt;When I improve the &lt;code&gt;review-pr&lt;/code&gt; skill, every flow that calls it gets the improvement, and I never have to re-explain that step to a session again.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The versioned skill is the difference between prompting and engineering a workflow.&#xA;A prompt is a one-off conversation.&#xA;A skill is the same conversation, written once, versioned, reviewed, and incrementally improved.&#xA;The agent performs it the same way every time, and the library gets better as the workflows mature.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the human time goes&#xA;    &lt;div id=&#34;where-the-human-time-goes&#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;#where-the-human-time-goes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The SDLC pipeline is long, but my time is not spread evenly across it.&#xA;Almost all of my attention goes to the top: needs, requirements, and specification.&#xA;The top of the pipeline is where defects fan out the widest and where fixes compound the longest, as &lt;a href=&#34;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream&lt;/a&gt; lays out, and it is where the work stays irreducibly human, deciding what to build and what &amp;ldquo;done&amp;rdquo; means.&#xA;A precise specification is the input every downstream skill consumes, and &lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; argues it is now the highest-leverage skill in the field.&lt;/p&gt;&#xA;&lt;p&gt;Everything below the specification, I automate as far as I can.&#xA;The plan, the implementation, the tests, the PR description, the review, the deployment, each is a skill the agent runs, and each is a place I would rather spend a token than an hour.&#xA;Once judgment is encoded into the layer every change passes through, fighting over each unit of output by hand stops paying for itself.&lt;/p&gt;&#xA;&lt;p&gt;The downstream hour that used to go into reading diffs goes somewhere else entirely: into building high-fidelity test environments that approximate the production environment as closely as I can get them.&#xA;&lt;strong&gt;I would rather spend an hour making the test environment catch the bug than an hour reading a diff hoping to catch it myself, because the test environment runs on every future change and the diff reading runs once.&lt;/strong&gt;&#xA;Spending the hour on the environment instead of the diff is the trade &lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; and &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; both argue: review is a one-time signal, verification against a production-like environment is a compounding one.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The encoding loop&#xA;    &lt;div id=&#34;the-encoding-loop&#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-encoding-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The hardest problem with any workflow is not doing it.&#xA;It is remembering to do it, every time, in the right order, without skipping the boring step.&lt;/p&gt;&#xA;&lt;p&gt;My rule is simple.&#xA;&lt;strong&gt;Every time I catch myself remembering to do something, that is a skill that should exist.&lt;/strong&gt;&#xA;The reminder to check for an existing PR before starting work, the instinct to link an issue to its plan, the habit of running the linter before committing, the reflex to write a learnings note after a painful bug, each of these behaviors was once tacit knowledge that lived in my head and showed up only when I was fresh.&#xA;Now each one is a skill, and the agent runs it whether I am fresh or not.&lt;/p&gt;&#xA;&lt;p&gt;The trigger is the remembering itself.&#xA;If I had to remember it, the agent should not have to.&#xA;Encoding it converts a forgettable step into a reliable one, and a reliable one into an improvable one, because once the step is written down I can see it, review it, and make it better instead of re-deriving it from memory every session.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What changes when the workflow is versioned&#xA;    &lt;div id=&#34;what-changes-when-the-workflow-is-versioned&#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-changes-when-the-workflow-is-versioned&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the workflow lives in a repository, three things become true at once.&lt;/p&gt;&#xA;&lt;p&gt;First, it is reliable.&#xA;The agent triages the issue, plans the work, reviews the PR, and closes the loop the same way today as it did yesterday, because the steps are written down and not reconstructed from guesswork.&lt;/p&gt;&#xA;&lt;p&gt;Second, it is improvable.&#xA;When a step is weak, I edit one file and every session that passes through it gets better.&#xA;The compounding is genuine in a way that prompting never compounds, because the improvement is captured instead of lost.&lt;/p&gt;&#xA;&lt;p&gt;Third, it is shareable.&#xA;The skills are public, so anyone on my team or on the internet can run the same workflow against their own repository.&#xA;&lt;strong&gt;The workflow became an artifact I can hand to someone else, which is the test for whether you actually have a workflow or just a habit.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I expect to keep&#xA;    &lt;div id=&#34;what-i-expect-to-keep&#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-i-expect-to-keep&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If you asked me which parts of this setup I will still be using in two years, the answer is easy.&#xA;Not Cursor, probably not OpenChamber in its current form, and almost certainly not GLM 5.2.&#xA;The models and the shells are moving targets, and betting on any specific one is a bet against the field.&lt;/p&gt;&#xA;&lt;p&gt;The skills are the part I expect to keep, but I do not expect to keep them as they are today.&#xA;They will evolve, and the more interesting bet is that they will shrink.&#xA;Every skill exists to encode a judgment the model cannot yet make reliably on its own: when to check for a duplicate PR, what a good acceptance criterion looks like, which steps belong in a retrospective.&#xA;As the models get smarter, often smarter than me at the specific subtask, those judgments stop being mine to encode and start being the model&amp;rsquo;s to make.&#xA;The skill for them becomes redundant and gets deleted.&lt;/p&gt;&#xA;&lt;p&gt;What persists is the slower-moving part: how I decide what is worth working on, how the phases of a feature connect, where the human checkpoint belongs.&#xA;The tactical skills will collapse into the model.&#xA;&lt;strong&gt;The skills are not a fixed asset I am accumulating; they are a temporary scaffold for the gap between what the model can do today and what it will do on its own tomorrow, and a good chunk of the work is knowing which scaffold to take down next.&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;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream&lt;/a&gt; - why the hour at the specification pays back more than the hour at any later stage&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the case for spending review time on a production-like test environment instead of a diff&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/llm-augmented-workflows/&#34; &gt;llm-augmented-workflows&lt;/a&gt; - the engine that runs these skills on GitHub events without a human in the loop&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 when every maintainer function is encoded as a loop&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 the layer everyone passes through is where you fight for consistency&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the supervision problem OpenChamber solves and skills externalize&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ai-tools-i-have-used/&#34; &gt;AI tools I have used&lt;/a&gt; - the running list of tools, kept up to date&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://mathieularose.com/my-ai-coding-workflow&#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=mathieularose.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mathieu Larose, &amp;ldquo;My AI Coding Workflow&amp;rdquo;&lt;/a&gt; - the article that prompted me to write this one&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzx/agents&lt;/a&gt; - the skills library that is the subject of this article, public and installable&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://agentskills.io&#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=agentskills.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Agent Skills format&lt;/a&gt; - the open skill format that makes the library portable across agents&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opencode.ai&#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=opencode.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenCode&lt;/a&gt; - the terminal coding agent the skills target&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/btriapitsyn/openchamber&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber&lt;/a&gt; - the OpenCode-native control room for parallel sessions&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cursor.com/&#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=www.cursor.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cursor&lt;/a&gt; - the editor I use at work for reading and small edits&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;VS Code&lt;/a&gt; - the editor I use at home for reading and small edits&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://z.ai&#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=z.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;z.ai&lt;/a&gt; - provider of GLM 5.2, my home model&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://fireworks.ai&#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=fireworks.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Fireworks&lt;/a&gt; - provider of GLM 5.2 fast, my work model&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Model Collapse: When Code Models Train on Their Own Output</title>
      <link>https://tomrochette.com/model-collapse-in-code/</link>
      <pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/model-collapse-in-code/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>code-quality</category><category>training-data</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Every code-generating LLM in production today was trained on code written by humans.&#xA;That fact is easy to forget, because the same models are now writing most of the code.&#xA;&lt;strong&gt;If humans stop reading, reviewing, and refining that code, the next generation of models will have to train on the output of the current generation, and the research on what happens then is not reassuring.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Models Were Trained on Human Code&#xA;    &lt;div id=&#34;models-were-trained-on-human-code&#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;#models-were-trained-on-human-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The large code models learned from enormous corpora of human-written code: public repositories, Stack Overflow answers, patches, and documentation.&#xA;None of that code was perfect.&#xA;Much of it was buggy, redundant, or obsolete.&#xA;But it carried something that model output cannot manufacture: the accumulated signal of millions of programmers solving actual problems under actual constraints, correcting each other in public, and converging over decades on patterns that actually work.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;That signal is the source of the model&amp;rsquo;s competence.&lt;/strong&gt;&#xA;When you prompt a model and it produces a working function, it is not reasoning from first principles.&#xA;It is predicting the next token from patterns absorbed out of human code, and those patterns were selected by reality, not by another model&amp;rsquo;s preferences.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Trend Is Pulling Humans Out of the Loop&#xA;    &lt;div id=&#34;the-trend-is-pulling-humans-out-of-the-loop&#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-trend-is-pulling-humans-out-of-the-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have spent the last year arguing that human code review should shrink, that we should verify code instead of reading it (&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt;), and that the specification, not the diff, is where human judgment belongs (&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;).&#xA;I still believe that position, at the level of a single team shipping a single product.&lt;/p&gt;&#xA;&lt;p&gt;But there is a consequence I have been slow to take seriously, because it does not show up in any one team&amp;rsquo;s metrics.&#xA;It shows up in the corpus.&#xA;As review becomes automated and engineers read less of what the model writes, the public record of code becomes a record of model output, lightly curated by machines.&#xA;&lt;strong&gt;The very thing the next models need to train on, human-written and human-corrected code, is becoming a smaller and smaller fraction of what exists.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Model Collapse Is&#xA;    &lt;div id=&#34;what-model-collapse-is&#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-model-collapse-is&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This feedback loop has a name.&#xA;Researchers call it model collapse, and the clearest statement of it is Shumailov et al.&amp;rsquo;s 2024 paper, &lt;a href=&#34;https://www.nature.com/articles/s41586-024-07566-y&#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=www.nature.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;AI models collapse when trained on recursively generated data&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The finding is stark.&#xA;When you train a model on data produced by another model, and then train the next model on the first model&amp;rsquo;s output, and repeat, the model degrades.&#xA;It does not degrade in an obvious way.&#xA;It loses information about the tails of the distribution first, the rare cases, the minority examples, the edge behavior, while its performance on the average case can look fine for a surprisingly long time.&#xA;&lt;strong&gt;Model collapse is hard to notice precisely because the headline metrics keep going up while the long tail quietly disappears.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The mechanism is statistical, not mysterious.&#xA;A model that fits another model&amp;rsquo;s output is fitting a smoothed, averaged version of reality.&#xA;Each generation of training removes a little more of the variety, the weird inputs, the unusual-but-correct solutions, until what remains is a narrow, over-represented center.&lt;/p&gt;&#xA;&lt;p&gt;The preprint that introduced the term, &lt;a href=&#34;https://arxiv.org/abs/2310.07450&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;The Curse of Recursion&amp;rdquo;&lt;/a&gt;, works through the mathematics, and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Model_collapse&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia article on model collapse&lt;/a&gt; lays out the two stages, early and late, and the open disagreement among researchers about how severe the impact will be in practice.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Code Is Especially Exposed&#xA;    &lt;div id=&#34;why-code-is-especially-exposed&#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;#why-code-is-especially-exposed&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;General model collapse is a concern for text and images.&#xA;Code is a sharper case, for three reasons that compound.&lt;/p&gt;&#xA;&lt;p&gt;First, the useful part of code lives in the tails.&#xA;The happy path is easy.&#xA;The value is in error handling, concurrency, boundary conditions, security, the obscure API, and the input that should never arrive but does.&#xA;These are exactly the minority examples that collapse erodes first.&#xA;&lt;strong&gt;A model that handles the common case and breaks on the edge case is the literal definition of early model collapse, and it is also the definition of code that passes review and fails in production.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Second, code that looks correct is easy to generate and hard to filter out.&#xA;A plausible-looking function that contains a subtle bug is not obviously wrong the way a garbled sentence is.&#xA;If nobody reads it, and the tests do not cover the edge case, it merges into the corpus and becomes training data for the next model, carrying its bug forward as if it were a pattern worth repeating.&lt;/p&gt;&#xA;&lt;p&gt;Third, the volume is exploding.&#xA;When a model can draft a feature in minutes, the amount of model-written code committed every day is growing faster than anyone&amp;rsquo;s ability to curate it.&#xA;Public repositories are filling with generated code, and that code is the raw material for the next training run.&#xA;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Dead_Internet_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;dead internet theory&lt;/a&gt;, originally a half-joke about the web filling with bots, is becoming literal for code.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Might Happen Next&#xA;    &lt;div id=&#34;what-might-happen-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-might-happen-next&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;No one knows exactly how the loop plays out, because it has not completed a full generation at scale yet.&#xA;But a few hypotheses are worth stating plainly, because they are testable and they point at where to look.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The quality plateau&#xA;    &lt;div id=&#34;the-quality-plateau&#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-quality-plateau&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Models keep improving on benchmarks for a while, then flatten.&#xA;The plateau will not look like running out of compute.&#xA;It will look like running out of signal.&#xA;&lt;strong&gt;The bottleneck moves from the size of the model to the quality of the data, and the data has stopped improving because it is no longer being written by anyone who understands it.&lt;/strong&gt;&#xA;The quality plateau follows the same pattern I described in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;: each constraint you remove reveals the next one, one level up.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The long-tail erosion&#xA;    &lt;div id=&#34;the-long-tail-erosion&#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-long-tail-erosion&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;While the common case improves, the edge cases get quietly worse.&#xA;Security vulnerabilities, race conditions, and incorrect handling of unusual inputs become more frequent, not less, because the training distribution has thinned exactly where those lessons were learned.&#xA;Benchmarks that measure average correctness will miss the long-tail erosion.&#xA;Benchmarks that measure adversarial or edge-case correctness will catch it, and they will be the ones to watch.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The grounding premium&#xA;    &lt;div id=&#34;the-grounding-premium&#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-grounding-premium&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Code with verifiable grounding becomes valuable.&#xA;What matters is not who typed it but whether it was selected by reality: it ran in production, it passed tests against inputs no one hand-picked, it survived actual failures and was corrected by them.&#xA;A human-written snippet that never ran carries no signal a model could not invent.&#xA;A model-generated snippet that ran under actual load and survived carries signal that no amount of recursive training can synthesize.&#xA;Labels like &amp;ldquo;ran in production without rollback&amp;rdquo; or &amp;ldquo;verified against a fuzz corpus&amp;rdquo; start to mean something, the way &amp;ldquo;organic&amp;rdquo; became a label worth paying for in food.&#xA;Grounding begins to matter as much as data volume, and the organizations that can prove their code carried an actual outcome get better models.&#xA;&lt;strong&gt;Eventually the most valuable training corpus is the one you can prove was selected by reality, not merely produced by a model.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The verification-as-data loop&#xA;    &lt;div id=&#34;the-verification-as-data-loop&#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-verification-as-data-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The only new ground-truth signal that does not depend on model output is execution.&#xA;The most valuable training data stops being code at all, and becomes (specification, implementation, test result) triples, where the test result is measured by reality, not inferred by another model.&#xA;Reinforcement learning from execution, where the reward comes from actually running the code, replaces scraping repositories as the dominant way to improve code models.&#xA;A model is, at inference time, a function of its context, as I argued in &lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt;; at training time it is a function of its corpus, and the corpus is the part that is degrading.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The split&#xA;    &lt;div id=&#34;the-split&#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-split&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A gap opens between organizations that keep humans in the loop and those that do not.&#xA;The fully automated shops gain short-term velocity but slowly poison their own tooling, because their internal corpus drifts toward generic code that resembles model output.&#xA;The shops that keep humans reading, correcting, and rewriting code retain a source of fresh signal, and their models, or at least their use of models, stays sharper over time.&#xA;&lt;strong&gt;The competitive advantage shifts from speed to the quality of the signal you feed back into the system&lt;/strong&gt;, which is the same conclusion the foundation argument reaches in &lt;a href=&#34;https://tomrochette.com/the-foundation-predicts-the-house-of-cards/&#34; &gt;The Foundation Predicts the House of Cards&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Case That Code Improves Instead&#xA;    &lt;div id=&#34;the-case-that-code-improves-instead&#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-case-that-code-improves-instead&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Everything above assumes the only training signal is &amp;ldquo;imitate the previous generation.&amp;rdquo;&#xA;For text and images that assumption is roughly correct, which is why model collapse is a genuine worry there.&#xA;Code is different in one decisive respect: it has an oracle.&lt;/p&gt;&#xA;&lt;p&gt;Code runs.&#xA;It passes tests or fails them, type-checks or does not, compiles or crashes, and a fuzzer can generate inputs no human would think to test.&#xA;That execution result is a ground-truth signal that does not come from any model, and it is the one thing the self-consumption loop cannot synthesize.&#xA;&lt;strong&gt;Where collapse assumes the model learns only from its own output, execution lets it learn from reality, and reality does not degrade between generations.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Execution changes the arithmetic in several ways, all of them favoring improvement.&lt;/p&gt;&#xA;&lt;p&gt;First, reinforcement learning from execution replaces imitation as the main source of improvement.&#xA;The training unit stops being &amp;ldquo;a file someone committed&amp;rdquo; and becomes a (specification, implementation, test result) triple, where the reward is measured by running the code.&#xA;A model rewarded for passing tests it has never seen is being pushed toward correct behavior, not toward the average of prior outputs, and that pressure does not loop back on itself.&lt;/p&gt;&#xA;&lt;p&gt;Second, selection effects raise the quality of the surviving corpus rather than pull it toward the mean.&#xA;When generation is best-of-N, or when an adversarial verifier tries to break each candidate, the code that survives into the corpus is the code that passed actual checks.&#xA;A repository built from verified survivors can be cleaner than the human corpus ever was, because GitHub and Stack Overflow were always full of bugs that nobody ran.&#xA;Filtering prevents unfiltered collapse, and code is the one modality where filtering is automatic.&lt;/p&gt;&#xA;&lt;p&gt;Third, the long tail can get better represented, not worse.&#xA;Humans are lazy about edge cases.&#xA;Fuzzers, property-based tests, and generated edge-case suites are not.&#xA;If the training signal includes execution across millions of rare inputs, the model sees more of the tail than human-written code ever covered, and the long-tail erosion hypothesis inverts into long-tail reinforcement.&lt;/p&gt;&#xA;&lt;p&gt;So the optimistic thesis is precise: &lt;strong&gt;code is the modality least susceptible to model collapse, because it alone carries an objective, automatic, infinite ground truth.&lt;/strong&gt;&#xA;The thing that makes code hard, that it has to actually work, is also the thing that protects it.&lt;/p&gt;&#xA;&lt;p&gt;The limitation is that the oracle only checks what you ask it to check.&#xA;A passing test suite proves the code does what the tests cover, not that the tests cover what matters.&#xA;Let the same model write the tests and the code, or let the test suite stay shallow, and execution stops being an oracle and becomes a formality.&#xA;&lt;strong&gt;The virtuous loop holds only while the verification is sound, separate from generation, and broader than the happy path.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Breaks the Loop&#xA;    &lt;div id=&#34;what-breaks-the-loop&#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-breaks-the-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Even the imitation-only loop has a way out, if real data keeps accumulating.&#xA;Gerstgrasser et al. showed in &lt;a href=&#34;https://arxiv.org/abs/2404.01413&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;Is Model Collapse Inevitable?&amp;rdquo;&lt;/a&gt; that collapse is avoided when synthetic data accumulates alongside real data instead of replacing it.&#xA;Their result is the weaker version of the optimistic case: as long as we keep adding fresh human code to the corpus, the model does not have to train only on its own output.&lt;/p&gt;&#xA;&lt;p&gt;The limitation is the word &amp;ldquo;fresh.&amp;rdquo;&#xA;The mitigation only works if human code keeps flowing into the training set in meaningful quantities.&#xA;&lt;strong&gt;And that is exactly the input the current trend is diminishing.&lt;/strong&gt;&#xA;Every hour engineers spend prompting instead of writing, every diff that ships unread, every answer on Stack Overflow that goes unposted because a model answered it privately, shrinks the supply of new human signal.&lt;/p&gt;&#xA;&lt;p&gt;So the practical question is not whether model collapse is possible.&#xA;The research says it is.&#xA;The question is whether we keep enough humans writing, reading, and correcting code, in public, to keep the real data flowing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Verdict Hinges on the Oracle&#xA;    &lt;div id=&#34;the-verdict-hinges-on-the-oracle&#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-verdict-hinges-on-the-oracle&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have argued, and still believe, that a single team should not force a human to read every diff if its verification system is strong enough.&#xA;What I no longer believe is that leaving humans out of the loop is automatically a tragedy of the commons.&#xA;It is a tragedy only if the only signal the field feeds back into its models is imitation of prior output.&#xA;&lt;strong&gt;Execution is a second signal, and for code it is the stronger one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The two futures run on the same variable: the soundness of verification.&lt;/strong&gt;&#xA;If verification stays grounded in actual execution, adversarial, and separate from generation, the loop improves on its own, and humans reading code matters less every year.&#xA;If verification is captured, shallow, or graded by the same model that wrote the code, the loop degrades, and no amount of human reading at the end will save it.&lt;/p&gt;&#xA;&lt;p&gt;So the instruction is narrower than &amp;ldquo;keep humans writing code in public.&amp;rdquo;&#xA;&lt;strong&gt;It is: keep the oracle trustworthy.&lt;/strong&gt;&#xA;Run the tests, fuzz the inputs, separate the verifier from the author, and treat every passing suite as a claim about coverage rather than proof of correctness.&#xA;Do that, and generated code can keep getting better long after humans stop writing most of it.&#xA;Fail to do it, and the degradation arrives as predicted.&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;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the local practice this article complicates: stop reading diffs, start verifying them, and the global cost that practice imposes when everyone adopts it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the case for moving human effort from the diff to the spec, which is correct per-team and worth re-examining at the corpus level&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - the inference-time version of the same claim: a frozen model reflects its context, just as a trained model reflects its corpus&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why removing the production constraint relocates it, which predicts the data-quality plateau&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-foundation-predicts-the-house-of-cards/&#34; &gt;The Foundation Predicts the House of Cards&lt;/a&gt; - why codebase health outranks tooling, and why the teams that keep human signal win over time&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://www.nature.com/articles/s41586-024-07566-y&#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=www.nature.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Shumailov et al., &amp;ldquo;AI models collapse when trained on recursively generated data&amp;rdquo; (Nature, 2024)&lt;/a&gt; - the definitive empirical demonstration that training on model output degrades models across generations&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2310.07450&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Shumailov et al., &amp;ldquo;The Curse of Recursion: Training on Generated Data Makes Models Forget&amp;rdquo;&lt;/a&gt; - the preprint that introduced model collapse and its mathematical treatment&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2404.01413&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gerstgrasser et al., &amp;ldquo;Is Model Collapse Inevitable? Breaking the Curse of Recursion by Accumulating Real and Synthetic Data&amp;rdquo;&lt;/a&gt; - the counterpoint showing collapse is avoided when real data accumulates alongside synthetic data&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Model_collapse&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Model collapse&amp;rdquo;&lt;/a&gt; - overview of the two stages of collapse and the disagreement over the practical impact&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Dead_Internet_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Dead Internet theory&amp;rdquo;&lt;/a&gt; - the analogy for code repositories filling with generated content&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Rolling Out the Unread Review</title>
      <link>https://tomrochette.com/rolling-out-the-unread-review/</link>
      <pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/rolling-out-the-unread-review/</guid>
      <category>software-engineering</category><category>code-review</category><category>pull-request</category><category>automation</category><category>teams</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The &lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;case for review without reading&lt;/a&gt;, and the &lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;system that makes it safe&lt;/a&gt;, can both be sound and still fail to ship.&#xA;I am writing about the part that decides whether any of that work succeeds: your team.&lt;/p&gt;&#xA;&lt;p&gt;You can be right about review, right about the system that replaces review, and still lose, because you shipped the rollout as a decree instead of as a sequence.&#xA;The rollout has its own logic, and it is not the logic of the technical argument.&#xA;&lt;strong&gt;A system people do not trust is a system that does not run, regardless of how well it verifies.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Treat The Resistance As Information&#xA;    &lt;div id=&#34;treat-the-resistance-as-information&#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;#treat-the-resistance-as-information&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The easy story is that skeptics are afraid of change, and that once they see the numbers they will change their minds.&#xA;That story is mostly wrong, and believing it will cost you the rollout.&lt;/p&gt;&#xA;&lt;p&gt;The people who push back hardest on automated review are often your most careful engineers.&#xA;They have seen the bugs a tired reviewer caught by instinct.&#xA;They have been the person blamed when something slipped through.&#xA;&lt;strong&gt;Their objections are not noise to filter; they show where your system is weakest.&lt;/strong&gt;&#xA;Calling their discomfort &amp;ldquo;fear&amp;rdquo; loses the argument before it starts, because they can tell you are not listening.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Three Concerns, Three Answers&#xA;    &lt;div id=&#34;three-concerns-three-answers&#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;#three-concerns-three-answers&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Behind &amp;ldquo;I do not trust the bot&amp;rdquo; are usually three distinct concerns, and each needs a different answer.&lt;/p&gt;&#xA;&lt;p&gt;The safety concern: automated review will let bad code through.&#xA;You answer the safety concern with measurement, defect escape rate compared between the automated lane and the human lane.&lt;/p&gt;&#xA;&lt;p&gt;The accountability concern: when something breaks, there is no one to point at.&#xA;You answer the accountability concern with ownership that lives upstream, in the specification and in the people who own the rules.&lt;/p&gt;&#xA;&lt;p&gt;The learning concern is the one nobody says out loud.&#xA;Review is how juniors grow and how the team stays connected to its own codebase.&#xA;&lt;strong&gt;This loss is genuine, and it is the concern that will cause the rollout to fail if you ignore it, because no defect metric addresses it.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Sequence The Exposure&#xA;    &lt;div id=&#34;sequence-the-exposure&#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;#sequence-the-exposure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You cannot go from &amp;ldquo;a human reads every diff&amp;rdquo; to &amp;ldquo;no human reads any diff&amp;rdquo; in one step.&#xA;Decompose the automation into three things people react to very differently.&lt;/p&gt;&#xA;&lt;p&gt;A bot that comments is basically a linter, and almost no one objects.&#xA;A bot that blocks is accepted once the rules are legible and owned.&#xA;A bot that approves is the change people resist most.&lt;/p&gt;&#xA;&lt;p&gt;Ship them in that order, weeks apart, on a low-blast-radius lane first: documentation, tests, internal-only changes inside a single module.&#xA;By the time you reach the approving bot, the team has weeks of evidence that the earlier layers work.&#xA;&lt;strong&gt;You are extending trust that has been earned, not demanding it up front.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Make Every Decision Legible&#xA;    &lt;div id=&#34;make-every-decision-legible&#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;#make-every-decision-legible&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;People resist what they cannot inspect.&lt;/strong&gt;&#xA;Every automated action must state which rule fired, what it checked (the file and line, the threshold, a link to the rule definition), and who owns that rule.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Complexity 18 over 15 in auth.py:42, rule COMPLEXITY_LIMIT, owner Priya&amp;rdquo; is something a skeptic can argue with.&#xA;&amp;ldquo;Bot approved&amp;rdquo; is something a skeptic can only rage at.&#xA;The first turns a black box into a reviewable system.&#xA;The second turns your careful engineers into enemies.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Promote Humans To The Rules&#xA;    &lt;div id=&#34;promote-humans-to-the-rules&#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;#promote-humans-to-the-rules&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This is the move that wins senior engineers over instead of displacing them.&#xA;They stop reviewing code and start reviewing the gates: the security critic&amp;rsquo;s checklist, the complexity thresholds, the blast-radius classifier.&lt;/p&gt;&#xA;&lt;p&gt;Their judgment now scales to every change instead of being spent once on a single pull request.&#xA;A senior who owns the duplication rule has more leverage than a senior who reads ten diffs a day and remembers three.&#xA;&lt;strong&gt;You are not removing them from the loop; you are promoting them to a loop where their work compounds.&lt;/strong&gt;&#xA;Give your skeptics the highest-leverage role in the new system, and most of them stop being skeptics.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Let Shadow Mode Persuade&#xA;    &lt;div id=&#34;let-shadow-mode-persuade&#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;#let-shadow-mode-persuade&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The strongest argument is not yours; it is the comparison the team runs itself.&#xA;Let a team keep their human review while the automated lane runs silently beside it, recording what it would have caught and what it would have flagged wrongly.&lt;/p&gt;&#xA;&lt;p&gt;After a few weeks you have the only case that is convincing: &amp;ldquo;your reviewers missed these defects the gate caught; the gate&amp;rsquo;s false positives were these, and they are fixed.&amp;rdquo;&#xA;Run it on a low-risk slice so the stakes match the trust level.&#xA;And let the skeptics be the ones who present the results.&#xA;&lt;strong&gt;Nothing converts a skeptic faster than being the person who found the data.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Measure What They Actually Care About&#xA;    &lt;div id=&#34;measure-what-they-actually-care-about&#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-what-they-actually-care-about&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;They are concerned about defects escaping, so measure defects escaping.&#xA;Track defect escape rate, rollback rate, time-to-detect, and change failure rate, and compare the automated lane to the human lane on the same slice.&lt;/p&gt;&#xA;&lt;p&gt;If the gate wins, the argument ends, and it ends in numbers rather than opinion.&#xA;If the gate loses, you have a concrete gap to close, and you have earned the credibility to say so out loud.&#xA;&lt;strong&gt;Never defend the system with &amp;ldquo;a human looked at it&amp;rdquo;; defend it with production outcomes.&lt;/strong&gt;&#xA;A human looking at it was always a proxy for those outcomes, and a weak one.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Keep The Escape Hatch, And Say So&#xA;    &lt;div id=&#34;keep-the-escape-hatch-and-say-so&#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;#keep-the-escape-hatch-and-say-so&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Irreversible changes, trust-boundary changes, public API changes, and changes to the gating system itself still get a deliberate human read.&lt;/p&gt;&#xA;&lt;p&gt;The message is never &amp;ldquo;you are out entirely.&amp;rdquo;&#xA;It is &lt;strong&gt;&amp;ldquo;you are in where you add value, and out where you do not.&amp;rdquo;&lt;/strong&gt;&#xA;That framing is far easier to accept than abolition, because it is not abolition.&#xA;You are reserving humans for the small, identifiable minority of changes where a careful read is still the best tool we have, and the rest of the pipeline moves at the speed the machines can sustain.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Rebuild The Learning Channel&#xA;    &lt;div id=&#34;rebuild-the-learning-channel&#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;#rebuild-the-learning-channel&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The learning concern from earlier does not go away once the rollout succeeds.&#xA;That loss is a genuine cost, and pretending otherwise breaks trust.&lt;/p&gt;&#xA;&lt;p&gt;Replace the channel deliberately.&#xA;Pair juniors with seniors on specifications, because that is where the judgment now lives.&#xA;Rotate rule-owner duty, so learning to curate a check is itself the apprenticeship.&#xA;Hold code-archaeology sessions that read well-chosen diffs as learning material, not as a gate.&#xA;&lt;strong&gt;Move the learning off the critical path without deleting it, and name the loss plainly so people know you took it seriously.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The First Escape Is The Moment That Matters&#xA;    &lt;div id=&#34;the-first-escape-is-the-moment-that-matters&#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-first-escape-is-the-moment-that-matters&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When, not if, the gate lets something through, the instinct of the holdouts will be to say &amp;ldquo;see.&amp;rdquo;&#xA;That is the moment the rollout is won or lost.&lt;/p&gt;&#xA;&lt;p&gt;Run a blameless postmortem, find the gap, and add a rule.&#xA;Then say the thing human review can never say: this exact defect class can never recur, because it is now checked on every change, for as long as the rule exists.&lt;/p&gt;&#xA;&lt;p&gt;That guarantee is what removes resistance on its own schedule.&#xA;The system gets strictly better over time; human review resets every morning.&#xA;Each incident encoded into a rule is a permanent gain.&#xA;&lt;strong&gt;Show people that compounding curve, and most of the holdouts change their minds, not because you argued them down, but because the system stopped being the thing they distrusted.&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;p&gt;Start with the commenting bot on a low-blast-radius lane, and add the blocking bot and then the approving bot weeks apart.&#xA;Run shadow mode beside the human lane, and let the skeptics be the ones who present the comparison.&#xA;From the first automated action, publish the rule, the threshold, the owner, and the numbers: defect escape rate, rollback rate, time-to-detect, change failure rate.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Keep the escape hatch explicit, and rebuild the learning channel deliberately.&lt;/strong&gt;&#xA;Reserve deliberate human reads for the changes with genuine blast radius.&#xA;Pair juniors with seniors on specifications, and rotate rule-owner duty, so the apprenticeship continues off the critical path.&lt;/p&gt;&#xA;&lt;p&gt;When the gate lets its first defect through, run a blameless postmortem and encode the fix as a rule.&#xA;That rule is the permanent gain the rollout was for: checked on every change, for as long as the rule exists, while human review resets every morning.&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;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; - the diagnosis this series starts from: review already does not involve reading.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the technical system this article is about rolling out.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - the principle behind the escape hatch: humans where they add value, by blast radius.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the upstream case that reading LLM-written code is the wrong tool.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Verifying Code Without Reading It</title>
      <link>https://tomrochette.com/verifying-code-without-reading-it/</link>
      <pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/verifying-code-without-reading-it/</guid>
      <category>software-engineering</category><category>code-review</category><category>pull-request</category><category>testing</category><category>llm</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;It is a familiar observation by now that most code review happens without anyone reading the code (&lt;a href=&#34;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;the case is made in You Already Review Code Without Reading It&lt;/a&gt;).&#xA;That observation raises a question.&#xA;If no human reads the diff, how do you still get correctness, maintainability, extensibility, and the rest of the things review was supposed to deliver?&lt;/p&gt;&#xA;&lt;p&gt;The short answer is that you stop trying to read, and start trying to verify.&#xA;Reading is one tool doing many jobs poorly.&#xA;Verification is many tools, each doing one job well.&#xA;&lt;strong&gt;Done right, the unread change is checked more thoroughly than the read one ever was.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Decompose What &amp;ldquo;Reading&amp;rdquo; Was Checking&#xA;    &lt;div id=&#34;decompose-what-reading-was-checking&#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;#decompose-what-reading-was-checking&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When a reviewer reads code, they are not doing one thing.&#xA;They are running a dozen checks in their head at once, and doing each of them inconsistently.&#xA;Make those checks explicit, and you can see that they are separate.&lt;/p&gt;&#xA;&lt;p&gt;Correctness: does the code do what the task actually asked for?&#xA;Tested: are the behaviors that matter covered by tests that would fail if the code were wrong?&#xA;Maintainable: is the complexity bounded, the duplication low, the naming consistent, the dead code absent?&#xA;Extensible: can the next change plug in without a rewrite, or has this change coupled two things that should stay independent?&#xA;Secure: does it cross a trust boundary, leak a secret, or open an injection path?&#xA;Reversible: if this change is wrong, can we undo it in minutes, or does it mutate data we cannot get back?&lt;/p&gt;&#xA;&lt;p&gt;A tired reviewer scans for all of these at once and catches each of them sometimes.&#xA;&lt;strong&gt;The approach is to give each property its own check, run on every change, without getting tired.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Match Each Property To Its Best Checker&#xA;    &lt;div id=&#34;match-each-property-to-its-best-checker&#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;#match-each-property-to-its-best-checker&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every property above has a checker that is cheaper and more reliable than a human reading a diff.&lt;/p&gt;&#xA;&lt;p&gt;Correctness is checked by tests, and by an LLM judge that compares the diff against the acceptance criteria from the issue and asks: is there a case where the criteria hold but this code fails?&#xA;Tested is checked by coverage gates and by &lt;a href=&#34;https://en.wikipedia.org/wiki/Mutation_testing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mutation testing&lt;/a&gt;, which mutates the code and fails the build if the tests still pass, because that means the tests were not testing anything.&#xA;Maintainable is checked by complexity limits, duplication detectors, dead-code scans, and linters, all deterministic, all running every push.&#xA;Extensible is checked by dependency-direction rules, boundary tests, and an LLM critic that asks where the next feature would plug in and whether this change has made that harder.&#xA;Secure is checked by static analysis, secret scanning, and an adversarial LLM pass that tries to find the input the author did not think of.&#xA;Reversible is checked by a blast-radius classifier: did this touch the schema, the public API, an external commitment, or a trust boundary?&lt;/p&gt;&#xA;&lt;p&gt;None of these requires a human to read the code.&#xA;&lt;strong&gt;Together they cover everything a reader was supposed to cover, and they cover it on every change, not on the changes a reviewer happened to be alert for.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The LLM As Critic, Not Reader&#xA;    &lt;div id=&#34;the-llm-as-critic-not-reader&#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-llm-as-critic-not-reader&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The LLM&amp;rsquo;s role in this system is not to read the code for you.&#xA;A summary of the diff is not reading, however it is presented.&#xA;The LLM&amp;rsquo;s role is to act as a critic against a single, stated property.&lt;/p&gt;&#xA;&lt;p&gt;Give it the diff, the specification, and one question.&#xA;Does this change introduce a coupling that violates the intended dependency direction?&#xA;Is there an input that bypasses the authorization check the spec requires?&#xA;Does this function do something the acceptance criteria never asked for?&#xA;One question per critic, phrased so the answer is either a concrete failing case or a pass.&lt;/p&gt;&#xA;&lt;p&gt;This is verification, not reading.&#xA;It is adversarial by construction: the critic is rewarded for finding a problem, not for approving.&#xA;And because each critic has one job, you can run many in parallel, each a different prompt, each looking for a different class of failure.&#xA;&lt;strong&gt;A human reader tries to notice everything and notices some of it.&#xA;A battery of critics tries to notice one thing each and notices it every time.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Verification Is Not Validation&#xA;    &lt;div id=&#34;verification-is-not-validation&#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;#verification-is-not-validation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a distinction worth keeping, because the system fails if you confuse the two.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Verification_and_validation&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Verification&lt;/a&gt; asks: did we build the thing right, does the code meet its specification?&#xA;Validation asks: did we build the right thing, does the specification solve the actual problem?&lt;/p&gt;&#xA;&lt;p&gt;Reading a diff does verification badly and validation not at all.&#xA;No amount of staring at code tells you whether the feature should exist.&#xA;That judgment has to be made somewhere, and the productive place for it is upstream, in the specification, and downstream, in production.&lt;/p&gt;&#xA;&lt;p&gt;So split the work.&#xA;Put verification in the automated gates, where machines check the code against a precise spec on every change.&#xA;Put validation upstream, where humans decide which problems are worth solving and write the acceptance criteria that encode that judgment.&#xA;Put a third layer of validation downstream, in canaries, monitoring, and fast rollback, where production behavior is the ground truth no diff review can match.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The human does not read the code.&#xA;The human writes what the code must satisfy, and then watches what the code does in production.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Circularity Trap&#xA;    &lt;div id=&#34;the-circularity-trap&#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-circularity-trap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is one failure mode that will quietly ruin this system if you let it go unchecked.&#xA;Do not let the same model, or the same prompt, both write the code and approve it.&lt;/p&gt;&#xA;&lt;p&gt;When the same model acts as both author and verifier, the verifier inherits the author&amp;rsquo;s blind spots.&#xA;A model that wrote a subtle bug will, asked to review its own work, tend to confirm that the work is fine.&#xA;This is not malice; it is the same statistical process producing both answers.&lt;/p&gt;&#xA;&lt;p&gt;The defense is structural.&#xA;Use a different model for verification than for generation, or at minimum a different agent with a different prompt and different access to the specification.&#xA;Write the verification criteria before the code exists, so they describe the intended behavior rather than rationalizing whatever was built.&#xA;And run an adversarial pass whose only goal is to break the change, with no incentive to approve.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Separation of concerns is not a nicety here; it is the whole reason the system can be trusted.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What The Human Does Instead&#xA;    &lt;div id=&#34;what-the-human-does-instead&#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-the-human-does-instead&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If the human is not reading diffs, what are they doing?&lt;/p&gt;&#xA;&lt;p&gt;They write the specification and its acceptance criteria, because that is where validation belongs and where the LLM&amp;rsquo;s verification is anchored.&#xA;They review the rules the gates enforce, not the code the gates pass, because a bad rule approved once produces bad approvals forever, while a bad line of code is caught by a good rule.&#xA;They respond to gate failures, which is where their judgment adds value, instead of using it on changes that passed cleanly.&#xA;And they read code only on the small, flagged minority of changes that carry significant blast radius, where a deliberate read is still the best tool we have.&lt;/p&gt;&#xA;&lt;p&gt;The new division of labor is more work at the top of the pipeline and less at the bottom, which is the right inversion.&#xA;&lt;strong&gt;You are trading a low-leverage activity that scaled poorly (reading every diff) for a high-leverage one that compounds (writing the rules and specs that check every diff).&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How You Know It Is Working&#xA;    &lt;div id=&#34;how-you-know-it-is-working&#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;#how-you-know-it-is-working&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The objection that will come is simple: how do you know the unread code is good enough?&lt;/p&gt;&#xA;&lt;p&gt;You do not answer it by pointing at how much code you read.&#xA;You answer it by measuring the outcomes reading was supposed to produce.&lt;/p&gt;&#xA;&lt;p&gt;Track defect escape rate, the bugs that reach production per change.&#xA;Track rollback rate, how often a merged change has to be undone.&#xA;Track time-to-detect, how quickly a regression surfaces after it lands.&#xA;Track change failure rate, the fraction of deployments that cause an outage.&lt;/p&gt;&#xA;&lt;p&gt;Run the new system on a slice of changes and compare these numbers to your old, human-read pipeline.&#xA;If the gates have a lower defect escape rate and a faster cycle time than your reviewers did, the unread code is provably better than the read code was.&#xA;If they do not, you have a concrete gap to close, by tightening a rule or adding a critic, not by urging reviewers to read harder.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The standard is not &amp;ldquo;a human looked at it.&amp;rdquo;&#xA;The standard is &amp;ldquo;the code behaves well in production, measurably, on every change.&amp;rdquo;&lt;/strong&gt;&#xA;A human looking at it was always a proxy for that standard, and a weak one.&#xA;Replace the proxy with the measurement it represented.&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;https://tomrochette.com/code-review-without-reading-the-code/&#34; &gt;You Already Review Code Without Reading It&lt;/a&gt; - the diagnosis this article answers: review already does not involve reading, so build the system that makes that safe.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rolling-out-the-unread-review/&#34; &gt;Rolling Out the Unread Review&lt;/a&gt; - the team-side companion to this system: how to ship it to people who do not trust it yet.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why reading LLM-written code is the wrong tool, and where human effort belongs instead.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - which changes still deserve a human, selected by blast radius rather than by the existence of a pull request.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>You Already Review Code Without Reading It</title>
      <link>https://tomrochette.com/code-review-without-reading-the-code/</link>
      <pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/code-review-without-reading-the-code/</guid>
      <category>software-engineering</category><category>code-review</category><category>pull-request</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&lt;strong&gt;Most code review does not involve reading code.&lt;/strong&gt;&#xA;The decision to approve is made before the diff opens.&#xA;We keep the practice, and quietly drop the part that is supposed to justify it.&lt;/p&gt;&#xA;&lt;p&gt;The same gap between claim and verification exists on the author&amp;rsquo;s side of the pull request.&#xA;An LLM cannot vouch for its own output, because accepting a solution as done needs information the model does not have (&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt;).&#xA;The reviewer has the same problem in reverse: vouching for code that was never read.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Mean By Reading&#xA;    &lt;div id=&#34;what-i-mean-by-reading&#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-i-mean-by-reading&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a difference between opening a pull request and reading one.&#xA;Reading means reconstructing what the code does, tracing each branch, checking every assumption against the rest of the system, and forming an independent opinion about whether it is correct.&#xA;That takes time, sustained focus, and more attention than a fifteen-item review queue allows.&lt;/p&gt;&#xA;&lt;p&gt;Opening is something else.&#xA;You open the PR, you notice the file list, the green check from CI, the test count, and the description the author wrote, and within a few seconds you form a feeling: this is fine, or this is not.&#xA;The code itself comes after all of that.&#xA;&lt;strong&gt;Most of the time, you never reach it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is not a failure of discipline.&#xA;It is how the tool presents work to you, and how a busy engineer responds to that presentation.&#xA;The diff is the last tab you look at, and often the one you look at least.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Signals That Actually Decide Approval&#xA;    &lt;div id=&#34;the-signals-that-actually-decide-approval&#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-signals-that-actually-decide-approval&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If you watch what an approver actually responds to, the code is rarely the first thing.&lt;/p&gt;&#xA;&lt;p&gt;CI passed.&#xA;That matters more than any line you might have read.&#xA;The tests are green, the build is green, the linter is quiet, and those signals have already provided the safety before you started.&lt;/p&gt;&#xA;&lt;p&gt;Then the author.&#xA;A pull request from someone you trust gets less scrutiny than one from a new hire.&#xA;You will deny this in a meeting and do it anyway in practice.&#xA;Trust is a signal, and a useful one, but it is not &amp;ldquo;reading the code&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Then the size of the change.&#xA;A two-line diff to a README merges in seconds.&#xA;A four-hundred-line refactor to the auth module stalls.&#xA;You are reacting to blast radius, not to semantics, and you are right to, but again, that is not reading.&lt;/p&gt;&#xA;&lt;p&gt;Then the description and the linked issue.&#xA;These tell you what the author intended.&#xA;For a lot of pull requests, the intent is all you ever verify, because the code is too long to verify against it in the time you have.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The code is the excuse.&#xA;The signals are the decision.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why We Pretend To Read&#xA;    &lt;div id=&#34;why-we-pretend-to-read&#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;#why-we-pretend-to-read&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If the code is not really what we are checking, why the process around it?&lt;/p&gt;&#xA;&lt;p&gt;Because reading code is the thing code review is supposed to be for.&#xA;Admit that you are not doing it, and you admit that the central activity of the gate is not happening.&#xA;That is an uncomfortable admission, so it does not get made.&#xA;Instead we keep the form, the comments, the approving review, and let the substance go unchecked.&lt;/p&gt;&#xA;&lt;p&gt;There is also a blame function.&#xA;When something breaks, we want to point at a name on the pull request and say &amp;ldquo;they signed off&amp;rdquo;.&#xA;The signature has to mean &amp;ldquo;I read this and vouched for it&amp;rdquo;, or it cannot carry that blame.&#xA;So we maintain the fiction that the signature means what it says, even though everyone, on both sides, knows it often does not.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is a performance of accountability: the approve click certifies that a person was present, but rarely certifies that the code was read.&lt;/strong&gt;&#xA;The signature allocates blame after the fact.&#xA;It does not prevent harm before it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Self-Test&#xA;    &lt;div id=&#34;the-self-test&#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-self-test&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is a test you can run on yourself.&#xA;Approve your next five pull requests the way you normally would.&#xA;The next day, try to recall a single line of code from each one.&lt;/p&gt;&#xA;&lt;p&gt;If you cannot, be precise about what that means.&#xA;It means you approved metadata.&#xA;You were responding to CI, to the author, to the description, to the size of the diff, to your sense of the person.&#xA;Those are signals, and some of them are good signals.&#xA;But none of them are &amp;ldquo;I read this code and understood it&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Run the same test on your team.&#xA;Ask a recent approver to explain, from memory, one function that changed in the pull request they approved.&#xA;&lt;strong&gt;The silence you get back is the most truthful data you will collect about how code review actually works in your organization.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I am not mocking reviewers here.&#xA;I have failed this test more often than I have passed it.&#xA;The point is that the gap between what review is supposed to be and what it is, is large, and we never measure it because measuring it would force a conclusion we have already decided not to reach.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Two Paths&#xA;    &lt;div id=&#34;two-paths&#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;#two-paths&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once you accept that most review does not involve reading, you have two defensible directions, and only two.&lt;/p&gt;&#xA;&lt;p&gt;The first is to actually read the code, on the changes that warrant it.&#xA;Not every change.&#xA;The ones with large blast radius: irreversible changes, trust-boundary changes, changes to the gating system itself.&#xA;On those, slow down, read deliberately, trace the logic, and form an independent opinion.&#xA;This is high-leverage work, and it is rare, and it deserves the time it takes.&lt;/p&gt;&#xA;&lt;p&gt;The second is to drop the pretense, and let the changes you were never going to read merge on the strength of the signals you were actually using.&#xA;Green CI, a passing test suite, a trusted author, a small reversible diff.&#xA;These already decided the outcome.&#xA;Let them decide it without a human in the middle adding latency and taking credit.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;What is not defensible is the current default.&lt;/strong&gt;&#xA;The default is the second path, with the performance of the first added on top.&#xA;You approve without reading, but you still require a human to approve without reading, and you call the combination a quality gate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When The Code Was Written By A Machine&#xA;    &lt;div id=&#34;when-the-code-was-written-by-a-machine&#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;#when-the-code-was-written-by-a-machine&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This was already true when humans wrote the code.&#xA;It is more pronounced now that machines do.&lt;/p&gt;&#xA;&lt;p&gt;When an LLM generates the diff, reading it line by line is even less useful, for reasons explored in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;.&#xA;The reviewer becomes the only mind in the loop, reconstructing intent from output, and that reconstruction is harder and slower than reviewing a human who can at least be asked what they meant.&lt;/p&gt;&#xA;&lt;p&gt;So the metadata review does not get more rigorous by being relabeled a code review.&#xA;It gets more exhausting, and less effective, for the same automatic approval at the end.&lt;/p&gt;&#xA;&lt;p&gt;If you were not reading human-written code, you are not going to start reading machine-written code.&#xA;You are going to keep approving signals, with a worse feeling about it.&#xA;&lt;strong&gt;The productive move is to put the effort where it was always worth more: upstream, in the specification, the tests, and the gates.&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;p&gt;You do not need permission to start.&#xA;Pick the low-blast-radius path and let it merge on green.&#xA;Then be plain with your team about what the rest of the approvals were already doing.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When a change is large, irreversible, or crosses a trust boundary, read it in full.&lt;/strong&gt;&#xA;Budget the time.&#xA;Treat it as the exception it is, not as the default presented as diligence.&lt;/p&gt;&#xA;&lt;p&gt;And measure the gap.&#xA;Ask your approvers what they remember from the pull requests they approved.&#xA;The number will embarrass you, and that embarrassment is the beginning of a review process that is actually worth its cost.&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;https://tomrochette.com/verifying-code-without-reading-it/&#34; &gt;Verifying Code Without Reading It&lt;/a&gt; - the system that makes unread review safe: the checks, critics, and gates that replace the reading.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rolling-out-the-unread-review/&#34; &gt;Rolling Out the Unread Review&lt;/a&gt; - how to ship that system to a team that does not trust it yet.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - the root insight this article shares, seen from the model&amp;rsquo;s side: acceptance is the gate the model cannot close on its own, and reading is the reviewer-side equivalent.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - makes the case that reading LLM-written code is the wrong approach.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - separates the approve-click from the reading, and shows where a human gate genuinely adds value.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt; - the more aggressive claim that human review is being replaced by verification systems.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/who-resolves-the-merge-conflict/&#34; &gt;Who Resolves the Merge Conflict?&lt;/a&gt; - a companion question about which decisions need a human who holds genuine intent.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Issues Are Free Now: Send the Implementation, Not the Idea</title>
      <link>https://tomrochette.com/send-implementation-not-issue/</link>
      <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/send-implementation-not-issue/</guid>
      <category>open-source</category><category>software-engineering</category><category>llm</category><category>pull-request</category><category>issues</category><category>ai</category><category>contribution</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;For most of software&amp;rsquo;s history, filing an issue took actual work.&#xA;You had to reproduce the bug, narrow it down, write a clear description, and decide whether the request was worth the maintainer&amp;rsquo;s time.&#xA;That filter is gone.&#xA;&lt;strong&gt;An AI agent can read a README, a changelog, or spend ten minutes with the tool, and produce a polished, well-formatted issue in seconds, and it can do it a hundred times before lunch.&lt;/strong&gt;&#xA;The cost of creating an issue fell to almost nothing, the cost of clearing one did not, and every issue tracker on the internet is now overflowing.&lt;/p&gt;&#xA;&lt;p&gt;If you are the one filing those issues, the result is unpleasant but clear.&#xA;The issue you just opened is no longer a contribution in any practical sense.&#xA;It is a request for someone else&amp;rsquo;s work, and it is sitting in a queue next to nine hundred other requests for someone else&amp;rsquo;s work, most of them produced just as cheaply as yours.&#xA;&lt;strong&gt;The only thing that still changes the outcome is the implementation attached to the request, because the implementation is the one input whose cost has not fallen.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Issue Tracker Was Always a Wish List&#xA;    &lt;div id=&#34;the-issue-tracker-was-always-a-wish-list&#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-issue-tracker-was-always-a-wish-list&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It is worth being clear about what an issue tracker actually was, even before AI.&#xA;A well-written bug report was a genuine gift, because it gave the maintainer a reproduction and a starting point.&#xA;A feature request was almost always a wish.&#xA;Someone else should do this.&#xA;Someone else should want this.&#xA;Someone else should spend their Saturday on the thing I would like to have.&lt;/p&gt;&#xA;&lt;p&gt;Maintainers cleared the gifts and let the wishes pile up, and that was fine, because the wishes cost the filer enough effort to write that only the motivated ones made it through.&#xA;The friction was the filter.&#xA;&lt;strong&gt;The issue tracker was tolerable only because filing an issue was mildly annoying, and the mildly annoyed filer self-selected for &amp;ldquo;I actually care.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Remove the friction and the wish list becomes the whole tracker.&#xA;This is already true for most trackers.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cost Imbalance Is the Whole Problem&#xA;    &lt;div id=&#34;the-cost-imbalance-is-the-whole-problem&#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-cost-imbalance-is-the-whole-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The arithmetic that overwhelms the tracker is simple.&#xA;It costs a filer roughly zero seconds and zero cents to open an issue with an AI agent.&#xA;It costs a maintainer anywhere from five minutes to an afternoon to triage it: read the request, check whether it duplicates something, decide whether the project wants it, find the relevant code, and either close it, schedule it, or do it.&#xA;&lt;strong&gt;One side of that exchange is free; the other side is unpaid, and the unpaid side is the one you are asking to work.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Multiply that imbalance by a few hundred issues a week and you get the current state of every popular open source repository on the planet.&#xA;The triage queue grows faster than any single human can read it, the maintainer starts ignoring the tab, the contributor waits six months for a reply, and the project slowly gains a reputation for being unresponsive.&#xA;Nobody is at fault.&#xA;&lt;strong&gt;The system is just balanced so that the cheap side produces faster than the expensive side can consume, and the buffer between them is a person.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This cost imbalance is the same dynamic I described for pull requests in &lt;a href=&#34;https://tomrochette.com/triaging-open-source-pull-requests/&#34; &gt;The Pull Request Queue Outgrew You&lt;/a&gt;: the cost to create a change fell below the cost to review it, and the maintainer became the bottleneck in their own queue.&#xA;What is true for code changes is now true for ideas, and ideas are even cheaper to produce.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;An Implementation Rewrites the Ask&#xA;    &lt;div id=&#34;an-implementation-rewrites-the-ask&#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;#an-implementation-rewrites-the-ask&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the move that fixes the imbalance, and it is the only move that fixes it.&#xA;Stop sending the description.&#xA;Send the code.&lt;/p&gt;&#xA;&lt;p&gt;A pull request with a working implementation changes the maintainer&amp;rsquo;s job from &amp;ldquo;do this work&amp;rdquo; to &amp;ldquo;evaluate this work,&amp;rdquo; and those are not the same task.&#xA;Doing the work is open-ended, expensive, and unpaid.&#xA;Evaluating the work is limited, fast, and something a maintainer can actually fit into a Saturday morning.&#xA;The difference between &amp;ldquo;you should add a dark mode&amp;rdquo; and &amp;ldquo;here is a dark mode, here are the tests, here is the screenshot, merge or reject&amp;rdquo; is the difference between a request for a favor and an offer to work together.&#xA;&lt;strong&gt;The implementation is what converts your issue from a cost imposed on the maintainer into an option extended to them.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is also why the maintainer is so much more likely to act on a pull request than on an issue.&#xA;A PR gives them a simple choice they can make in minutes.&#xA;An issue gives them an open-ended commitment that will eat an afternoon if they engage with it at all.&#xA;If you wonder why your feature request has sat untouched for two years while a stranger&amp;rsquo;s twenty-line PR landed in a week, that is the entire explanation.&#xA;&lt;strong&gt;The PR was cheap to say yes to. Your issue was expensive to say yes to, and expensive to say no to, so it got neither, which is what happens to expensive things in a full queue.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cost of Implementing Fell Too&#xA;    &lt;div id=&#34;the-cost-of-implementing-fell-too&#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-cost-of-implementing-fell-too&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The obvious pushback is that not everyone can write the implementation, and that used to be true.&#xA;It is not true anymore.&lt;/p&gt;&#xA;&lt;p&gt;The same AI agent that filed the issue can write the pull request.&#xA;You describe what you want, the agent reads the codebase, produces a diff, writes the tests, and opens the PR.&#xA;The skill floor for &amp;ldquo;I can send a working implementation&amp;rdquo; dropped from senior engineer to motivated user with a coding agent and an afternoon.&#xA;The reason to keep sending descriptions instead of implementations is no longer that you cannot produce the implementation.&#xA;&lt;strong&gt;It is that you have not updated your habits to match the new cost structure.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the same shift &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; keeps arriving at.&#xA;Producing code is no longer the constraint.&#xA;Deciding what to produce, and accepting what got produced, is the constraint.&#xA;In an issue tracker, that means the scarce resource is no longer &amp;ldquo;someone willing to file the issue&amp;rdquo; or even &amp;ldquo;someone willing to write the code.&amp;rdquo;&#xA;The scarce resource is the maintainer&amp;rsquo;s attention, and the only way to earn a share of it is to bring the work to a state where saying yes costs them almost nothing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;But I Am Not Sure My Implementation Is Good&#xA;    &lt;div id=&#34;but-i-am-not-sure-my-implementation-is-good&#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;#but-i-am-not-sure-my-implementation-is-good&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This is the second pushback, and it is more serious than the first.&#xA;You worry that sending an AI-generated PR is dumping low-quality work on an already overloaded maintainer, and that is a genuine risk.&#xA;The answer is not to hold back the PR.&#xA;The answer is to do the work that makes the PR cheap to evaluate.&lt;/p&gt;&#xA;&lt;p&gt;Run the tests.&#xA;Write a new one for the behavior you added.&#xA;Reproduce the bug you claim to fix, and show the test going red before your patch and green after.&#xA;Keep the change small and focused on one thing.&#xA;Link the issue you are closing.&#xA;Write a PR description that lets the maintainer evaluate the change in thirty seconds.&#xA;&lt;strong&gt;Every one of these is an attempt to lower the cost of saying yes, and lowering the cost of saying yes is the entire point.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A small, tested, well-described PR is a gift.&#xA;A large, untested, AI-generated diff with a one-line description is just a different kind of issue, and it will be treated like one.&#xA;The discipline is not &amp;ldquo;send code instead of an issue.&amp;rdquo;&#xA;The discipline is &amp;ldquo;send code that is cheaper to merge than to discuss, and if you cannot produce that, the issue tracker will not save you either.&amp;rdquo;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What the Maintainer Actually Wants&#xA;    &lt;div id=&#34;what-the-maintainer-actually-wants&#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-the-maintainer-actually-wants&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It helps to look at the exchange from the maintainer&amp;rsquo;s perspective for a moment, because the request they are implicitly making is not unreasonable.&#xA;They want to spend their scarce attention on decisions only they can make: the architecture, the direction, the boundary between what the project is and is not.&#xA;They do not want to spend it turning a feature description into code, because that is the part the LLM can do now.&#xA;&lt;strong&gt;The highest-value contribution you can make is one that arrives with every reversible decision already made and every test already green, so that the maintainer&amp;rsquo;s job is reduced to a judgment call they were going to have to make anyway.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the open source version of the argument in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;.&#xA;When the implementation is cheap to produce, the value concentrates upstream, at the point where someone decides what the implementation should be.&#xA;A good contributor in this era is not someone who writes clean code.&#xA;A good contributor is someone who arrives with a concrete proposal, already implemented, already tested, already de-risked, leaving the maintainer nothing to do but approve, redirect, or reject.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What About Bugs You Cannot Reproduce&#xA;    &lt;div id=&#34;what-about-bugs-you-cannot-reproduce&#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-about-bugs-you-cannot-reproduce&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a genuine exception, and it should be named so the argument does not go too far.&#xA;Some issues are genuine bug reports where the value is in the reproduction, not in the fix.&#xA;A crash that happens on a specific kernel version, a regression that only shows up under load, a data corruption bug that requires a particular sequence of inputs.&#xA;These are gifts, when written carefully, because the maintainer could not have produced the reproduction themselves.&lt;/p&gt;&#xA;&lt;p&gt;But notice what makes them gifts.&#xA;They carry information the maintainer did not have and could not get cheaply.&#xA;&lt;strong&gt;The test for whether your issue is a contribution or noise is exactly this: does it contain information the maintainer could not have produced on their own in fifteen minutes with an AI agent?&lt;/strong&gt;&#xA;If yes, file it.&#xA;If no, the issue is a request for someone else to do work you could have done yourself, and the queue is full of those already.&lt;/p&gt;&#xA;&lt;p&gt;The same test separates a useful feature request from noise.&#xA;&amp;ldquo;Add dark mode&amp;rdquo; is noise.&#xA;&amp;ldquo;Add dark mode, here is the design, here is why it does not conflict with the theming system, here is the PR, here are the screenshots, here are the tests&amp;rdquo; is a contribution.&#xA;The information that converts noise into contribution is exactly the information that comes from having tried to build the thing.&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;p&gt;If you file issues against projects you depend on, change one habit.&#xA;Before you open the issue, try to open the PR instead.&#xA;Point an agent at the codebase, describe the change you want, and let it produce a draft.&#xA;Spend the time you would have spent polishing the issue description on getting the PR to a state where merging it is the obvious move: tests passing, scope small, description clear.&#xA;&lt;strong&gt;File the issue only if the PR attempt really failed, and when you do, include what you learned from the attempt, because that is the information the maintainer actually needs.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you maintain a project, change the default you invite.&#xA;Rewrite your contributing guide to say, plainly, that feature requests without an accompanying PR will be closed, and that bug reports without a reproduction will be closed faster.&#xA;Be clear that this is not hostility.&#xA;It is the only way the queue stays manageable.&#xA;Make the pull request template the default path, and the issue template the exception for the narrow set of things only an issue can carry.&#xA;&lt;strong&gt;Setting a higher standard for contributions is, in this era, an act of respect for the contributors who are willing to meet it, because they are the ones whose work will otherwise be buried under the noise.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;And for everyone, learn the new cost structure.&#xA;Ideas are free.&#xA;Descriptions are free.&#xA;Issues are free.&#xA;Implementations are the only thing left that earns maintainer attention, and the reason is not that maintainers are picky.&#xA;It is that implementations are the one input whose cost has not fallen to zero, which makes them the one input that still signals you meant it.&#xA;&lt;strong&gt;If you want a maintainer to take your request seriously, prove it the only way that still costs you something: by sending the code.&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;https://tomrochette.com/triaging-open-source-pull-requests/&#34; &gt;The Pull Request Queue Outgrew You&lt;/a&gt; - the companion argument from the maintainer&amp;rsquo;s side: the cost to create a change fell below the cost to review it, and triage has to replace review&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the upstream pattern: producing code is no longer the constraint, deciding and accepting are, which relocates where contribution lives&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why value concentrates upstream at the decision point when implementation becomes cheap&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - the maintainer&amp;rsquo;s remaining job is acceptance, and an implementation is what lets them do that job in minutes instead of afternoons&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/feature-parity-is-not-a-moat/&#34; &gt;Feature Parity Is Not a Moat&lt;/a&gt; - the parallel collapse of copy-time, which made features cheap to clone the same way AI made issues cheap to file&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Who Resolves the Merge Conflict? Why the Bot and the Author Are Not Interchangeable</title>
      <link>https://tomrochette.com/who-resolves-the-merge-conflict/</link>
      <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/who-resolves-the-merge-conflict/</guid>
      <category>software-engineering</category><category>pull-request</category><category>git</category><category>automation</category><category>llm</category><category>github-actions</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A pull request falls behind main and conflicts.&#xA;Who resolves the conflict, the bot or the author?&#xA;&lt;strong&gt;The answer depends on whether the conflict is mechanical or semantic, and treating the two as the same job is what makes every flat policy, &amp;ldquo;the bot rebases everything&amp;rdquo; or &amp;ldquo;the author handles it,&amp;rdquo; wrong.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The clean rebase is settled and out of scope; automate it on every push to main.&#xA;The live question is the conflict, and the conflict is not one thing.&#xA;Resolving a conflict means deciding what the code should now say, and that decision is a claim about what the author meant.&#xA;Someone has to make it, and the interesting question is who can support it with intent they actually hold.&#xA;&lt;strong&gt;The choice depends entirely on whether the conflict has a unique correct answer an oracle can check, or whether its correctness lives only in the author&amp;rsquo;s head.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why the Question Got Loud&#xA;    &lt;div id=&#34;why-the-question-got-loud&#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;#why-the-question-got-loud&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For most of git&amp;rsquo;s history the conflict question was quiet.&#xA;A contributor resolved their own conflicts, or the maintainer did, and the round trip was short because the people involved shared a mental model of the code.&#xA;Two things broke that equilibrium.&lt;/p&gt;&#xA;&lt;p&gt;The first is auto-merge.&#xA;Once low-risk changes land on green without a human clicking merge, a PR that cannot merge cleanly becomes the thing that stalls the whole lane.&#xA;A human can absorb a conflicted PR by glancing and clicking; an automated merge pipeline cannot.&#xA;&lt;strong&gt;Auto-merge makes conflict resolution a prerequisite of the lane, and that turns &amp;ldquo;who resolves&amp;rdquo; from a courtesy into a structural question.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The second is the model-authored pull request.&#xA;When the author is a model, the conflict round trip behaves differently at both ends.&#xA;The bot never sleeps, so a resolve request adds no latency the way it does for a human.&#xA;But the bot also has no private knowledge of what the code was meant to do, so its resolution is a guess about intent presented as a fix.&#xA;This is the plausibility problem, and it is worst exactly where the conflict is hardest.&lt;/p&gt;&#xA;&lt;p&gt;So the modern repository has a lane that wants every PR mergeable on green, and a growing share of PRs whose intent lives only in the code a model produced, with no description, linked issue, or spec that states it independently.&#xA;When the intent is encoded somewhere, a conflict has an oracle to check a resolution against.&#xA;When it is not, there is nothing to verify the resolution by, and the absence of a way to verify the resolution, not the absence of an author to interrogate, is the actual problem.&#xA;&lt;strong&gt;The old default, the contributor resolves, is too slow for the merge lane, and the bot is too confident to stand in as the oracle, so the live question is not who authored the PR but whether the intent exists outside someone&amp;rsquo;s head.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Conflict Has a Gradient&#xA;    &lt;div id=&#34;the-conflict-has-a-gradient&#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-conflict-has-a-gradient&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Conflicts are not all the same, and the gradient is what lets you route them accurately.&lt;/p&gt;&#xA;&lt;p&gt;At one end is the mechanical conflict: an import added in both branches, a trailing comma, two functions inserted at adjacent positions, a formatting drift the formatter can settle.&#xA;Resolve it and there is exactly one answer any reasonable developer would accept, and a test suite that passes before will pass after.&#xA;At the other end is the semantic conflict: two people changed the same logic for different reasons, and the correct resolution depends on which reason was right.&#xA;&lt;strong&gt;The mechanical conflict has a unique correct answer that a test can falsify; the semantic conflict has no correct answer without the intent that motivated the change.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The mechanical conflict is therefore still logistics, just logistics that needs an oracle.&#xA;Resolve it, run the suite, and if the suite passes the resolution is, by construction, the one the project already trusted.&#xA;Here the test acts as the independent oracle the model cannot be, the same role it plays in closing the bug gap when a fix claims to be done.&#xA;A conflict whose wrongness a test can catch is a conflict the bot may resolve, because the test, not the model, approves it.&lt;/p&gt;&#xA;&lt;p&gt;The semantic conflict is a different kind of problem.&#xA;Nothing external is left to disagree with the model&amp;rsquo;s plausible resolution, because the definition of &amp;ldquo;correct&amp;rdquo; is the intent, and the intent is precisely what the model does not have.&#xA;&lt;strong&gt;A bot that resolves a semantic conflict is making an intent claim it cannot source, and the harder the disagreement, the more likely the claim is a confident fabrication.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the Intent Lives&#xA;    &lt;div id=&#34;where-the-intent-lives&#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;#where-the-intent-lives&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The semantic conflict splits once more, and it splits on a cleaner axis than who wrote the PR: whether the intent is encoded anywhere a resolver can read it.&lt;/p&gt;&#xA;&lt;p&gt;Intent can live in two places.&#xA;It can be encoded, written down in the PR description, a linked issue, an acceptance criterion, a failing test, anything a human authored to state what the change was supposed to do.&#xA;Or it can be tacit, held in someone&amp;rsquo;s head and never written down, surfacing only if you ask.&#xA;&lt;strong&gt;A conflict is safe for the bot to resolve when the intent is encoded and the encoded source covers the disputed region, because then the resolution has an oracle.&lt;/strong&gt;&#xA;It is not safe when the intent is tacit, because then nothing external can falsify the bot&amp;rsquo;s resolution, and the resolution will look right whether or not it is.&lt;/p&gt;&#xA;&lt;p&gt;Author type matters, but only as a proxy for where the intent lives, and the proxy is worth stating because it inverts the naive assumption.&lt;/p&gt;&#xA;&lt;p&gt;When the PR is human-authored, the human&amp;rsquo;s own description is an independent statement of intent.&#xA;If the description covers the conflict, the bot may resolve against it, and the description, not the model, is the oracle.&#xA;If the description is thin or silent on the disputed region, the intent is effectively tacit, and the only defensible move is to ask the human who holds it.&lt;/p&gt;&#xA;&lt;p&gt;When the PR is bot-authored, the trap is that the bot&amp;rsquo;s description is not an independent oracle.&#xA;It was written by the same model that wrote the code, or a sibling of it, so checking the resolution against the description is checking the model against its own narration, which provides no independent verification.&#xA;The only trustworthy intent source for a bot-authored PR is something a human wrote upstream: the issue, the spec, the prompt, an acceptance test.&#xA;When that upstream source exists and covers the conflict, the bot may re-derive against it, and the re-derivation is checkable.&#xA;When it does not exist, the intent was never encoded by anyone, and the bot&amp;rsquo;s resolution is a guess about intent no one ever wrote down.&lt;/p&gt;&#xA;&lt;p&gt;The distinction above is the refinement the flat &amp;ldquo;maintainer picks a default&amp;rdquo; framing misses.&#xA;A single repository-wide default is too coarse, because the right default is a function of whether the PR carries an encoded, independent intent source, and that varies PR by PR, not repository by repository.&#xA;&lt;strong&gt;The PR that links a human-authored issue with acceptance criteria is safe for bot resolution regardless of who wrote the code; the PR that arrives as code and a self-description is not safe regardless of who wrote the code.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Label Is the Right Mechanism, the Default Is the Question&#xA;    &lt;div id=&#34;the-label-is-the-right-mechanism-the-default-is-the-question&#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-label-is-the-right-mechanism-the-default-is-the-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Given the split, the mechanism worth reaching for is the one the question already points at: a label on the PR that decides who resolves a conflict.&#xA;Labels are already how a modern triage layer expresses every other routing decision, and conflict resolution is no different in kind.&#xA;The label should express the thing that actually varies, which is not &amp;ldquo;is this PR rebased&amp;rdquo; but &amp;ldquo;who is allowed to resolve a semantic conflict on it.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;For a mechanical conflict there is no decision worth encoding: the bot resolves, the test gates, and a &lt;code&gt;conflict: auto-resolved&lt;/code&gt; note is enough audit trail.&#xA;The label is worth having at the semantic tier.&#xA;Something like &lt;code&gt;conflict: author-resolves&lt;/code&gt; versus &lt;code&gt;conflict: bot-may-resolve&lt;/code&gt;, defaulted per repository by the maintainers and overridable per PR, is the right form, and it is the form the question proposes.&lt;/p&gt;&#xA;&lt;p&gt;The interesting work is in the default, and the sound default routes on intent availability, not on author type.&#xA;A PR that links a human-authored issue or spec, with acceptance criteria that cover the change, defaults to &lt;code&gt;bot-may-resolve&lt;/code&gt;, because the resolution has an oracle.&#xA;A PR that arrives as code alone, with no independent statement of intent, defaults to &lt;code&gt;author-resolves&lt;/code&gt;, because nothing can falsify the bot&amp;rsquo;s resolution.&#xA;The maintainer&amp;rsquo;s actual choice is not &amp;ldquo;auto or manual.&amp;rdquo;&#xA;It is &amp;ldquo;what do we assume about a PR whose intent source we cannot verify.&amp;rdquo;&#xA;The conservative answer, treat the PR as unencoded and ask the author, costs a little latency where the bot could have handled it.&#xA;The permissive answer, resolve and trust the model, costs intent claims that are silently wrong.&#xA;&lt;strong&gt;Between losing a little speed and shipping a confidently wrong merge, the speed is the cheaper loss, so the default for a PR with no verifiable intent source should be &lt;code&gt;author-resolves&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This makes the highest-leverage change a documentation change, not a tooling one.&#xA;Require, in the pull request template, a linked issue or a short intent statement that covers the change, and ask whether the PR was model-assisted.&#xA;The linked issue turns an unencoded PR into an encoded one; the model-assisted flag tells you whether the PR&amp;rsquo;s own description can serve as an oracle or whether you need the upstream source.&#xA;Both shrink the &amp;ldquo;no verifiable intent&amp;rdquo; bucket, and shrinking that bucket is what lets the auto-merge lane actually run.&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;p&gt;First, surface the conflict instead of hiding it.&#xA;Add &lt;a href=&#34;https://github.com/eps1lon/actions-label-merge-conflict&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;eps1lon/actions-label-merge-conflict&lt;/a&gt; so any PR that falls behind main gets a &lt;code&gt;merge-conflict&lt;/code&gt; label the moment it conflicts, and loses it the moment it merges again.&#xA;Your auto-merge lane can now filter &lt;code&gt;-label:merge-conflict&lt;/code&gt; and only act on work that is actually ready.&#xA;The author gets an automated nudge that a genuine decision is needed, without you being the one to say it.&lt;/p&gt;&#xA;&lt;p&gt;Second, classify the conflict before you route it.&#xA;Mechanical conflicts (imports, formatting, adjacent non-overlapping edits) go to the bot behind the test gate, and the test is the oracle that makes the resolution trustworthy.&#xA;If the suite fails, the resolution is wrong by definition and the bot escalates rather than ships.&lt;/p&gt;&#xA;&lt;p&gt;Third, route the semantic conflict by whether an independent intent source exists.&#xA;If the PR links a human-authored issue or spec that covers the disputed region, let the bot resolve and check the result against that source, with an encoded test that must pass on the resolved tree.&#xA;If the PR carries no such source, post the conflict as a comment and drop the PR to &lt;code&gt;author-resolves&lt;/code&gt; until someone provides the intent or resolves it by hand.&lt;/p&gt;&#xA;&lt;p&gt;Fourth, choose the conservative default for the case where you cannot tell.&#xA;When a PR arrives with no linked issue and no intent statement, default to &lt;code&gt;author-resolves&lt;/code&gt;, because the cost of a confidently wrong merge is higher than the cost of a round trip, and the round trip at least asks the question the silent resolution skips.&lt;/p&gt;&#xA;&lt;p&gt;Fifth, make the routing signal cheap to produce.&#xA;Require a linked issue or a short intent statement in the pull request template, and ask whether the PR was model-assisted.&#xA;The link is what turns an unencoded PR into an encoded one, and the model-assisted flag is what tells you whether the PR&amp;rsquo;s own description can count as the oracle.&lt;/p&gt;&#xA;&lt;p&gt;Do not write a policy that says &amp;ldquo;the bot resolves everything&amp;rdquo; or &amp;ldquo;the author resolves everything.&amp;rdquo;&#xA;Both are the original mistake in policy form.&#xA;&lt;strong&gt;Gate the mechanical conflict behind a test, defer the semantic conflict to an independent intent source when one exists, and defer to the author when one does not.&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;https://tomrochette.com/triaging-open-source-pull-requests/&#34; &gt;Triaging Open Source Pull Requests&lt;/a&gt; - the upstream layer this refines: labeling merge conflicts and routing by risk is the triage move, and conflict-tier routing is what makes the auto-merge lane inside that layer safe&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - the case for gating on the properties of a change rather than on the existence of a PR, which is the same principle applied here to &amp;ldquo;is this a mechanical conflict or a semantic one&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap: Why an LLM Solution Is Not a Shipped Solution&lt;/a&gt; - why a conflict resolution is a mini-acceptance gap: the mechanical tier wants a check (verification), and the semantic tier wants the author&amp;rsquo;s reaction (validation)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the plausibility problem in full, the reason a bot resolving a semantic conflict is making a claim about intent it cannot source&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Feature Parity Is Not a Moat: Compete on What Does Not Clone</title>
      <link>https://tomrochette.com/feature-parity-is-not-a-moat/</link>
      <pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/feature-parity-is-not-a-moat/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>strategy</category><category>product-thinking</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;For most of software&amp;rsquo;s history, shipping a feature gave you a window of time.&#xA;A competitor had to understand the need, design the thing, build it, test it, and ship it.&#xA;That took weeks or months, during which you could compound users, data, and trust.&#xA;&lt;strong&gt;That window has collapsed to days, sometimes hours, and the uncomfortable implication is that the feature was never the moat.&#xA;The slowness of copying it was.&lt;/strong&gt;&#xA;Once the copying is nearly free, every hour spent perfecting a feature is an hour spent on the one layer the market just commoditized, and the advantage has moved somewhere developers were trained to undervalue.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Moat Was Always Somewhere Else&#xA;    &lt;div id=&#34;the-moat-was-always-somewhere-else&#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-moat-was-always-somewhere-else&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;An &lt;a href=&#34;https://en.wikipedia.org/wiki/Economic_moat&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;economic moat&lt;/a&gt; is the structural thing that lets a business keep its profits against competitors.&#xA;The standard list of what counts as a moat is worth noting: switching costs, network effects, cost advantages, intangible assets like brand and patents, and efficient scale.&#xA;A feature is not on that list.&#xA;A feature is something you build in the hope that a moat forms around it, through usage, data, or habit, before anyone else arrives.&lt;/p&gt;&#xA;&lt;p&gt;For a long time the list and the feature felt like the same thing, because copying was slow.&#xA;You shipped the recommendation engine, and by the time a rival reverse-engineered it, your users had generated enough behavior to make yours better.&#xA;You shipped the dashboard, and by the time it was cloned, your customers had wired it into their weekly review and would not move.&#xA;The feature was the seed, and the copy-time was the growing season, and the moat was the harvest.&#xA;&lt;strong&gt;The copy-time is gone, which means the growing season is gone, which means a feature shipped with no other plan now arrives at the market with no moat attached.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Actually Clones, and What Does Not&#xA;    &lt;div id=&#34;what-actually-clones-and-what-does-not&#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-actually-clones-and-what-does-not&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It is worth being clear about the boundary, because the claim is not that everything is copyable.&lt;/p&gt;&#xA;&lt;p&gt;What clones easily is the surface.&#xA;The visible feature, the UI flow, the API surface, the integration that calls a public endpoint, the report that joins two tables.&#xA;A capable engineer with an LLM can reproduce any of these from a screenshot or a description in an afternoon, and a competitor can ship a credible copy in a week.&#xA;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Commoditization&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;commoditization&lt;/a&gt; of the application layer is under way, and it is fast.&lt;/p&gt;&#xA;&lt;p&gt;What does not clone is everything that had to be true for the feature to be valuable in the first place.&#xA;The two years of usage data that makes the recommendation correct.&#xA;The thousand integrations already in your customers&amp;rsquo; workflows.&#xA;The track record of reliability that makes a procurement officer sign.&#xA;The deep, specific knowledge of a narrow industry that lets you pick the right feature to build next.&#xA;&lt;strong&gt;The competitor can copy the feature and still be left holding an empty shell, because the value was never in the shell.&#xA;It was in the data, the relationships, and the context the shell was built to carry.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the Moat Moves&#xA;    &lt;div id=&#34;where-the-moat-moves&#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;#where-the-moat-moves&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When the feature stops being the moat, the advantage moves to the layers that surround it, and almost all of them are things that compound through time rather than through code.&#xA;Five of them matter for a developer deciding where to spend next quarter.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The learning loop, not the feature&#xA;    &lt;div id=&#34;the-learning-loop-not-the-feature&#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-learning-loop-not-the-feature&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The competitor copies your feature, but they do not copy what you learned by shipping it.&#xA;Shipping a feature to actual users tells you which half of it was wrong, which edge case matters, and which adjacent problem is now the actual problem.&#xA;That knowledge is yours alone until competitors run the same experiment themselves, and they will now run it by copying your result rather than discovering their own.&#xA;The moat is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Lean_startup&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;build-measure-learn&lt;/a&gt; cycle compressed to days, run against actual users, faster than anyone who is copying can run it.&#xA;&lt;strong&gt;A feature is no longer a deliverable; it is a probe, and the team that runs more probes per month learns more about the market than the team that ships fewer, more perfect features.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Proprietary data and feedback&#xA;    &lt;div id=&#34;proprietary-data-and-feedback&#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;#proprietary-data-and-feedback&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A clone of your feature without your data is a weaker feature.&#xA;The recommendation is bland, the search results are generic, the anomaly detection fires on the wrong things, because the model behind the clone has nothing the field has not already seen.&#xA;&lt;strong&gt;Every interaction with an actual user adds signal to your data that the clone cannot synthesize, and that data advantage compounds quietly until the gap is not closeable by better code.&lt;/strong&gt;&#xA;This compounding is the mechanism behind &lt;a href=&#34;https://en.wikipedia.org/wiki/Network_effect&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;network effects&lt;/a&gt;, and it is one of the few things that genuinely does not clone.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Workflow depth and switching costs&#xA;    &lt;div id=&#34;workflow-depth-and-switching-costs&#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;#workflow-depth-and-switching-costs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A feature you can use in a minute is a feature you can leave in a minute.&#xA;A feature that is wired into six other systems, that holds three years of configuration, that your team&amp;rsquo;s runbook depends on, is a feature that survives a cheaper clone because the cost of moving exceeds the cost of staying.&#xA;These &lt;a href=&#34;https://en.wikipedia.org/wiki/Switching_barriers&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;switching costs&lt;/a&gt; are a legitimate moat when they are a side effect of genuine usefulness, and they are built by going deep into the customer&amp;rsquo;s workflow rather than wide across a feature checklist.&#xA;&lt;strong&gt;Shallow integrations clone in a day; deep ones do not, and depth is a function of how much of the customer&amp;rsquo;s actual job you have absorbed.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Distribution, brand, and trust&#xA;    &lt;div id=&#34;distribution-brand-and-trust&#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;#distribution-brand-and-trust&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Engineers historically treated these as someone else&amp;rsquo;s problem, which was always a mistake and is now an expensive one.&#xA;&lt;strong&gt;The feature that arrives through a channel the user already trusts, from a name they recognize, beats the marginally better clone that arrives cold.&lt;/strong&gt;&#xA;Trust is built slowly, through reliability and through presence, and it is one of the slowest things in the product to reproduce.&#xA;A developer who invests zero attention here has chosen to compete purely on the layer that clones fastest.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Judgment about what to build&#xA;    &lt;div id=&#34;judgment-about-what-to-build&#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;#judgment-about-what-to-build&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Judgment is the layer the rest of this blog keeps arriving at, because the bottleneck keeps moving toward it.&#xA;When everyone can build anything, building things stops being the differentiator, and &lt;strong&gt;deciding which thing to build, for whom, and in what form is what matters&lt;/strong&gt;.&#xA;That judgment is a personal and team-level moat, it compounds with practice, and it does not clone because the competitor cannot copy the years of being close to the problem that produced it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Feature Race Is a Trap&#xA;    &lt;div id=&#34;the-feature-race-is-a-trap&#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-feature-race-is-a-trap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The failure mode to avoid is the feature-parity race, and it is the default response if you do not see the shift.&lt;/p&gt;&#xA;&lt;p&gt;You ship a feature, the competitor copies it, you ship another to pull ahead, they copy that, and the cycle repeats.&#xA;Both teams are running as fast as they can and neither is building a moat, because every feature is neutralized within a week of landing.&#xA;&lt;strong&gt;You are exhausting yourselves producing advantages that confer no advantage, and the only thing accumulating is technical debt from features nobody had time to integrate properly.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The feature-parity race is the same trap as &lt;a href=&#34;https://en.wikipedia.org/wiki/First-mover_advantage&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;first-mover advantage&lt;/a&gt; misunderstood.&#xA;Being first was valuable only because first movers got the growing season, the time for data and habit to form before the copiers arrived.&#xA;When the growing season disappears, being first stops being the point.&#xA;Being the one who learns fastest from being there is the point.&lt;/p&gt;&#xA;&lt;p&gt;The deeper error is treating the feature list as the measure of progress.&#xA;It feels like progress, because the features keep shipping and the release notes keep growing.&#xA;But a competitor watching your changelog now has your roadmap for free, and a model lets them execute it at your speed.&#xA;&lt;strong&gt;A changelog is no longer a strategic asset; in a clonable world it is a plan you give your competitors every week.&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;p&gt;A few concrete moves follow from treating features as probes and moats as the target.&lt;/p&gt;&#xA;&lt;p&gt;Audit where your engineering effort actually lands.&#xA;If the large majority sits on building and polishing features, you are over-invested in the layer that clones and under-invested in the layers that do not.&#xA;Reallocate deliberately, not by abandoning features, which you still have to ship, but by capping the time each feature gets and routing the surplus into data, integration depth, and the learning loop.&lt;/p&gt;&#xA;&lt;p&gt;Instrument every feature as an experiment from day one.&#xA;If you ship a feature and cannot tell within a week whether it moved the metric you built it for, you have shipped a deliverable, not a probe.&#xA;You have also given up the one advantage the copy does not get.&#xA;&lt;strong&gt;The measurement is the moat, because it is what turns the feature into learning the competitor does not inherit.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pick a narrow domain and go deep rather than spreading wide.&#xA;The competitor who clones your broad, shallow surface gets a credible copy.&#xA;The competitor who tries to clone your deep, specific understanding of one industry&amp;rsquo;s workflow has to do the years of work you already did, and most will not bother.&#xA;A moat that survives cloning is built from depth.&lt;/p&gt;&#xA;&lt;p&gt;Invest in the layers engineers usually skip.&#xA;Distribution, documentation that lives where users find it, reliability that earns trust, onboarding that keeps users through genuine usefulness rather than lock-in.&#xA;These compound while features are being copied, and they are the reason the copy reaches a market with no unclaimed customers.&lt;/p&gt;&#xA;&lt;p&gt;And protect the judgment layer on your own team.&#xA;The skill of deciding what to build is now the highest-leverage skill a developer can hold, and it is built by staying close to users, not by staying close to the IDE.&#xA;&lt;strong&gt;Delegate the building aggressively so that the time you reclaim lands on the judgment, the data, and the relationships, because those are the three things the clone will never contain.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Moat Moved&#xA;    &lt;div id=&#34;the-moat-moved&#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-moat-moved&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The feature stopped being the moat the day it became cheap to copy.&#xA;That shift is not a threat to the developers who notice, because the moat did not disappear; it moved to a set of layers that reward exactly the attention most engineers have been trained to underinvest in.&#xA;Data, distribution, workflow depth, trust, and judgment all compound, and none of them clone.&lt;/p&gt;&#xA;&lt;p&gt;The teams that win this era will still ship features, because they have to.&#xA;They will just stop treating the features as the point.&#xA;&lt;strong&gt;The feature is the seed; the moat is the growing season, and the growing season is now made of everything except the code.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why automating feature production relocates the constraint to judgment and problem selection, the same relocation this article turns into a moat argument&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-acceptance-gap/&#34; &gt;The Acceptance Gap&lt;/a&gt; - taste as the last compounding layer, which is the version of &amp;ldquo;judgment about what to build&amp;rdquo; that no clone can reproduce&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - the shift from producing code to deciding what to build at the team level, the organizational form of the moat move&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ai-maxxing-vs-fighting-against-it/&#34; &gt;AI-Maxxing and Resistance Are the Same Mistake&lt;/a&gt; - the compounding-versus-depreciating test that decides where to spend attention, applied here to features versus moats&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-foundation-predicts-the-house-of-cards/&#34; &gt;The Foundation Predicts the House of Cards&lt;/a&gt; - why the foundation (data, conventions, tests, depth) outranks the feature on the surface, the durability claim behind a non-clonable moat&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://en.wikipedia.org/wiki/Economic_moat&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Economic moat&lt;/a&gt; - the structural sources of sustained advantage, the canonical list against which a feature is revealed to be a seed rather than a moat&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Commoditization&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Commoditization&lt;/a&gt; - what happens when a previously differentiated layer becomes cheap and standard, which is what happened to the application feature layer&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Switching_barriers&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Switching barriers&lt;/a&gt; - the workflow-depth moat that does not clone, built by absorbing more of the customer&amp;rsquo;s actual job&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Network_effect&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Network effect&lt;/a&gt; - the data-and-usage moat that makes a clone strictly weaker than the original it copied&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Lean_startup&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Lean startup&lt;/a&gt; - the build-measure-learn framing that turns a feature from a deliverable into a probe, the learning loop that outpaces copying&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/First-mover_advantage&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;First-mover advantage&lt;/a&gt; - why being first was only valuable during the growing season, and why that advantage compresses as copy-time collapses&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Acceptance Gap: Why an LLM Solution Is Not a Shipped Solution</title>
      <link>https://tomrochette.com/the-acceptance-gap/</link>
      <pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-acceptance-gap/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>verification</category><category>taste</category><category>specification</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Generation is solved.&#xA;You describe, the model produces, and the candidate looks plausible in seconds.&#xA;&lt;strong&gt;The bottleneck is no longer producing a solution; it is deciding that a solution is acceptable, and that gap is the one the model cannot close on its own.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I keep noticing the gap in two forms, and they fail for different reasons, which is why a single strategy like &amp;ldquo;review the output&amp;rdquo; addresses neither one well.&#xA;One is a bug fix that the model swears it fixed and did not.&#xA;The other is a feature that meets the description and still is not what I wanted.&#xA;Both feel like the model failed, but the failure is in a different place each time, and the difference is the whole point.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Gap Is Not One Gap&#xA;    &lt;div id=&#34;the-gap-is-not-one-gap&#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-gap-is-not-one-gap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The distance between &amp;ldquo;a description of what I want&amp;rdquo; and &amp;ldquo;an acceptable solution I would ship&amp;rdquo; is not a single gap.&#xA;It is two, stacked, and they respond to completely different interventions.&lt;/p&gt;&#xA;&lt;p&gt;The first gap is about correctness.&#xA;Did the change do the thing it was supposed to do, in the world, against ground truth the model cannot see?&#xA;The second gap is about fit.&#xA;Does the result match the thing I actually wanted, most of which I never wrote down?&lt;/p&gt;&#xA;&lt;p&gt;Correctness is, in principle, objective.&#xA;You can check it.&#xA;Fit is, in practice, subjective.&#xA;You can only feel it.&lt;/p&gt;&#xA;&lt;p&gt;Most of the frustration people report with LLM coding comes from treating these two gaps as the same gap, and applying the tool that closes one to the other.&#xA;&lt;strong&gt;The bug gap wants a check; the feature gap wants a reaction, and reaching for one when you need the other is why the work keeps coming back unfinished.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Bug Fixes: The Silent-Failure Gap&#xA;    &lt;div id=&#34;bug-fixes-the-silent-failure-gap&#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;#bug-fixes-the-silent-failure-gap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When I ask an LLM to fix a bug, it returns a patch that looks correct.&#xA;It will explain the root cause in a confident voice, write a plausible diff, and tell me the issue is resolved.&#xA;Often it is.&#xA;Sometimes the patch addresses a symptom and the root cause resurfaces next week.&#xA;Sometimes it fixes the exact reproduction I pasted but not the general case.&#xA;Sometimes it fixes nothing at all, and merely rearranges the code into something that looks like a fix.&lt;/p&gt;&#xA;&lt;p&gt;The model cannot tell me which of those happened, because the model has no access to the ground truth that would let it verify its own claim.&#xA;It optimized for &amp;ldquo;a plausible fix,&amp;rdquo; not for &amp;ldquo;a verified fix.&amp;rdquo;&#xA;&lt;strong&gt;Its confidence is not evidence, and nothing in the tone of the output distinguishes a genuine fix from a convincing one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This silent failure is the dangerous kind, which testers have always called the &lt;a href=&#34;https://en.wikipedia.org/wiki/Oracle_%28software_testing%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;oracle problem&lt;/a&gt;: without an independent way to decide what the correct output is, you cannot tell that a plausible output is wrong.&#xA;The model has the problem in its most acute form, because it is both the thing producing the answer and the thing narrating why the answer is right.&#xA;The narrator is not independent of the guess.&lt;/p&gt;&#xA;&lt;p&gt;So for bug fixes I end up verifying manually.&#xA;I reproduce the original failure, apply the patch, and check whether the failure is gone.&#xA;Not because I enjoy the step, but because the model&amp;rsquo;s report of &amp;ldquo;fixed&amp;rdquo; is a hypothesis, not a result.&#xA;&lt;strong&gt;A fix is not fixed until something independent of the model says so.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Features: The Taste Gap&#xA;    &lt;div id=&#34;features-the-taste-gap&#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;#features-the-taste-gap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When I ask an LLM to build a feature, the gap is different, and it fails for a different reason.&lt;/p&gt;&#xA;&lt;p&gt;The feature works, in the narrow sense that it does what the description said.&#xA;The gap is that &amp;ldquo;meets the description&amp;rdquo; is not &amp;ldquo;matches what I wanted,&amp;rdquo; because most of what I wanted was never in the description.&#xA;It lived in taste.&#xA;The feel of the interaction.&#xA;The expectation about a default.&#xA;The sense that this control belongs here and not there, that the empty state should say this and not that, that the feature is finished when it feels light rather than heavy.&lt;/p&gt;&#xA;&lt;p&gt;I did not write any of that down, because I did not know I wanted it until I saw the result that lacked it.&#xA;Subjective requirements work this way: they are discovered by contact with the artifact, not enumerated in advance.&#xA;&lt;strong&gt;A specification can carry the objective part of what you want; it cannot carry the taste, because the taste is a reaction you have not had yet.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;So the loop for features is not &amp;ldquo;verify,&amp;rdquo; it is &amp;ldquo;try.&amp;rdquo;&#xA;Generate, run it, notice the distance between what I got and what I expected, describe that distance, regenerate.&#xA;When the distance closes to zero, I stop.&#xA;That stopping point, the &amp;ldquo;just ship it&amp;rdquo; moment, is a taste judgment, not a verification step.&#xA;No test defines it.&#xA;I define it, by being satisfied.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why the Model Cannot Close Either Gap Alone&#xA;    &lt;div id=&#34;why-the-model-cannot-close-either-gap-alone&#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;#why-the-model-cannot-close-either-gap-alone&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The two gaps look different, but they share one cause.&#xA;Both are acceptance gaps, and acceptance requires information the model does not possess.&lt;/p&gt;&#xA;&lt;p&gt;For bugs, the missing information is the ground truth of correct behavior.&#xA;That truth lives outside the model, in an executable check or in a human observation.&#xA;The model can guess at it, but it cannot consult it.&#xA;For features, the missing information is my taste.&#xA;That lives outside the model too, in the reaction I will have when I try the result.&#xA;The model can guess at it from my description, but it cannot feel it.&lt;/p&gt;&#xA;&lt;p&gt;In both cases the model can generate candidates freely, and in both cases it cannot sign off on them.&#xA;&lt;strong&gt;Signing off requires exactly the external information that was never in the prompt, which is why no amount of rephrasing the prompt closes the gap.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This situation follows the same pattern I described in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;: automating a layer does not remove the layer, it moves the constraint to the layer above it.&#xA;Here the automated layer is generation, and the layer above it is acceptance.&#xA;The work did not go away.&#xA;It turned into deciding whether the generated thing is good enough.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Closes Each Gap&#xA;    &lt;div id=&#34;what-closes-each-gap&#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-closes-each-gap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The two gaps respond to different interventions, and the strategy is to match the intervention to the gap.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The bug gap is closeable in principle, and the mechanism is encoding.&lt;/strong&gt;&#xA;Write the acceptance criterion as a check the model cannot fake.&#xA;A failing test that must pass.&#xA;A reproduction script that must go green.&#xA;A property the output must satisfy, stated before the fix is written.&#xA;Once the check exists, the model can run it, and its claim of &amp;ldquo;fixed&amp;rdquo; becomes trustworthy only when the check agrees.&#xA;The bug gap shrinks to exactly the set of bugs for which I have not yet written a check.&lt;/p&gt;&#xA;&lt;p&gt;This practice is &lt;a href=&#34;https://en.wikipedia.org/wiki/Test-driven_development&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;test-driven development&lt;/a&gt;, rediscovered as the answer to &amp;ldquo;why don&amp;rsquo;t I trust the model&amp;rsquo;s fix.&amp;rdquo;&#xA;The discipline is to write the check before, or alongside, the fix, not after.&#xA;A bug fixed without a check is a bug I will have to verify by hand, forever, because nothing is keeping it fixed.&#xA;A bug fixed with a check stays fixed, because the check fails loudly if the bug regresses, whether or not I am looking.&lt;/p&gt;&#xA;&lt;p&gt;The feature gap is not closeable the same way, and this is the uncomfortable part.&#xA;I cannot write a test for &amp;ldquo;this feels right,&amp;rdquo; because I do not know the specification of my own taste until I see the result.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Exploratory_testing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Exploratory testing&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Specification_by_example&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;specification by example&lt;/a&gt; help me identify more of what I want, but they cannot identify all of it, because the residual is a reaction, not a requirement.&#xA;The feature gap closes only through iteration, and the terminal condition is a human saying &amp;ldquo;good enough, ship it.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;There is no encoding that removes the human from the feature loop, because the human&amp;rsquo;s reaction is the signal the loop is measuring.&#xA;The best I can do is make the loop fast, so that each try is cheap and I can afford many of them.&#xA;A model that generates in thirty seconds and an environment where I can try the result in ten more is a loop I can run ten times in a morning, and the tenth version is usually the one I ship.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Mistake Is Treating Them as the Same Gap&#xA;    &lt;div id=&#34;the-mistake-is-treating-them-as-the-same-gap&#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-mistake-is-treating-them-as-the-same-gap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most of the waste in LLM-assisted work comes from applying the wrong tool to the wrong gap.&lt;/p&gt;&#xA;&lt;p&gt;Treat the taste gap as a verification problem, and you write tests that pass and ship features nobody likes.&#xA;The tests confirm the feature does what the spec said, which was never the question.&#xA;The question was whether the spec was the right spec, and no test answers that.&lt;/p&gt;&#xA;&lt;p&gt;Treat the verification gap as a taste problem, and you manually re-check, by hand, things the model could have checked for itself.&#xA;You read a diff looking for whether the bug is really fixed, applying your eyes as a slow and unreliable &lt;a href=&#34;https://en.wikipedia.org/wiki/Oracle_%28software_testing%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;oracle&lt;/a&gt;, when a failing test would have answered in a second and answered the same way every time.&#xA;&lt;strong&gt;You waste on work the model could have done for you attention you should have spent on taste.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The split is sharp once you see it.&#xA;If the gap is &amp;ldquo;did it do the thing,&amp;rdquo; that is a check, and the move is to encode the check so the model runs it without you.&#xA;If the gap is &amp;ldquo;is this the thing I wanted,&amp;rdquo; that is taste, and the move is to iterate fast and trust the stopping judgment.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Verification_and_validation&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Verification and validation&lt;/a&gt; are the old words for this distinction, and they have never been more useful than they are now: verify against the spec, validate against the want.&#xA;The model can help with the first.&#xA;It cannot do the second for you.&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;p&gt;Sort the next ten things you hand to the model into two piles.&lt;/p&gt;&#xA;&lt;p&gt;The bug pile gets a check for each item, written first.&#xA;If you cannot write a check that would fail before the fix and pass after it, you do not yet understand the bug well enough to delegate it, and the model&amp;rsquo;s fix will be a guess you have to verify by hand anyway.&#xA;The check is the thing that makes delegation safe.&lt;/p&gt;&#xA;&lt;p&gt;The feature pile gets a fast iteration loop.&#xA;Cut anything that slows down the try-it-and-react cycle, because the cost of a feature is no longer the cost of building it, it is the cost of the number of tries it takes to match your taste.&#xA;A model that builds cheaply makes many tries affordable, and that is what matters.&lt;/p&gt;&#xA;&lt;p&gt;Leave the &amp;ldquo;is this good enough to ship&amp;rdquo; judgment to yourself.&#xA;&lt;strong&gt;Generation is no longer the bottleneck, and neither, soon, is verification, once you encode it. The bottleneck is acceptance, and the half of acceptance that is taste is the last compounding thing you do.&lt;/strong&gt;&#xA;Nobody can write that prompt for you, which is exactly why it is the part worth keeping.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the upstream pattern this article specializes: automating generation moves the bottleneck up to acceptance, it does not remove it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the case that quality is a property of your specifications and gates, which is the premise behind encoding the bug gap as a check&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - why the model cannot close either gap: ground truth and taste are context it was never given&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ai-maxxing-vs-fighting-against-it/&#34; &gt;AI-Maxxing and Resistance Are the Same Mistake&lt;/a&gt; - taste as the compounding activity to protect, the same &amp;ldquo;ship it&amp;rdquo; judgment this article identifies as the last human loop&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>github-board - A kanban board for any GitHub search</title>
      <link>https://tomrochette.com/github-board/</link>
      <pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/github-board/</guid>
      <category>javascript</category><category>github</category><category>kanban</category><category>developer-tools</category><category>single-page-application</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;GitHub&amp;rsquo;s issue and PR lists are flat.&#xA;When you&amp;rsquo;re tracking a dozen repositories, or triaging hundreds of items, a flat list stops being a useful view of your work.&#xA;GitHub Projects exists, but it demands manual triage and won&amp;rsquo;t adapt to an ad-hoc layout you want for the next ten minutes.&lt;/p&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://github.com/TomzxCode/github-board&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;github-board&lt;/a&gt; to fix this.&#xA;&lt;strong&gt;It turns any GitHub search into a customizable kanban board, defined entirely by small filter expressions.&lt;/strong&gt;&#xA;There is no backend, no build step, and no framework.&#xA;You open &lt;code&gt;index.html&lt;/code&gt; in a browser, paste a token, and build a board in seconds against live data.&#xA;Try it live at &lt;a href=&#34;https://tomzxcode.github.io/github-board/&#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=tomzxcode.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzxcode.github.io/github-board&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;github-board overview&#34;&#xA;    width=&#34;3838&#34;&#xA;    height=&#34;2002&#34;&#xA;    src=&#34;https://tomrochette.com/github-board/overview_hu_c399360d6697790b.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/github-board/overview_hu_c399360d6697790b.png 800w, https://tomrochette.com/github-board/overview_hu_28a24efb0766c2cf.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/github-board/overview.png&#34;&gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The problem&#xA;    &lt;div id=&#34;the-problem&#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-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A GitHub issue list answers one question well: what is in this repo, in this state.&#xA;It answers almost every other question poorly.&#xA;Which of my open PRs are drafts, which are waiting on review, and which have gone stale?&#xA;How are issues spread across the &lt;code&gt;area:*&lt;/code&gt; labels?&#xA;What does the backlog look like across an entire organization?&lt;/p&gt;&#xA;&lt;p&gt;You can build a GitHub Project board to answer these questions, but each card has to be placed and maintained by hand.&#xA;&lt;strong&gt;The board reflects triage you did, not the state of your data right now.&lt;/strong&gt;&#xA;For a recurring view that&amp;rsquo;s worth the effort.&#xA;For a one-off question you want to answer in 30 seconds, it isn&amp;rsquo;t.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How it works&#xA;    &lt;div id=&#34;how-it-works&#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;#how-it-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You give github-board a search query, the same syntax the GitHub search bar already understands.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repo:owner/name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Then you define columns with boolean expressions over the fetched items.&#xA;The board fetches up to 2000 issues and PRs through the GraphQL API with pagination, &lt;strong&gt;then groups them into columns entirely in your browser&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A default board ships with Draft PRs, Open PRs, Open Issues, and Closed columns.&#xA;Each column is just an expression, and the board re-renders live as you type.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Columns and swimlanes as expressions&#xA;    &lt;div id=&#34;columns-and-swimlanes-as-expressions&#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;#columns-and-swimlanes-as-expressions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every column is a filter expression against fields like type, state, labels, assignees, and dates.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type:pr and state:open and draft&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type:issue and state:open and label:bug&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;state:closed and updated &amp;gt; -7d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The expression language supports the operators you&amp;rsquo;d expect: &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;=~&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;contains&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt;, &lt;code&gt;exists&lt;/code&gt;, &lt;code&gt;empty&lt;/code&gt;, plus regex matching and relative date math like &lt;code&gt;-7d&lt;/code&gt;, &lt;code&gt;-2w&lt;/code&gt;, &lt;code&gt;-1y&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;You can add a second dimension with swimlanes (rows), so a board can group issues by assignee across the same set of status columns, all from one query.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Auto-split with a $1 capture&#xA;    &lt;div id=&#34;auto-split-with-a-1-capture&#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;#auto-split-with-a-1-capture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Auto-split is the feature I use most.&#xA;If you put a &lt;code&gt;$1&lt;/code&gt; capture in a column or lane rule, &lt;strong&gt;github-board expands it into one bucket per distinct matched value.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Name a lane &lt;code&gt;area:$1&lt;/code&gt; matching &lt;code&gt;labels =~ /area:(.*)/i&lt;/code&gt;, and you instantly get one row per area label that exists in your data.&#xA;Name a column the same way and you get one column per label.&#xA;No manual setup per bucket, and buckets with no items simply don&amp;rsquo;t appear or stay empty depending on your preference.&#xA;The &lt;code&gt;$1&lt;/code&gt; capture is the fastest way to see how work distributes across a category you didn&amp;rsquo;t know you cared about until just now.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Shareable links and presets&#xA;    &lt;div id=&#34;shareable-links-and-presets&#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;#shareable-links-and-presets&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The entire view (query, filter, columns, swimlanes, and sort) is encoded in the URL hash.&#xA;Click Share, send the link to a teammate, and they see your exact board using their own token.&#xA;&lt;strong&gt;The token is never included in the link&lt;/strong&gt;, so you can paste it anywhere.&lt;/p&gt;&#xA;&lt;p&gt;For boards you return to, save the full configuration as a named preset.&#xA;Presets persist in &lt;code&gt;localStorage&lt;/code&gt; alongside your token, so everything stays in your browser.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Privacy and scope&#xA;    &lt;div id=&#34;privacy-and-scope&#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;#privacy-and-scope&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;github-board&lt;/code&gt; is read-only and has no backend.&#xA;Requests go directly from your browser to &lt;code&gt;api.github.com&lt;/code&gt;.&#xA;You bring your own personal access token, which is stored only in your browser&amp;rsquo;s &lt;code&gt;localStorage&lt;/code&gt;.&#xA;There is no OAuth flow, no server logging, and no way for the tool to modify your issues or pull requests.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;github-board is a view, not a project-management tool.&lt;/strong&gt;&#xA;There is no drag-and-drop across columns, because the board reflects your data, not where a card was dropped.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Getting started&#xA;    &lt;div id=&#34;getting-started&#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;#getting-started&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;No install is required.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Open &lt;a href=&#34;https://tomzxcode.github.io/github-board/&#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=tomzxcode.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzxcode.github.io/github-board&lt;/a&gt; (or open &lt;code&gt;index.html&lt;/code&gt; from the repo).&lt;/li&gt;&#xA;&lt;li&gt;Paste a GitHub personal access token with read access to what you want to view.&lt;/li&gt;&#xA;&lt;li&gt;Open Settings and enter a query like &lt;code&gt;repo:owner/name&lt;/code&gt; or &lt;code&gt;org:your-org&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Click Refresh and adjust the columns to match your workflow.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;If you already use &lt;a href=&#34;https://tomrochette.com/gh-cached/&#34; &gt;gh-cached&lt;/a&gt; to browse issues without burning your rate limit, or &lt;a href=&#34;https://tomrochette.com/ghx/&#34; &gt;ghx&lt;/a&gt; for agentic code reviews, github-board is the visual counterpart: the same GitHub data, arranged the way you want to see it right now.&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;https://tomrochette.com/gh-cached/&#34; &gt;gh-cached&lt;/a&gt; - browse GitHub issues and PRs from a local cache to avoid rate limits&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ghx/&#34; &gt;ghx&lt;/a&gt; - a CLI for the inline comment and review operations the &lt;code&gt;gh&lt;/code&gt; CLI doesn&amp;rsquo;t expose&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/triaging-open-source-pull-requests/&#34; &gt;Triaging open source pull requests&lt;/a&gt; - the kind of high-volume review work github-board is built to visualize&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/backlog-management-best-practices/&#34; &gt;Backlog management best practices&lt;/a&gt; - principles for keeping a backlog scannable that expression-driven boards make concrete&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>llm-augmented-workflows - A config-driven automation engine for GitHub, powered by opencode</title>
      <link>https://tomrochette.com/llm-augmented-workflows/</link>
      <pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/llm-augmented-workflows/</guid>
      <category>python</category><category>github</category><category>github-actions</category><category>llm</category><category>ai-agents</category><category>automation</category><category>workflows</category><category>skills</category><category>opencode</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;GitHub already provides a working event bus.&#xA;Issues get opened, labeled, and closed; PRs get reviewed and merged; comments land on lines and threads.&#xA;Every one of those events is a chance for an LLM agent to do useful work, triage the issue, draft a plan, reproduce a bug, post a review.&#xA;The gap is not the events and it is not the agents.&#xA;The gap is the code that connects them.&lt;/p&gt;&#xA;&lt;p&gt;Today that connecting code is per-flow YAML.&#xA;Every workflow you want to automate gets its own &lt;code&gt;triage.yml&lt;/code&gt;, &lt;code&gt;plan.yml&lt;/code&gt;, &lt;code&gt;implement.yml&lt;/code&gt;, each with its own copy of the agent invocation boilerplate, its own trigger, its own label math, and its own drift.&#xA;Add a fourth flow and you copy the file again.&#xA;Change how the agent is called and you edit all of them.&#xA;The workflows describe the same agent doing different things, but they share nothing.&lt;/p&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://github.com/TomzxCode/llm-augmented-workflows&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-augmented-workflows&lt;/a&gt; to reduce all of that duplication to one file.&#xA;&lt;strong&gt;You describe every flow as event-matched rules in a single &lt;code&gt;.github/llmaw/flows.yml&lt;/code&gt;, and the dispatcher routes GitHub events to the right agent skill, with token-free label and shell steps for the transitions that do not need a model.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The problem&#xA;    &lt;div id=&#34;the-problem&#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-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The moment you try to automate more than one agent-driven flow, the per-file pattern breaks down.&lt;/p&gt;&#xA;&lt;p&gt;Each flow duplicates three things that it should not duplicate.&#xA;First, the wiring: trigger on this label, run the agent, relabel, wait for the next event.&#xA;Second, the agent invocation: which model, which skills repo, which timeout, which working directory.&#xA;Third, the outcome handling: what to do when the agent says &lt;em&gt;approved&lt;/em&gt;, &lt;em&gt;rejected&lt;/em&gt;, or &lt;em&gt;needs changes&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;That duplication has a cost.&#xA;Workflows drift from each other.&#xA;The agent invocation that worked yesterday is copy-pasted into the new flow with the old model id.&#xA;A label rename in one file does not propagate to the others.&#xA;And the parts of the flow that do not even need an LLM, relabeling an issue, posting a fixed comment, closing a linked issue on merge, still incur a model call because the file is built around one.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;What you want is to describe the &lt;em&gt;flow&lt;/em&gt; once, and let the engine handle the wiring.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How it works&#xA;    &lt;div id=&#34;how-it-works&#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;#how-it-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The engine is a small stateless dispatcher with one reusable GitHub Actions workflow.&#xA;&lt;strong&gt;State is stored entirely in GitHub, in labels, issues, and PRs.&lt;/strong&gt;&#xA;The engine reads an event, matches it against &lt;code&gt;flows.yml&lt;/code&gt;, runs the matched rule&amp;rsquo;s pipeline, and exits.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GitHub event (issue labeled, PR merged, comment, ...)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dispatch.yml  reads flows.yml  -&amp;gt;  route matches rule(s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;for each matched rule, run-rule runs its whole `run` in one pass:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   labels/shell (pre) -&amp;gt; skill (opencode) -&amp;gt; labels/shell (post) -&amp;gt; on_outcome&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;the agent acts on GitHub (relabel, comment, open PR, close) -&amp;gt; emits new events&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The pipeline is the unit of work.&#xA;A rule&amp;rsquo;s &lt;code&gt;run&lt;/code&gt; is an ordered list of steps, and the engine runs them in one pass: token-free label and shell steps can run before and after the agent, the agent step calls an opencode skill, and &lt;code&gt;on_outcome&lt;/code&gt; maps the agent&amp;rsquo;s verdict to labels, a close, or a comment.&#xA;Because relabeling emits a new event, the next phase of the flow is just another rule that matches the new label.&#xA;Terminal outcomes need no special handling: an agent closes an issue (won&amp;rsquo;t fix), or a PR merges and an &lt;code&gt;on-merge&lt;/code&gt; rule closes the linked issue.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;One config file, not one workflow per flow&#xA;    &lt;div id=&#34;one-config-file-not-one-workflow-per-flow&#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;#one-config-file-not-one-workflow-per-flow&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every flow is defined in &lt;code&gt;.github/llmaw/flows.yml&lt;/code&gt;.&#xA;A flow is a list of rules, and a rule is a &lt;code&gt;when&lt;/code&gt; (the event match) plus a &lt;code&gt;run&lt;/code&gt; (the ordered pipeline).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;defaults&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;opencode/deepseek-v4-flash-free&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;agents_repository&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;tomzx/agents&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;timeout_minutes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;flows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;plan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;generate-plan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;when&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;issues, action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labeled, label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;plan-needed }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;skill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;generate-plan } ]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;on&lt;/span&gt;-&lt;span class=&#34;l&#34;&gt;plan-merged&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;when&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull_request, action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;closed, merged&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;true, branch_prefix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;plan/ }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;[plan-approved], target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;linked-issue } } ]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;implement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;when&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;issues, action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labeled, label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;plan-approved }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;skill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;implement-plan } ]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Read the file top to bottom and you have the whole flow.&#xA;An issue gets &lt;code&gt;plan-needed&lt;/code&gt;, the &lt;code&gt;generate-plan&lt;/code&gt; skill runs and opens a &lt;code&gt;plan/...&lt;/code&gt; PR.&#xA;When that PR merges, &lt;code&gt;on-plan-merged&lt;/code&gt; adds &lt;code&gt;plan-approved&lt;/code&gt; to the linked issue, no model involved.&#xA;When the issue is labeled &lt;code&gt;plan-approved&lt;/code&gt;, the &lt;code&gt;implement-plan&lt;/code&gt; skill runs and implements it.&#xA;&lt;strong&gt;Three rules, one file, one copy of the wiring.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Token-free transitions&#xA;    &lt;div id=&#34;token-free-transitions&#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;#token-free-transitions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Token-free transitions are the feature that justifies the whole design.&lt;/p&gt;&#xA;&lt;p&gt;Relabeling an issue does not require an LLM, and neither does closing a linked issue on merge or posting a deterministic comment.&#xA;In llm-augmented-workflows, &lt;code&gt;labels&lt;/code&gt; and &lt;code&gt;shell&lt;/code&gt; steps run without calling the model at all.&#xA;The &lt;code&gt;on-plan-merged&lt;/code&gt; rule above is a single label step: when the plan PR merges, add &lt;code&gt;plan-approved&lt;/code&gt; to the linked issue.&#xA;Zero tokens, zero model latency, one GitHub API call.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;That means the agent only runs where the agent is actually needed, and the transitions between phases use no tokens, run fast, and are deterministic.&lt;/strong&gt;&#xA;A flow that used to cost three model calls (triage, plan, implement) plus the steps between them now costs two, because the step between them is a label.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Two execution modes&#xA;    &lt;div id=&#34;two-execution-modes&#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;#two-execution-modes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Each matched rule&amp;rsquo;s pipeline runs in one job.&#xA;What happens &lt;em&gt;after&lt;/em&gt; the pipeline is controlled by the execution mode:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;event-driven&lt;/strong&gt; (default): the rule runs once and the job ends.&#xA;The relabel emits a new event that re-triggers the dispatcher for the next phase.&#xA;One job per phase, each one independently observable in the Actions log.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;continuous&lt;/strong&gt;: the same job keeps advancing to the next rule based on the labels each rule adds, until &lt;code&gt;llmaw:needs-human&lt;/code&gt; appears or the chain reaches a resting state.&#xA;One job per pipeline, the whole end-to-end run in one log.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Set it under &lt;code&gt;defaults.execution&lt;/code&gt; or per flow, force it per dispatch via the &lt;code&gt;execution&lt;/code&gt; input or the &lt;code&gt;LLMAW_EXECUTION&lt;/code&gt; repo variable.&#xA;Event-driven is easier to debug; continuous is easier to watch flow end to end.&#xA;The same &lt;code&gt;flows.yml&lt;/code&gt; works in either mode, because the mode is about how the engine chains rules, not how the rules are defined.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Skills come from your agents repository&#xA;    &lt;div id=&#34;skills-come-from-your-agents-repository&#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;#skills-come-from-your-agents-repository&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;code&gt;skill&lt;/code&gt; step does not run an inline prompt.&#xA;It runs an opencode skill sourced from a configurable agents repository, &lt;code&gt;tomzx/agents&lt;/code&gt; by default, overridable with &lt;code&gt;AGENTS_REPOSITORY&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;That separation is important.&#xA;The flow definition says &lt;em&gt;what&lt;/em&gt; should happen and &lt;em&gt;when&lt;/em&gt;.&#xA;&lt;strong&gt;The skill definition says &lt;em&gt;how&lt;/em&gt; the agent should do it.&lt;/strong&gt;&#xA;When you improve the &lt;code&gt;generate-plan&lt;/code&gt; skill, every flow that references it gets the improvement, without touching &lt;code&gt;flows.yml&lt;/code&gt;.&#xA;When you add a new flow, you reference an existing skill instead of inlining a prompt that will fall out of date.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The default flow runs on the free model&#xA;    &lt;div id=&#34;the-default-flow-runs-on-the-free-model&#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-default-flow-runs-on-the-free-model&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The default model is &lt;code&gt;opencode/deepseek-v4-flash-free&lt;/code&gt;, and it needs only the auto-provided &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;.&#xA;&lt;strong&gt;You can adopt the engine on a throwaway repo without provisioning a single secret.&lt;/strong&gt;&#xA;Override per repo or per org with &lt;code&gt;OPENCODE_MODEL&lt;/code&gt;, point &lt;code&gt;AGENTS_REPOSITORY&lt;/code&gt; at your own skills, raise &lt;code&gt;LLMAW_MAX_ITERATIONS&lt;/code&gt; for long continuous runs, and you are done.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Getting started&#xA;    &lt;div id=&#34;getting-started&#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;#getting-started&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Three steps.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Add one wrapper workflow to your repo, pinning the dispatcher by ref.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;.github/workflows/llm-workflows.yml&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;LLM Workflows&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;issues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;types&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;opened, labeled, reopened, closed] }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull_request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;types&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;closed, labeled, ready_for_review] }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;issue_comment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;types&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;created] }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull_request_review_comment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;types&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;created] }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;permissions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull-requests&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;issues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;jobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dispatch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;TomzxCode/llm-augmented-workflows/.github/workflows/dispatch.yml@v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;secrets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;inherit&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Add &lt;code&gt;.github/llmaw/flows.yml&lt;/code&gt; describing your flows.&#xA;Start from the example above or the &lt;a href=&#34;https://github.com/TomzxCode/llm-augmented-workflows/blob/main/docs/flows.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;docs/flows.md&lt;/code&gt;&lt;/a&gt; recipes for triage, close-on-merge, and per-step overrides.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Run the &lt;strong&gt;Setup Labels&lt;/strong&gt; workflow to create the labels declared under &lt;code&gt;labels:&lt;/code&gt;, or let your flows add them as needed.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Pin &lt;code&gt;@v1&lt;/code&gt; for the latest within a major tag, &lt;code&gt;@main&lt;/code&gt; if you want to track the tip, or &lt;code&gt;@&amp;lt;full-sha&amp;gt;&lt;/code&gt; for an immutable production pin.&lt;/p&gt;&#xA;&lt;p&gt;Consumers never copy the engine.&#xA;The dispatcher checks this repository out into &lt;code&gt;.llmaw/&lt;/code&gt; on the worker and runs &lt;code&gt;uv run --project .llmaw llmaw ...&lt;/code&gt;, pinning the version via the wrapper&amp;rsquo;s &lt;code&gt;uses:&lt;/code&gt; ref.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What it does not do yet&#xA;    &lt;div id=&#34;what-it-does-not-do-yet&#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-it-does-not-do-yet&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The engine&amp;rsquo;s unit of work is one issue per workflow execution.&#xA;A matched rule runs, the agent acts, the job ends (or chains within continuous mode until &lt;code&gt;needs-human&lt;/code&gt;), and the next event is the next run.&#xA;That model fits small, well-scoped work well: triage this issue, plan this feature, reproduce this bug, implement this task.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It does not fit a large epic.&lt;/strong&gt;&#xA;A change that spans many tasks, many PRs, and many days cannot be implemented by a single issue&amp;rsquo;s pipeline, because the engine has no concept of an epic as a first-class object that owns child issues and tracks their aggregate progress.&#xA;To implement a large change today, you have to break the epic into per-task issues yourself, outside the engine, and let each of those issues run its own one-issue pipeline.&#xA;The decomposition step, deciding how to split the work and how the pieces depend on each other, is not automated.&lt;/p&gt;&#xA;&lt;p&gt;Closing that gap is the next phase of the problem, and it is where the &lt;code&gt;needs-human&lt;/code&gt; checkpoint currently does the most work.&#xA;Until the engine can take an epic, decompose it into ordered tasks, and drive each task through its own run while tracking the whole, large changes stay a manual decomposition followed by automated execution.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why this structure&#xA;    &lt;div id=&#34;why-this-structure&#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;#why-this-structure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have been writing about the pieces of this for a while.&#xA;&lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; argued that the trigger layer deserves the same treatment as the prompt layer, versioned, reviewable, owned next to the behavior it schedules.&#xA;&lt;a href=&#34;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt; pushed the question of how far you can take a GitHub project where every maintainer function is replaced by an automated loop.&#xA;&lt;strong&gt;llm-augmented-workflows is the engine for both: the flows file is the schedule, the skills are the behavior, and the state stays in GitHub.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you already use &lt;a href=&#34;https://tomrochette.com/ghx/&#34; &gt;ghx&lt;/a&gt; for agentic code reviews or &lt;a href=&#34;https://tomrochette.com/github-board/&#34; &gt;github-board&lt;/a&gt; to visualize your issues, llm-augmented-workflows is the layer that keeps the issues moving.&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;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt; - the scheduling layer that &lt;code&gt;flows.yml&lt;/code&gt; makes concrete per repository&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 this engine is built toward&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ghx/&#34; &gt;ghx&lt;/a&gt; - the CLI the review skills use for inline PR comments the &lt;code&gt;gh&lt;/code&gt; CLI does not expose&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/github-board/&#34; &gt;github-board&lt;/a&gt; - a kanban view over the same GitHub state these flows mutate&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - why the human checkpoint (&lt;code&gt;llmaw:needs-human&lt;/code&gt;) stays in the loop&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Defects Flow Downstream, Fixes Must Flow Upstream</title>
      <link>https://tomrochette.com/defects-flow-downstream/</link>
      <pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/defects-flow-downstream/</guid>
      <category>ai</category><category>software-engineering</category><category>sdlc</category><category>llm</category><category>specification</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The further upstream a defect is born, the more code it contaminates, and the more expensive it becomes to remove.&#xA;This has been true for as long as software has had a lifecycle.&#xA;Two things have changed, and both point the same way.&#xA;First, the generation step is now automated, so upstream defects become downstream output at machine speed.&#xA;Second, the old habit of patching defects in place no longer works as well as it used to.&#xA;&lt;strong&gt;Once the pipeline executes itself, the only durable fix is the one made at the source, and every fix made downstream is a patch you will have to make again.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Pipeline Has Always Run One Way&#xA;    &lt;div id=&#34;the-pipeline-has-always-run-one-way&#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-pipeline-has-always-run-one-way&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Software development is a one-directional sequence of stages.&#xA;Each stage constrains the next: needs become requirements, requirements become a specification, the specification becomes an architecture, the architecture becomes code, the code is verified, shipped, and operated.&#xA;A decision at any stage narrows the space of what is possible at every stage below it, and an error at any stage is inherited by everything that descends from it.&lt;/p&gt;&#xA;&lt;p&gt;This directionality is why the cost of removing a defect rises so steeply the later you find it.&#xA;&lt;a href=&#34;https://doi.org/10.1109/2.962984&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Boehm and Basili&lt;/a&gt; put a number on it more than two decades ago: finding and fixing a software problem after delivery is often a hundred times more expensive than finding and fixing it during requirements and design.&#xA;The exact multiplier is debatable, but the slope of the curve is not.&#xA;&lt;strong&gt;Each stage a defect survives multiplies its removal cost, because each stage builds artifacts on top of it that all have to be reworked when the foundation moves.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The industry already has a name for the obvious response.&#xA;It is called &lt;a href=&#34;https://en.wikipedia.org/wiki/Shift-left_testing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;shift-left testing&lt;/a&gt;, and the move it prescribes, pushing verification earlier in the lifecycle, is correct as far as it goes.&#xA;But shift-left is a half-measure, because it moves the act of checking earlier without moving the act of fixing to where the defect was born.&#xA;The deeper move is not &amp;ldquo;test earlier.&amp;rdquo;&#xA;It is &amp;ldquo;fix at the origin,&amp;rdquo; and the two are not the same.&#xA;Testing earlier finds the symptom sooner; fixing at the origin ensures the symptom is never generated again.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Amplifier Got an Engine&#xA;    &lt;div id=&#34;the-amplifier-got-an-engine&#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-amplifier-got-an-engine&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before LLMs, a human wrote the code, and the human did not translate the specification perfectly.&#xA;That imprecision mattered.&#xA;When the spec was ambiguous, the human made a judgment call, often a reasonable one, and that judgment caught some of the upstream defect before it could reach the running system.&#xA;The defect still propagated, but through a person who could correct it before it reached the running system.&lt;/p&gt;&#xA;&lt;p&gt;The model does not absorb ambiguity.&#xA;It resolves it, once, in the direction of whatever is most probable, and then it writes that resolution into every file it touches.&#xA;&lt;strong&gt;The generation step stopped being a filter and became an amplifier, and it amplifies whatever it was given, including the gaps.&lt;/strong&gt;&#xA;One ambiguous line in a specification becomes a dozen consistent, plausible, uniformly wrong code paths, in seconds, and they all look correct because they all agree with each other.&lt;/p&gt;&#xA;&lt;p&gt;This is the actual intensification.&#xA;The cost curve was always steep, and it is now steep and fast.&#xA;The window in which a human used to catch an upstream defect by &amp;ldquo;just writing the code&amp;rdquo; has closed, because the code writes itself before the human has time to notice the spec was vague.&#xA;By the time anyone reads the output, the upstream defect has already been faithfully reproduced across the diff, and the reviewer is left arguing with the symptom instead of the cause.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Consequences Fan Out&#xA;    &lt;div id=&#34;why-consequences-fan-out&#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;#why-consequences-fan-out&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The reason early stages matter more than late stages is not only that they are cheaper to fix.&#xA;It is that their defects multiply downstream while late-stage defects mostly do not.&lt;/p&gt;&#xA;&lt;p&gt;A bug in code affects the code that contains it.&#xA;A gap in the architecture affects every component built on top of it.&#xA;A missing or wrong requirement affects every architecture that tries to satisfy it, every component that implements it, every test that verifies it.&#xA;&lt;strong&gt;The earlier the stage, the larger the fan-out, because the larger the subtree of artifacts that descend from it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This fan-out is why a specification defect is not just &amp;ldquo;a bug, but earlier.&amp;rdquo;&#xA;It is a different category of problem, one whose blast radius grows with the distance from the source.&#xA;A single ambiguity in a spec can be the common ancestor of a hundred production incidents, each of which looks like a separate bug to the engineer who responds to it, and each of which is, in fact, the same defect.&#xA;Treat them as separate bugs and you will fix a hundred symptoms.&#xA;Treat them as one and you fix the spec once.&lt;/p&gt;&#xA;&lt;p&gt;Nancy Leveson reached the same conclusion from the study of accidents in &lt;a href=&#34;https://openlibrary.org/works/OL16540222W&#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=openlibrary.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Engineering a Safer World&lt;/a&gt;.&#xA;Serious failures are rarely caused by a single component breaking.&#xA;They are caused by flawed control structures upstream that set the components up to fail together, and the component failure is merely the place the upstream flaw became visible.&#xA;The component is the symptom.&#xA;The control structure is the cause.&#xA;Fixing the component prevents that one incident, and fixing the control structure prevents the class.&#xA;&lt;strong&gt;A pipeline stage is a control structure, and in software the earliest stages are the ones with the widest reach.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Fix Belongs Upstream&#xA;    &lt;div id=&#34;the-fix-belongs-upstream&#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-fix-belongs-upstream&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the operational consequence, and it is the whole argument in a single rule.&lt;/p&gt;&#xA;&lt;p&gt;When a defect appears in code, there are two places to fix it.&#xA;You can fix the code, which removes the symptom from this instance.&#xA;Or you can fix the upstream artifact that produced the code, which removes the cause from every instance.&lt;/p&gt;&#xA;&lt;p&gt;The two fixes look similar and are not.&#xA;A code fix is a non-compounding fix.&#xA;It patches one occurrence, leaves the source intact, and guarantees that the same defect will be regenerated the next time the pipeline runs against the same upstream artifact.&#xA;A spec fix is a compounding fix.&#xA;It changes the source, and every future generation inherits the correction automatically, for as long as the artifact exists.&lt;/p&gt;&#xA;&lt;p&gt;This is the same compounding-versus-one-time distinction that makes specification outrank review, as &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; argues: review catches a defect once, for the reviewer who happens to be reading, while a spec prevents the whole class from being generated.&#xA;The principle does not stop at review.&#xA;It runs the entire length of the pipeline.&#xA;&lt;strong&gt;The defect you patch in code today is the defect the model writes again tomorrow from the same ambiguous spec, and the defect you fix in the spec today is the defect the model never writes again.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The discipline this implies is uncomfortable for teams that grew up triaging bugs at the bottom of the pipeline.&#xA;It says that most &amp;ldquo;code bugs&amp;rdquo; in an AI-assisted codebase are not code bugs at all.&#xA;They are specification bugs, or architecture bugs, that happened to surface in code.&#xA;Treating them as code bugs, by fixing the code, removes the visible problem while leaving the source in place to produce the same problem again next sprint.&lt;/p&gt;&#xA;&lt;p&gt;A useful diagnostic comes straight from &lt;a href=&#34;https://en.wikipedia.org/wiki/Five_whys&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;the five whys&lt;/a&gt; and the Toyota &lt;a href=&#34;https://en.wikipedia.org/wiki/Andon_%28manufacturing%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;andon&lt;/a&gt; tradition: when the same class of bug appears more than once, stop the line, walk back up the pipeline asking why until you reach a process cause, and fix the process, not the product.&#xA;Fixing the product gets you a working unit today.&#xA;Fixing the process gets you a working line forever.&#xA;The two investments have almost nothing in common, and teams that confuse them spend their lives re-fixing the same bug in new files.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What This Changes About Where You Spend Effort&#xA;    &lt;div id=&#34;what-this-changes-about-where-you-spend-effort&#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-this-changes-about-where-you-spend-effort&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If consequences amplify downstream and fixes compound upstream, then the allocation of engineering effort across the lifecycle is exactly inverted from where most teams spend it.&lt;/p&gt;&#xA;&lt;p&gt;Most effort sits at the bottom of the pipeline.&#xA;Writing code, reviewing code, fixing code, handling production incidents: these are the stages with the smallest blast radius and the least compounding return.&#xA;They feel urgent because they are where the pain is visible, but they are also where an hour of effort produces the least durable improvement, because the upstream artifacts that produced the pain are still in place, still generating.&lt;/p&gt;&#xA;&lt;p&gt;The high-leverage stages are at the top.&#xA;Requirements, specification, and architecture are the stages whose defects fan out the widest and whose fixes compound the longest.&#xA;They feel less urgent because the pain they cause has not happened yet, and when it does happen it will be blamed on the code, not on the spec that produced the code.&#xA;&lt;strong&gt;The problem is that work at the bottom of the pipeline demands attention while work at the top does not, and most teams respond to what demands attention rather than to what compounds the most.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the same relocation &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; describes from a different angle.&#xA;Once code writes itself, the bottleneck moves to verification, and the highest-leverage response is not to verify harder but to specify better, because specifying better reduces the volume of bad output that verification ever has to catch.&#xA;&lt;strong&gt;You are not rewarded for being good at a late stage.&#xA;You are rewarded for making the late stage unnecessary by being good at an earlier one.&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;p&gt;A few concrete moves follow, and each is an inversion of the default.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Treat every repeated bug class as an upstream defect.&lt;/strong&gt;&#xA;When the same kind of issue shows up a second or third time, stop fixing it in code.&#xA;Walk back up the pipeline until you find the artifact that allowed it, and fix that.&#xA;The rule is blunt and useful: fix at the source once, or fix at the symptom forever.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Invest disproportionately in specification.&lt;/strong&gt;&#xA;The spec is now the highest-leverage artifact in the pipeline, because it is the stage whose defects fan out the widest and whose fixes compound the longest.&#xA;A team that under-invests here suffers in every downstream stage, forever, at machine speed, and a team that over-invests here barely notices the downstream stages at all.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When you review, review the spec, not the code.&lt;/strong&gt;&#xA;Code review catches symptoms once, on the diff that happens to be in front of the reviewer.&#xA;Spec review prevents classes of symptoms from being generated at all, across every future diff.&#xA;An hour on the spec outranks an hour on the code, because the code is downstream of the spec and the spec constrains every diff that will ever be written from it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Keep an upstream ledger on incidents.&lt;/strong&gt;&#xA;When something breaks in production, record not just the code-level cause but the pipeline stage where the defect was actually born.&#xA;Over a quarter the pattern will show which upstream stages produce the most defects, and that is where investment pays back the most, because a single fix there removes a whole class of incidents.&lt;/p&gt;&#xA;&lt;p&gt;And when the model produces bad output in the same module twice, do not write a longer prompt.&#xA;Fix the module, or fix the spec that describes it, because as &lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; argues, the upstream artifacts are the model&amp;rsquo;s context, and bad output is the truest signal you will ever get about where that context is incoherent.&#xA;The model is showing you where the context fails.&#xA;The right response is to fix the source of the bad output, not to keep correcting it by hand.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lifecycle Runs One Way&#xA;    &lt;div id=&#34;the-lifecycle-runs-one-way&#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-lifecycle-runs-one-way&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Defects move downstream through the pipeline and multiply as they go.&#xA;Fixes can move upstream, and they multiply too, but in the opposite direction: one fix at the source prevents a thousand fixes at the symptom.&lt;/p&gt;&#xA;&lt;p&gt;The team that understands this spends its best hours at the top of the pipeline, writing specifications and architectures that make most downstream defects impossible.&#xA;The team that does not spends its best hours at the bottom, fixing code that the pipeline keeps regenerating from sources it never touches.&#xA;Both teams are busy.&#xA;Only one of them is getting durable work done.&#xA;&lt;strong&gt;In an era when the downstream stages execute themselves, the only engineering that compounds is the engineering done at the top of the pipeline. Everything below it is maintenance.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why automating generation relocates the constraint first to verification and then to specification, the relocation this article turns into a rule about where to fix&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-foundation-predicts-the-house-of-cards/&#34; &gt;The Foundation Predicts the House of Cards&lt;/a&gt; - the upstream artifacts (specification, architecture, tests, written conventions) as the foundation whose defects decide whether generated code stands up&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the compounding-versus-one-time distinction between specification and review that this article generalizes across the entire pipeline&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - specification named as the highest-leverage skill, which is the same conclusion reached from the team-process side&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - the upstream artifacts as the model&amp;rsquo;s context, the mechanism by which an upstream defect becomes a downstream code bug&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/learn-the-foundation-not-the-syntax/&#34; &gt;Learn the Foundation, Not the Syntax&lt;/a&gt; - the durable mental models that let an engineer trace a code symptom back to its upstream cause instead of patching it in place&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://doi.org/10.1109/2.962984&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Boehm and Basili, &amp;ldquo;Software Defect Reduction Top 10 List&amp;rdquo;&lt;/a&gt; - the finding that a defect fixed after delivery is often around a hundred times more expensive than one fixed at requirements, the original cost-of-fix curve&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://direct.mit.edu/books/oa-monograph-pdf/2280500/book_9780262298247.pdf&#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=direct.mit.edu&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Leveson, &amp;ldquo;Engineering a Safer World&amp;rdquo;&lt;/a&gt; - the argument that accidents trace to flawed upstream control structures rather than component failures, so the component is the symptom and the structure is the cause&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Theory of Constraints&amp;rdquo;&lt;/a&gt; - the pipeline framing in which improving one stage relocates the constraint rather than removing it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Shift-left_testing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Shift-left testing&amp;rdquo;&lt;/a&gt; - the existing industry term for moving quality earlier, framed here as a partial move that checks sooner without fixing at the origin&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Five_whys&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Five whys&amp;rdquo;&lt;/a&gt; - the practice of walking back from a symptom to its process cause before fixing, the root of the &amp;ldquo;fix the process, not the product&amp;rdquo; rule&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Andon_%28manufacturing%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Andon (manufacturing)&amp;rdquo;&lt;/a&gt; - the Toyota practice of stopping the line to fix the source of a defect rather than passing it downstream&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/No_Silver_Bullet&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;No Silver Bullet&amp;rdquo;&lt;/a&gt; - Brooks&amp;rsquo;s split between accidental and essential complexity, where most late-stage fixing is accidental work that better upstream artifacts would eliminate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Read the Commits, Not the Manual: What OpenClaw&#39;s Git History Reveals About Scaling a Project</title>
      <link>https://tomrochette.com/learnings-from-openclaw/</link>
      <pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learnings-from-openclaw/</guid>
      <category>open-source</category><category>software-engineering</category><category>git</category><category>llm</category><category>ai</category><category>code-review</category><category>agents</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The most revealing document a software project writes is not its &lt;code&gt;README&lt;/code&gt;, its &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;, or its architecture diagram.&#xA;It is its commit history, because the commit history is the one artifact the project cannot rewrite after the fact.&#xA;&lt;strong&gt;A process doc describes the project the maintainers wish they were running, and the commit log describes the project they are actually running, and the gap between the two is where you can find the most important lessons.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I spent time inside the git history of &lt;a href=&#34;https://github.com/openclaw/openclaw&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenClaw&lt;/a&gt;, a self-hosted personal AI assistant that talks to you across roughly two dozen messaging channels.&#xA;It is an extreme case, and extreme cases are the easiest to read.&#xA;In about seven months it accumulated over sixty-two thousand commits from more than three thousand contributors, which is somewhere close to two hundred and ninety commits a day, every day, since its first commit.&#xA;That is a throughput at which most projects would have become impossible to follow, and it did not.&#xA;The interesting question is why, and the commit history answers it more clearly than any roadmap could.&lt;/p&gt;&#xA;&lt;p&gt;This article is a reading of that history, and the throughline is a single observation that the data makes impossible to miss.&#xA;A project&amp;rsquo;s actual architecture is not the dependency graph of its packages.&#xA;It is the role structure of the people who land commits on it, and OpenClaw reveals that role structure with unusual clarity because it is large enough that the patterns survive any individual&amp;rsquo;s bad week.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The First Thing the Commits Show: Two Kinds of Maintainer&#xA;    &lt;div id=&#34;the-first-thing-the-commits-show-two-kinds-of-maintainer&#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-first-thing-the-commits-show-two-kinds-of-maintainer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Run a contributor breakdown on any mature project and you will find that the top commit counts are dominated by one or two names.&#xA;OpenClaw is no different.&#xA;The founding maintainer, Peter Steinberger, is listed in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; as &amp;ldquo;Benevolent Dictator,&amp;rdquo; and he accounts for well over half of all commits in the repository, roughly three times the next contributor.&#xA;The second name down is Vincent Koc, listed as owning &amp;ldquo;Agents, Telemetry, Hooks, Security.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;You can read their titles and learn nothing, or you can read their commits and learn everything.&#xA;&lt;strong&gt;The commit prefix and the merge behavior are the two signals that tell you what a maintainer actually does all day, and at OpenClaw they tell two completely different stories.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Roughly ninety-five percent of Peter Steinberger&amp;rsquo;s recent commits land straight on &lt;code&gt;main&lt;/code&gt; with no pull request at all.&#xA;His work spans every conventional-commit prefix in roughly equal measure: &lt;code&gt;test:&lt;/code&gt;, &lt;code&gt;fix:&lt;/code&gt;, &lt;code&gt;docs:&lt;/code&gt;, &lt;code&gt;ci:&lt;/code&gt;, &lt;code&gt;refactor:&lt;/code&gt;, &lt;code&gt;perf:&lt;/code&gt;.&#xA;His scopes are the product itself, the agents, the gateway, the release machinery, the high-traffic channels.&#xA;Read his last two hundred commits and you are watching someone expand the product, exploring whatever he finds interesting that week, shipping releases, writing the docs for features he just invented, and rarely pausing to open a pull request against his own work.&lt;/p&gt;&#xA;&lt;p&gt;Vincent Koc&amp;rsquo;s history is the opposite pattern.&#xA;His recent work is almost sixty percent &lt;code&gt;fix&lt;/code&gt; commits, and his scopes are a completely different surface: end-to-end tests, the QA lab, scripts, CI, and a scope that appears nowhere near the top of Peter&amp;rsquo;s list, &lt;code&gt;deadcode&lt;/code&gt;.&#xA;He opens pull requests.&#xA;He uses the review process.&#xA;Where Peter&amp;rsquo;s commits read as exploration, Vincent&amp;rsquo;s read as consolidation.&lt;/p&gt;&#xA;&lt;p&gt;The contrast between Peter&amp;rsquo;s history and Vincent&amp;rsquo;s is the observation that triggered this article, and the temptation is to read it as a process failure on Peter&amp;rsquo;s part, the founder cutting corners, ignoring the queue, doing whatever he wants.&#xA;That reading is wrong, and it misses the point.&#xA;&lt;strong&gt;The two patterns are not the same job done at different levels of discipline.&#xA;They are two different jobs, and a project of this size needs both of them to survive.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Benevolent Dictator and the Steward&#xA;    &lt;div id=&#34;the-benevolent-dictator-and-the-steward&#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-benevolent-dictator-and-the-steward&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Strip the moral framing away and what you are looking at is a role separation so fundamental that every healthy long-lived project eventually rediscovers it, whether it documents the split or not.&lt;/p&gt;&#xA;&lt;p&gt;One role is the visionary, the person whose job is to expand the product&amp;rsquo;s capabilities.&#xA;They build features that no user has asked for yet, because no user knows to ask for them.&#xA;They write docs in the same commit as the code, because to them the doc is part of the feature.&#xA;They commit straight to &lt;code&gt;main&lt;/code&gt; because the bottleneck they are optimizing for is their own momentum, and stopping to open a pull request against themselves would be pure ceremony.&#xA;The visionary does not read the issue tracker for direction.&#xA;They read it, when they read it at all, for confirmation that the thing they already wanted to build has some demand.&#xA;Their commits are the product roadmap, written as the work happens.&lt;/p&gt;&#xA;&lt;p&gt;The other role is the steward, the person whose job is to keep the project stable as the visionary expands it.&#xA;They fix the bugs the new features introduced.&#xA;They write the end-to-end tests that prove the feature actually works under load.&#xA;They remove the dead code the visionary left behind when they pivoted.&#xA;They route pull requests from the long tail of contributors through review, because someone has to, and the visionary will not.&#xA;Their commits are almost entirely &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;, and they open pull requests not out of greater virtue but because their work touches shared, critical surface where a mistake costs everyone.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The visionary produces the disorder that makes the project grow, and the steward does the work that keeps the disorder from being fatal, and neither role is superior to the other.&lt;/strong&gt;&#xA;A project with only visionaries ships exciting broken things that no one can depend on.&#xA;A project with only stewards stays clean and slowly dies, because no one is building the thing anyone wants to use next.&#xA;OpenClaw has both, in volume, and that is the first and most important reason it has not collapsed under its own commit rate.&lt;/p&gt;&#xA;&lt;p&gt;The practical lesson, if you run a project, is to name this split out loud instead of letting it generate resentment in silence.&#xA;The most common failure mode is a steward who slowly concludes that the visionary is careless, and a visionary who slowly concludes that the steward is a brake on progress, when in fact each is doing exactly the job the other cannot.&#xA;Peter&amp;rsquo;s direct-to-&lt;code&gt;main&lt;/code&gt; habit is not a defect Vincent is tolerating.&#xA;It is the signature of a role, and recognizing it as a role is what stops it from becoming a feud.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Specialist Roles That Only Appear at Scale&#xA;    &lt;div id=&#34;the-specialist-roles-that-only-appear-at-scale&#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-specialist-roles-that-only-appear-at-scale&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Past the two primary roles, the commit history reveals two more contributors whose work is so specialized it would be invisible in a smaller project, and whose existence is itself a signal of size.&#xA;&lt;strong&gt;A project small enough for everyone to do a bit of everything has no specialists, and the appearance of specialists is a sign of a project that has grown past the point where generalists can cover the surface.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The third most prolific contributor, going by Shakker, has roughly four thousand commits, and about two thirds of them are &lt;code&gt;test:&lt;/code&gt;.&#xA;There is almost no feature work in the history.&#xA;Shakker is a person whose entire contribution is the test fixtures, the regression coverage that lets everyone else move fast without the product silently breaking.&#xA;A visionary cannot do this work, because it requires the patience to write the hundredth test for a path the fortieth test already almost covered, and a steward is usually too busy handling urgent fixes to write tests in advance.&#xA;The test author is a third role, and it is the role that converts the steward&amp;rsquo;s fixes from one-off patches into guarantees that do not have to be re-earned.&lt;/p&gt;&#xA;&lt;p&gt;Further down the list, Tak Hoffman has a thousand-plus commits, and he owns a scope that appears in almost nobody else&amp;rsquo;s history: &lt;code&gt;(regression)&lt;/code&gt;.&#xA;Of the hundred-plus commits in the repository tagged &lt;code&gt;fix(regression):&lt;/code&gt;, almost all of them are his.&#xA;Tak is a regression hunter, someone whose focus is not bugs in general but bugs in things that used to work, the specific class of defect that damages user trust faster than any missing feature can earn it.&#xA;Regression hunting is a discipline of its own, because it requires holding a mental model of how the system used to behave and noticing when a change has quietly violated it, and it is the kind of work that only gets staffed deliberately once a project is large enough that the founding maintainer can no longer hold the whole behavior graph in their head.&lt;/p&gt;&#xA;&lt;p&gt;The lesson is that the visionary-and-steward split is a starting frame, not a complete one.&#xA;As a project grows, the roles keep subdividing, and each subdivision is a person whose commits tell you, by their narrowness, exactly what the project is now too large to handle with generalists.&#xA;Read the contributors with unusual scope concentrations and you read the project&amp;rsquo;s scaling problems written out in advance.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Second Thing the Commits Show: The Ownership Table Is the Architecture&#xA;    &lt;div id=&#34;the-second-thing-the-commits-show-the-ownership-table-is-the-architecture&#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-second-thing-the-commits-show-the-ownership-table-is-the-architecture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Three thousand contributors is a number at which coordination by conversation breaks down completely.&#xA;You cannot have a meeting with three thousand people.&#xA;You cannot maintain a shared mental model with three thousand people.&#xA;The only way a project absorbs that many contributors without a backlog of unmerged pull requests is to partition the work so thoroughly that most contributors never need to talk to each other at all.&lt;/p&gt;&#xA;&lt;p&gt;OpenClaw partitions the work with an explicit ownership table, and it is the most underrated document in the repository.&#xA;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt; lists roughly thirty maintainers, each with a named specialty: one owns Telegram, one owns the iOS app, one owns Memory, one owns the Discord subsystem, one owns Chinese channels and nothing else.&#xA;The instruction to contributors is blunt: &amp;ldquo;Do not guess who to tag,&amp;rdquo; route through the ownership list, the label automation, and &lt;code&gt;CODEOWNERS&lt;/code&gt; instead.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When the surface area of a project exceeds what any one person can hold in their head, the only scalable architecture is a partition, and the partition has to be written in a file, not stored only in people&amp;rsquo;s memories.&lt;/strong&gt;&#xA;The plugin layout reinforces the partition from the code side.&#xA;There are around a hundred and forty-five extensions and only twenty-one core packages, and the project&amp;rsquo;s own vision document states the principle outright: core stays lean, capabilities ship as plugins, and the bar for adding an optional capability to core is &amp;ldquo;intentionally high.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The plugin partition is the same insight as the role split, applied at the level of the codebase rather than the people.&#xA;You cannot hold one hundred and forty-five channel adapters in your head, but you do not have to, because each one is owned by one person who only has to hold one in theirs.&#xA;The partition is the architecture, and the ownership table is the partition made durable.&#xA;A project that grows past a few active contributors without writing this table down is a project that will discover, painfully, that the absence of an ownership map is itself an architecture, an architecture in which the loudest reviewer owns everything by default.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Third Thing the Commits Show: Every Rule Is a Scar on Reviewer Time&#xA;    &lt;div id=&#34;the-third-thing-the-commits-show-every-rule-is-a-scar-on-reviewer-time&#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-third-thing-the-commits-show-every-rule-is-a-scar-on-reviewer-time&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The contribution rules in OpenClaw are unusually specific, and a first-time reader will find some of them almost hostile.&#xA;There is a hard cap of twenty open pull requests per author, enforced automatically, past which your pull requests are labeled and closed.&#xA;Refactor-only pull requests are refused outright.&#xA;Test-only or CI-only pull requests that chase a known &lt;code&gt;main&lt;/code&gt; failure are refused outright.&#xA;Pull requests over roughly five thousand changed lines are reviewed &amp;ldquo;only in exceptional circumstances.&amp;rdquo;&#xA;One pull request must equal one issue or topic.&lt;/p&gt;&#xA;&lt;p&gt;Taken in isolation, the rules read as pettiness.&#xA;Read as a group they are responses to one specific, recurring problem, and the problem is always the same.&#xA;&lt;strong&gt;Every one of these rules is a response to something that once drained reviewer attention without producing proportional value, because reviewer attention is the single scarcest, least-elastic resource a project at this scale has.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The visionary can always produce more commits.&#xA;The contributor pool can always produce more pull requests.&#xA;Neither of those can produce more maintainer-hours for review, and so the entire rule set is engineered to protect that one bottleneck.&#xA;The twenty-pull-request cap exists because batch-opened pull requests impose review cost in proportion to their number, not their value.&#xA;The ban on refactor-only work exists because a refactor that changes no behavior consumes review to confirm it changes no behavior, which is review spent proving a negative.&#xA;The line limit exists because a five-thousand-line diff cannot actually be reviewed by a human, it can only be rubber-stamped, and rubber-stamping is the failure mode the gate is supposed to prevent.&lt;/p&gt;&#xA;&lt;p&gt;The rule set is the theory of constraints applied to a volunteer workforce.&#xA;When you cannot add capacity at the bottleneck, the only option left is to reduce the demand arriving at it, and you reduce demand by making rules that reject the classes of work that waste the bottleneck&amp;rsquo;s time.&#xA;A rule that reads as harsh to a contributor is almost always a rule that reads as triage to a maintainer who has been doing the job long enough to know which inputs are waste.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Fourth Thing the Commits Show: They Dogfood the Future of Development&#xA;    &lt;div id=&#34;the-fourth-thing-the-commits-show-they-dogfood-the-future-of-development&#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-fourth-thing-the-commits-show-they-dogfood-the-future-of-development&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;OpenClaw builds an AI agent, and it builds it with AI agents, and the commit history makes the second fact as visible as the first.&lt;/p&gt;&#xA;&lt;p&gt;Bot accounts appear throughout the contributor list.&#xA;The contribution guide treats AI-authored pull requests as first-class citizens, requiring only that they be marked, with a checklist that asks for the model, the prompt or session log, and a human confirmation that the code is understood.&#xA;Codex review is not an experiment: it is described as the &amp;ldquo;current highest standard of AI review,&amp;rdquo; expected to run on every pull request and to be addressed by the author before a human reviewer is ever bothered.&lt;/p&gt;&#xA;&lt;p&gt;The reason the dogfooding matters is not that it is futuristic.&#xA;The project is a working answer to the question every team is now trying to solve, which is how to integrate generated code without being overwhelmed by it.&#xA;&lt;strong&gt;The OpenClaw answer is not to ban generated contributions and not to blindly trust them, but to treat their provenance as a required signal and to route that signal into both the review and the reviewer.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;OpenClaw&amp;rsquo;s approach is the provenance argument I made, from the maintainer&amp;rsquo;s side, in &lt;a href=&#34;https://tomrochette.com/triaging-open-source-pull-requests/&#34; &gt;Triaging Open Source Pull Requests&lt;/a&gt;: the one piece of information a reviewer most needs about a modern pull request is which model produced it and what prompt produced it, because that is the information that tells you which blind spots to check for.&#xA;OpenClaw asks for the model and the prompt, up front, in the template, and it pairs the request with an automated review pass that can be calibrated against the disclosed model.&#xA;That pairing, disclosure plus targeted automated review, is the most credible workflow I have seen for accepting generated code at volume, and it is sitting right there in a &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; that most projects have not yet caught up to.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How to Read a Project This Way Yourself&#xA;    &lt;div id=&#34;how-to-read-a-project-this-way-yourself&#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;#how-to-read-a-project-this-way-yourself&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The method that produced these observations is generalizable, and it costs you nothing but a terminal.&#xA;You do not need access to a project&amp;rsquo;s Slack, its planning board, or its maintainers&amp;rsquo; intentions.&#xA;You need its git history and three commands.&lt;/p&gt;&#xA;&lt;p&gt;Start with the contributor breakdown, &lt;code&gt;git shortlog -sne&lt;/code&gt;, and look at the ratio between the top name and everyone else.&#xA;A project whose top contributor&amp;rsquo;s commit count is far larger than everyone else&amp;rsquo;s is a project whose direction is set by one person, and everything else is execution.&#xA;A project whose top contributors are close in volume is a project run by committee, and its commits will read as negotiation rather than vision.&lt;/p&gt;&#xA;&lt;p&gt;Then take the top two or three names and compare their conventional-commit prefixes, &lt;code&gt;git log --author=... --format=%s&lt;/code&gt;, grouped by prefix.&#xA;The ratio of &lt;code&gt;fix&lt;/code&gt; to &lt;code&gt;feat&lt;/code&gt;, the presence or absence of &lt;code&gt;docs&lt;/code&gt; and &lt;code&gt;test&lt;/code&gt;, the dominance of &lt;code&gt;refactor&lt;/code&gt; or &lt;code&gt;chore&lt;/code&gt;, these tell you who builds and who maintains, and they tell you in five minutes what would take a month of standups to learn.&#xA;A maintainer whose commits are sixty percent &lt;code&gt;fix&lt;/code&gt; is a steward.&#xA;A maintainer whose commits span every prefix evenly is a visionary.&#xA;&lt;strong&gt;The prefix distribution is a sign of a role, and reading it is faster and more reliable than reading anyone&amp;rsquo;s job title.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally, count how many of each top contributor&amp;rsquo;s commits reference a pull request versus landing straight on &lt;code&gt;main&lt;/code&gt;.&#xA;That ratio is the governance signal.&#xA;A project where even the founder routes through pull requests is a project run by process.&#xA;A project where one person lands on &lt;code&gt;main&lt;/code&gt; freely and the rest use pull requests is a project that has, whether it admits it or not, a benevolent dictator and a steward, and the rest of the contribution rules will make sense once you see the split.&lt;/p&gt;&#xA;&lt;p&gt;Run this analysis on your own project before you run it on anyone else&amp;rsquo;s.&#xA;You may find that the role structure you assume you are running is not the one your commits describe, and the gap is the first thing worth fixing.&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;p&gt;&lt;strong&gt;If you maintain a project, take an hour and read your own commit history the way this article reads OpenClaw&amp;rsquo;s.&lt;/strong&gt;&#xA;Find your visionary and your steward, and if you do not have both, that is the single most important hiring or delegation decision in front of you.&#xA;A project with no steward is slowly declining under a growing backlog of unmerged fixes and unread pull requests, and no amount of feature velocity will save it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write down your ownership table, explicitly, in a file, even if it is just three names today.&lt;/strong&gt;&#xA;The day you have thirty contributors is too late to invent the partition, because by then the loudest reviewer will have quietly become the owner of everything, and reversing that is a political problem rather than a documentation one.&#xA;The partition is cheap to write early and expensive to write late.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Audit your contribution rules as a set, not individually.&lt;/strong&gt;&#xA;Every rule that reads as harsh to a contributor should correspond to a specific class of work that once wasted your review time.&#xA;Any rule you cannot trace back to a specific class of wasted review time is a rule that is probably driving contributors away without being worth its cost, and it is a candidate for deletion.&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;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; - the team-codebase argument that standards must be encoded where work passes through them, which is the lens this article uses to read OpenClaw&amp;rsquo;s rules as reviewer-time conservation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/triaging-open-source-pull-requests/&#34; &gt;Triaging Open Source Pull Requests&lt;/a&gt; - the provenance argument this article extends: when the reviewer knows which model wrote a pull request, they know which blind spots to check, and OpenClaw&amp;rsquo;s disclosure template is a working implementation of it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - the case for gating on the blast radius of a change rather than the existence of a pull request, which is the principle behind OpenClaw&amp;rsquo;s line limits and its refusal of refactor-only work&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why a machine-checked constraint outperforms a tired human scan, the premise behind treating Codex review as the default standard&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - which friction is structural and which is waste, the distinction that explains why OpenClaw&amp;rsquo;s harsh rules are the former and not the latter&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://github.com/openclaw/openclaw&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenClaw on GitHub&lt;/a&gt; - the repository whose commit history, CONTRIBUTING.md, and VISION.md are the primary sources for every observation in this article&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Theory of Constraints&amp;rdquo;&lt;/a&gt; - Goldratt&amp;rsquo;s framing for why you protect the bottleneck rather than adding effort elsewhere, the basis for reading OpenClaw&amp;rsquo;s rules as reviewer-time conservation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Benevolent_dictator_for_life&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Benevolent dictator for life&amp;rdquo;&lt;/a&gt; - the canonical name for the role OpenClaw&amp;rsquo;s commit history reveals in its top contributor, independent of any title&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Team Maturity Explains the Friction, the Foundation Predicts the House of Cards</title>
      <link>https://tomrochette.com/the-foundation-predicts-the-house-of-cards/</link>
      <pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-foundation-predicts-the-house-of-cards/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>team-management</category><category>productivity</category><category>devops</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;In the age of LLMs, the work that matters at your job is no longer adopting the tools.&#xA;It is raising the velocity at which your team can ship features without turning the software it builds into a house of cards.&#xA;When two teams hold the same tools and get wildly different outcomes, the first thing to study is the team itself, and Bruce Tuckman&amp;rsquo;s model of group maturity will explain a large share of the gap.&#xA;&lt;strong&gt;But it will not explain all of it, because team maturity governs how easily a team absorbs a new practice, not whether the software that practice produces stays standing.&lt;/strong&gt;&#xA;Maturity is necessary and it is not sufficient, and most organizations are diagnosing only half the problem.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Job Is Velocity Without Debt&#xA;    &lt;div id=&#34;the-job-is-velocity-without-debt&#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-job-is-velocity-without-debt&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Raw velocity stopped being interesting the year a model could draft a feature in an afternoon.&#xA;Anyone can go fast now.&#xA;The constraint that separates serious teams from reckless ones is sustainable velocity, the ability to ship quickly and also keep the system survivable as it grows.&lt;/p&gt;&#xA;&lt;p&gt;The distinction is not new, and AI did not invent it.&#xA;The &lt;a href=&#34;https://dora.dev/&#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=dora.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DORA research program&lt;/a&gt; spent years measuring engineering organizations along two independent axes, throughput and stability, and its central finding was that you have to track both because they are not the same thing.&#xA;Throughput is lead time and deployment frequency, how fast work gets out.&#xA;Stability is change failure rate and time to restore, how often what you ship breaks and how long it takes to recover when it does.&#xA;A team can score high on throughput and low on stability, and that team is not fast.&#xA;It is a house of cards being shuffled quickly, and the cost arrives as &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;rework&lt;/a&gt;, outages, and a codebase nobody is willing to touch.&lt;/p&gt;&#xA;&lt;p&gt;LLMs increase the throughput axis for free.&#xA;They do nothing for the stability axis unless your engineering system is built to hold them accountable.&#xA;&lt;strong&gt;So the whole question of which teams ship effectively with LLMs collapses into a narrower one: which teams can absorb the throughput multiplier without their stability metrics collapsing?&lt;/strong&gt;&#xA;That is a property of the team and a property of the code, and the team part is only half of the problem.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Tuckman Explains So Much of the Adoption Gap&#xA;    &lt;div id=&#34;why-tuckman-explains-so-much-of-the-adoption-gap&#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;#why-tuckman-explains-so-much-of-the-adoption-gap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before moving to the other reasons, it is worth being realistic about how much Tuckman&amp;rsquo;s &lt;a href=&#34;https://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;stages of group development&lt;/a&gt; actually explain, because the answer is a lot.&lt;/p&gt;&#xA;&lt;p&gt;A team in the performing stage adopts a new AI practice with low friction for reasons that are structural, not cultural.&#xA;Its members have already negotiated how decisions get made, so &amp;ldquo;which code review workflow do we use now that the model writes most of the code?&amp;rdquo; gets resolved in one meeting instead of three.&#xA;Its conventions are settled and shared, so when an engineer introduces a prompt template or a skill, the rest of the team can tell whether it fits the way they already work.&#xA;It has the psychological safety that &lt;a href=&#34;https://rework.withgoogle.com/print/guides/5727380657274880/&#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=rework.withgoogle.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Project Aristotle&lt;/a&gt; identified as the strongest predictor of team effectiveness, which means an engineer can say &amp;ldquo;the model&amp;rsquo;s output is wrong here and I do not understand why&amp;rdquo; without that admission costing them status.&lt;/p&gt;&#xA;&lt;p&gt;A team still in forming or storming has none of these assets, and so it pays the cost of adoption on every change.&#xA;As I argued in &lt;a href=&#34;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt;, a team that has not yet built a repeatable process for resolving disagreements will relitigate the same practice debate over and over, and the debate is rarely about the practice.&#xA;It is a proxy for unresolved questions about whose judgment the team trusts.&#xA;LLM adoption surfaces a dozen of these questions at once, because it touches review, testing, specification, ownership, and onboarding simultaneously.&#xA;A performing team processes all those questions in the background.&#xA;A storming team is overwhelmed by all of them.&lt;/p&gt;&#xA;&lt;p&gt;So if your observation is &amp;ldquo;some teams picked up the new AI workflows easily and others fought about it for two quarters,&amp;rdquo; Tuckman is very likely your explanation.&#xA;&lt;strong&gt;Team maturity is the dominant predictor of adoption friction, and adoption friction is the dominant predictor of whether a team even gets to the starting line.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;What maturity does not predict is what happens after the team starts shipping.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The House of Cards Is Predicted by the Foundation&#xA;    &lt;div id=&#34;the-house-of-cards-is-predicted-by-the-foundation&#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-house-of-cards-is-predicted-by-the-foundation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the gap maturity cannot close.&#xA;A mature, high-trust, psychologically safe team sitting on top of a brittle codebase with no tests and no specification discipline will still ship a house of cards.&#xA;It will just do so with impressive cohesion, minimal interpersonal drama, and a strong retrospective culture.&#xA;The team dynamics are good and the software is still wrong, because the things that decide whether generated code stays standing are properties of the engineering system, and those properties vary somewhat independently of how well the team gets along.&lt;/p&gt;&#xA;&lt;p&gt;If you want to know why two mature teams with the same tools ship software of very different durability, look at the foundation.&#xA;The factors below are not equal in importance.&#xA;Two of them, verification and codebase health, decide whether the software stands up at all, and the other four only improve the quality of what gets built.&#xA;No amount of strength in the four can compensate for weakness in the two, because the two are what keep the structure standing.&#xA;&lt;strong&gt;For shipping without a house of cards, verification and codebase health outrank team maturity, and the rest exist to support them.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The two factors that outrank maturity&#xA;    &lt;div id=&#34;the-two-factors-that-outrank-maturity&#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-two-factors-that-outrank-maturity&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;These are the structural ones.&#xA;A team weak on either of them ships a house of cards regardless of how mature it is, and a team strong on both can survive even rough team dynamics.&#xA;Everything else in the foundation eventually feeds into one of these two.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;Verification is the throttle&#xA;    &lt;div id=&#34;verification-is-the-throttle&#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;#verification-is-the-throttle&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;Once code writes itself, the bottleneck moves to checking whether the code is correct, and that move is the central claim of &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;.&#xA;Verification is where the stability axis lives, and verification is why two teams with identical throughput can have radically different change failure rates.&lt;/p&gt;&#xA;&lt;p&gt;The team with a fast, trustworthy test suite, a CI pipeline that catches actual regressions, and a short feedback loop can let the model generate aggressively, because it can verify cheaply.&#xA;Every generation is a hypothesis and the test suite is the experiment, and the cost of a wrong generation is seconds.&#xA;The team that verifies by reading the diff, or by running the feature once in a staging environment, cannot afford to let the model run.&#xA;It hits a ceiling where the human reviewer becomes the bottleneck, and either it slows down to stay safe or it speeds up and ships unverified code.&lt;/p&gt;&#xA;&lt;p&gt;The difference between those two teams is the DORA stability axis measured in engineering practice.&#xA;&lt;strong&gt;The team that ships safely with LLMs is usually not the team with the best prompters.&lt;/strong&gt;&#xA;It is the team with the best test suite and the fastest signal, because that team can convert the throughput multiplier into stable throughput instead of into rework.&#xA;Investing in verification infrastructure is now the highest-return thing a team can do to raise its LLM shipping velocity, which is a counterintuitive claim only if you are still measuring velocity as lines produced rather than features landed without rollback.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;The codebase is the model&amp;rsquo;s context&#xA;    &lt;div id=&#34;the-codebase-is-the-models-context&#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-codebase-is-the-models-context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;The other structural factor is that the LLM does not generate code in a vacuum.&#xA;It generates code as a continuation of the context it is given, and the largest piece of context is the codebase itself.&#xA;A clean, well-factored codebase with clear naming, consistent patterns, and a single way of doing each thing is excellent context, and the model faithfully reproduces its conventions.&#xA;A tangled codebase with five competing styles, dead abstractions, and comments that contradict the code is terrible context, and the model faithfully extends the mess.&#xA;As I argued in &lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt;, the context is the entire mechanism by which a frozen set of weights produces behavior relevant to your situation, and the codebase is the part of the context you control.&lt;/p&gt;&#xA;&lt;p&gt;The codebase context is why the same model, the same prompt, and the same engineer produce different quality output on different codebases.&#xA;The codebase is doing most of the work, and a codebase that is already a house of cards is a context that asks the model to build more cards.&#xA;&lt;strong&gt;You cannot hand an LLM a weak codebase and get back a strong one; you get back more weak code.&lt;/strong&gt;&#xA;The teams shipping safely are, more often than they realize, the teams whose codebase was already safe to extend, and the LLM is merely making that pre-existing health visible at higher speed.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The factors that strengthen the foundation&#xA;    &lt;div id=&#34;the-factors-that-strengthen-the-foundation&#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-factors-that-strengthen-the-foundation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The next four factors do not replace the first two.&#xA;They decide how much wrong output the verification layer has to catch, and how high the ceiling on the best possible generation sits.&#xA;A team that is strong here and weak on verification still ships a house of cards, just a slightly smaller one.&#xA;A team that is weak here and strong on verification stays safe, but slowly, because its loop has to reject so much bad output.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;Specification discipline separates amplifiers from noise&#xA;    &lt;div id=&#34;specification-discipline-separates-amplifiers-from-noise&#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;#specification-discipline-separates-amplifiers-from-noise&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;An LLM is a multiplier on the quality of the instructions it receives, which means the teams that win are the ones that produce high-quality instructions at scale.&#xA;This is specification, and it is the skill that &lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; names as the highest-leverage capability in the current era.&lt;/p&gt;&#xA;&lt;p&gt;A team that writes a precise specification before it prompts, one that defines what done means, which invariants must hold, and which edge cases matter, gets an LLM that behaves like an effective pair programmer.&#xA;A team that prompts first and specifies never gets a hallucination engine that produces plausible code solving the wrong problem, and the wrongness is often invisible until production.&#xA;Specification is also where the human bottleneck lives now, because writing a precise spec is hard cognitive work that the model cannot do for you until you have done the thinking it depends on.&#xA;&lt;strong&gt;Teams that institutionalize specification, through templates, through review of the spec before the implementation, through a skill that enforces the steps, pull away from teams that treat the prompt as the spec, and they pull away fast.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;Conventions have to be written down to be inherited&#xA;    &lt;div id=&#34;conventions-have-to-be-written-down-to-be-inherited&#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;#conventions-have-to-be-written-down-to-be-inherited&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;A performing team has settled conventions, and that is exactly what makes the team mature.&#xA;But settled conventions that live only inside the senior engineers&amp;rsquo; heads are invisible to two important workers: the new hire, and the LLM.&#xA;Neither of them absorbed the conventions by exposure.&lt;/p&gt;&#xA;&lt;p&gt;The teams that ship consistent, safe output at scale are the ones that have externalized their conventions into a form the model actually reads.&#xA;That means lint rules the CI enforces, architecture decision records that capture why a choice was made, contribution guides that name the patterns to reuse, and, most powerfully, &lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;skills&lt;/a&gt; that encode a team&amp;rsquo;s process as executable steps the agent follows on every run.&#xA;A convention in a head is advice the model will ignore.&#xA;A convention in a skill or a lint rule is a constraint the model has to satisfy.&lt;/p&gt;&#xA;&lt;p&gt;Externalizing conventions is the mechanism by which a mature team scales its maturity into the model.&#xA;A storming team that somehow wrote its conventions down would get more out of the LLM than a performing team that left them tacit, which is a genuine inversion and a useful diagnostic.&#xA;&lt;strong&gt;If your team is mature and your LLM output is still inconsistent, the conventions are probably in the wrong place.&lt;/strong&gt;&#xA;They are in people, and they need to be in files.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;Review is a backstop, not the mechanism&#xA;    &lt;div id=&#34;review-is-a-backstop-not-the-mechanism&#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;#review-is-a-backstop-not-the-mechanism&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;The instinct when a tool speeds up code production is to use it to speed up code review, and on this point the instinct is closer to right than wrong, for a reason that is easy to miss.&lt;/p&gt;&#xA;&lt;p&gt;Code review is a one-time signal.&#xA;It catches what one reviewer notices, once, on the diff in front of them, while they happen to be alert.&#xA;A specification prevents the whole class of issue from reaching implementation, and a test catches the same bug on every future run, for as long as the codebase exists.&#xA;As &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; argues, an hour spent improving the specification outranks an hour spent reviewing the output, because the specification compounds and the review does not.&#xA;&lt;strong&gt;For the purpose of shipping without a house of cards, specification is the structural lever, and review is the non-compounding backstop behind it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The backstop still has a job, but it is narrower than the one review used to claim.&#xA;With generated code the reviewer provides the only judgment in the loop, so a light, intent-focused check still catches the occasional wrong assumption before it ships.&#xA;What it does not do is scale.&#xA;If the model produces ten changes a day, ten hours of human review is not a process that survives, and the right response to a repeated class of review comment is to encode it as an automated gate so it never depends on a human noticing again.&#xA;The teams that ship safely let the model handle style, keep a thin intent check as the backstop, and spend the freed review hours writing better specifications.&#xA;The teams that ship a house of cards inverted this, keeping review heavy while starving the specification that actually prevents the cards.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;Domain depth and the discipline to build less&#xA;    &lt;div id=&#34;domain-depth-and-the-discipline-to-build-less&#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;#domain-depth-and-the-discipline-to-build-less&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;Both of the following are judgments the model cannot make for you: what the software should do, and whether it should exist.&lt;/p&gt;&#xA;&lt;p&gt;On the first judgment, the model produces code that is technically correct and strategically wrong, faster than ever, when nobody on the team deeply understands the business context.&#xA;Deciding whether a feature should exist, and what form it should take, is the part of the pipeline AI cannot do, and it is the bottleneck the throughput multiplier pushes you into, exactly as the shifting bottleneck predicts.&#xA;A team with deep domain ownership extends its system coherently.&#xA;A team spread thin across too many concerns generates five services where one would do, and each of them is a card.&lt;/p&gt;&#xA;&lt;p&gt;On the second judgment, cheap implementation makes overbuilding the default temptation.&#xA;Every generated feature adds opportunities for bugs, cognitive load, and future constraints, and the cost of maintaining a feature never approached zero the way the cost of writing it did.&#xA;The team with the discipline to say &amp;ldquo;we do not need this, ship the smaller thing&amp;rdquo; survives longer than the team that ships everything the model can draft, and that discipline is a product judgment that maturity does not produce on its own.&#xA;It comes from somewhere else, usually from someone in the room who has seen the cost of feature bloat before and is willing to push back against it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How Maturity and Foundation Interact&#xA;    &lt;div id=&#34;how-maturity-and-foundation-interact&#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;#how-maturity-and-foundation-interact&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fair synthesis is that these two layers reinforce each other, and the most effective teams are strong on both, but they fail in characteristically different ways.&lt;/p&gt;&#xA;&lt;p&gt;A performing team on a clean foundation with strong tests and written conventions is the team that wins this era.&#xA;It absorbs new AI practices without friction, and when it ships, the foundation catches what the model gets wrong.&#xA;A performing team on a brittle foundation fails in a way it cannot see, because the team dynamics are good and so nobody is arguing, and the stability metrics degrade quietly until a production incident makes them visible.&#xA;A storming team on a clean foundation still wastes most of its energy on the wrong fights, but its code tends to survive the fights because the foundation holds.&#xA;A storming team on a brittle foundation fails loudly and fast, which is at least easy to diagnose.&lt;/p&gt;&#xA;&lt;p&gt;The trap is to read every symptom as the layer you already know how to fix.&#xA;Engineering management tends to diagnose everything as team dynamics, because that is the toolkit it has, and so it sends a brittle-foundation team to a retrospective when what it needs is a test suite.&#xA;Engineering teams tend to diagnose everything as tooling, because that is the toolkit they have, and so they adopt a new model when what they need is a written convention.&#xA;&lt;strong&gt;The binding constraint is usually the layer you are not looking at, and maturity is very good at hiding problems in the foundation because a mature team does not complain about them until they break.&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;p&gt;If you lead a team and want to know whether you are shipping features or shipping cards, a few concrete moves separate the diagnosis from the guesswork.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Measure both DORA axes, not just throughput.&lt;/strong&gt;&#xA;If your deployment frequency is rising and your change failure rate or time to restore is rising with it, you are not getting faster.&#xA;You are getting more volatile, and the LLM is the reason.&#xA;The stability metrics are the house-of-cards indicator, and they are free to collect.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Treat the codebase as context and pay down the part the model keeps getting wrong.&lt;/strong&gt;&#xA;If the LLM consistently produces bad output in one module, that module is bad context, and the fix is to refactor the module, not to write a longer prompt.&#xA;The model is telling you where your code is incoherent, because incoherent code is exactly what it reproduces worst.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write your conventions down somewhere the model reads them.&lt;/strong&gt;&#xA;A skill, a contribution guide, a lint rule, an architecture decision record, anything that moves a standard out of a head and into the execution path.&#xA;The test is whether a new engineer and a fresh agent both produce work that matches the team&amp;rsquo;s patterns on day one without being told.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Keep a thin, intent-level review as a backstop and let the model own style.&lt;/strong&gt;&#xA;If your review comments are still about formatting, you are spending human attention on the part the model already fixed.&#xA;Reallocate those hours into specification, which is the lever that compounds.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write the specification before the prompt, every time.&lt;/strong&gt;&#xA;The spec is the highest-leverage artifact in the pipeline now, and the team that treats it as optional is the team whose LLM output drifts toward plausible-and-wrong.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Team That Wins&#xA;    &lt;div id=&#34;the-team-that-wins&#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-team-that-wins&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The teams that win this era are easy to misread.&#xA;They look like the most mature teams, and they often are mature, but the maturity is doing a specific job.&#xA;It is letting them adopt new practices without wasting energy, so that they can spend that energy on the foundation that actually decides whether the software stands up.&lt;/p&gt;&#xA;&lt;p&gt;Maturity is how you remove the friction of getting started.&#xA;The codebase, the tests, the specifications, the written conventions, and the intent-level review are how you keep the result from collapsing as it grows.&#xA;&lt;strong&gt;Study your teams, because Tuckman will tell you a lot.&lt;/strong&gt;&#xA;&lt;strong&gt;Then study the code they are standing on, because that is what determines whether the velocity they have earned is velocity they get to keep.&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;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - which processes are worth keeping and which to eliminate once execution is cheap, including the case for specification as the highest-leverage skill&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why automating production relocates the constraint to verification, the layer where the house of cards is built or caught&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt; - how written skills encode a team&amp;rsquo;s process so the model and the new hire inherit the same standards&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt; - the forming-stage mechanics that make team maturity the dominant predictor of adoption friction&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the case that specification compounds while review is a one-time signal, which is why the spec outranks the diff&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - the codebase-as-context claim this article leans on, and the mechanism behind it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/learn-the-foundation-not-the-syntax/&#34; &gt;Learn the Foundation, Not the Syntax&lt;/a&gt; - the durable mental models that let an engineer catch what the model gets wrong in production&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://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Tuckman&amp;rsquo;s stages of group development&amp;rdquo;&lt;/a&gt; - the forming-storming-norming-performing model that explains why mature teams absorb new practices with low friction&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rework.withgoogle.com/print/guides/5727380657274880/&#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=rework.withgoogle.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google re:Work, &amp;ldquo;Guide: Understand team effectiveness&amp;rdquo;&lt;/a&gt; - Project Aristotle&amp;rsquo;s finding that psychological safety is the top predictor of team effectiveness, the performing-stage asset that makes genuine disagreement possible&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dora.dev/&#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=dora.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DORA, &amp;ldquo;State of DevOps&amp;rdquo;&lt;/a&gt; - the research program establishing throughput and stability as independent axes, which is the formal version of velocity-without-the-house-of-cards&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/devops/state-of-devops&#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=cloud.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google Cloud, &amp;ldquo;State of DevOps Report&amp;rdquo;&lt;/a&gt; - the annual report tracking how elite teams separate lead time and deployment frequency from change failure rate and time to restore&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Theory of Constraints&amp;rdquo;&lt;/a&gt; - the framework for why removing the production bottleneck relocates rather than eliminates the constraint, landing it on verification&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Pull Request Queue Outgrew You: A Triage Layer for Open Source Maintainers</title>
      <link>https://tomrochette.com/triaging-open-source-pull-requests/</link>
      <pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/triaging-open-source-pull-requests/</guid>
      <category>open-source</category><category>software-engineering</category><category>code-review</category><category>pull-request</category><category>llm</category><category>automation</category><category>github-actions</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Open source always had a queue problem.&#xA;For most of its history the threat was volume: more pull requests than a maintainer could read, arriving faster than one unpaid person could clear.&#xA;&lt;strong&gt;The pull request queue scales with the project&amp;rsquo;s popularity, and a single maintainer&amp;rsquo;s attention does not scale with anything at all.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The volume threat is still present, and it is no longer the worst of it.&#xA;The character of the queue changed.&#xA;More than one in five code reviews on GitHub now &lt;a href=&#34;https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;involve an agent&lt;/a&gt;, and Copilot&amp;rsquo;s automated review alone has run more than sixty million times, growing tenfold in under a year, so the machine-generated pull request is no longer a fringe of the queue.&#xA;The machine-generated pull request is becoming the norm, and it is a different kind of problem than a human one.&#xA;It looks correct, because plausibility is exactly what a language model optimizes for, and it may be subtly, uniformly wrong in ways that read as confident and clean.&#xA;There is usually no author who thought about each line, so there is no intent for you to leverage as context, only output you have to verify from scratch.&#xA;And almost never does the contributor tell you which model produced the code, what prompt generated it, or whether a human ever read it before it landed in your queue.&#xA;&lt;strong&gt;The flood is not just bigger now.&#xA;The flood is full of plausible code with no provenance, and plausible, unprovenanced code is the hardest thing to triage by reading it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The instinct of a responsible maintainer is to read every pull request, carefully, and reply thoughtfully.&#xA;That instinct is exactly what kills the project.&#xA;Every half-hour spent reverse-engineering an AI-generated PR that looks reasonable until the third function is a half-hour not spent on the architectural change that keeps the library maintained.&#xA;The queue grows while you sleep, and while you are polite, and while you are giving a stranger&amp;rsquo;s model the benefit of the doubt.&lt;/p&gt;&#xA;&lt;p&gt;You cannot review your way out of this, for the same reason a team engineer cannot: &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;per-unit review scales linearly with your hours, and the entropy is produced faster than you can read it&lt;/a&gt;.&#xA;The difference is that on a team you can hire.&#xA;In open source, you are usually alone, unpaid, and tired, and the code you are being asked to vet no longer contains the reasoning of the person who submitted it.&#xA;&lt;strong&gt;The only way out is to stop reviewing everything and start triaging everything, so that your scarce attention lands only on the pull requests that deserve it.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Triage Before Review&#xA;    &lt;div id=&#34;triage-before-review&#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;#triage-before-review&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Review answers the question, &amp;ldquo;is this code correct?&amp;rdquo;&#xA;Triage answers a cheaper question that comes first: &amp;ldquo;does this pull request deserve my attention at all, and if so, how much?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Most maintainers combine the two.&#xA;They open a pull request, start reading the diff, and only then discover that it is stale, that it conflicts with main, that it has no tests, that it touches a file nobody asked it to touch, or that it is the fourth duplicate of a request they already declined.&#xA;Every one of those discoveries was free to make before reading a single line of code, and making them up front is the entire difference between a queue you manage and a queue that manages you.&lt;/p&gt;&#xA;&lt;p&gt;A triage layer is the set of automated signals that answer the cheap questions before you ever open the diff.&#xA;Does it still apply?&#xA;Does it still merge?&#xA;Is it small or sprawling?&#xA;Is it risky or routine?&#xA;Who is it from?&#xA;Does it match the conventions the project already requires?&#xA;&lt;strong&gt;Each of these is a machine-checkable property, and a property a machine can check is attention you never have to spend again.&lt;/strong&gt;&#xA;This is the same move &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; makes for a team codebase: encode the standard where every change is forced to pass through it, instead of carrying it in your head as a review habit.&lt;/p&gt;&#xA;&lt;p&gt;The goal of the triage layer is not to merge everything automatically.&#xA;It is to make the queue sortable, so that when you sit down with your limited hour, you are looking at the five pull requests that matter, ranked, instead of the fifty that arrived in the order they happened to come in.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Plausibility Is the Danger, Provenance Is the Missing Signal&#xA;    &lt;div id=&#34;plausibility-is-the-danger-provenance-is-the-missing-signal&#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;#plausibility-is-the-danger-provenance-is-the-missing-signal&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Understanding why the modern queue is dangerous is what defines the triage layer, because AI-generated code breaks the assumptions review used to rest on.&lt;/p&gt;&#xA;&lt;p&gt;When a human wrote the pull request, you and the author shared a mental model.&#xA;You could trust that the choices in the diff were deliberate, even imperfect ones, and a gap between your expectation and the code was an interesting signal, because it represented two human understandings of the same problem meeting.&#xA;&lt;strong&gt;When a model wrote the code, there is no shared mental model, and there is no author who deliberated.&lt;/strong&gt;&#xA;The code is the output of a pattern-matching process, internally coherent, consistent with nothing around it, and wrong about the domain in ways that look exactly like correctness.&#xA;This is the argument from &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;, and it lands hardest in open source, where the reviewer and the &amp;ldquo;author&amp;rdquo; have never spoken.&lt;/p&gt;&#xA;&lt;p&gt;What makes the current crisis distinct is the provenance gap.&#xA;Contributors almost never disclose that the code is generated, let alone which model generated it, what prompt produced it, or whether a human checked the output before opening the pull request.&#xA;Without provenance, you cannot assess risk.&#xA;A fifty-line patch from a contributor who tested it by hand and a fifty-line patch a model hallucinated in three seconds look identical in the diff, and the diff is all you have.&#xA;&lt;strong&gt;Plausible code with no origin story is the default input now, and it forces a worst-case assumption on every pull request: treat it as unverified until something proves otherwise.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The 2026 data shows how invisible the provenance gap is by default.&#xA;A census of 180 million repositories found that the obvious signal, a bot account, &lt;a href=&#34;https://arxiv.org/abs/2606.24429&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;recovers only about three percent&lt;/a&gt; of the commits AI coding agents actually produced, so the overwhelming majority of machine-generated code reaches you with no detectable fingerprint.&#xA;And the studies that watched what reviewers did with it found the same pattern: agent-generated pull requests carry &lt;a href=&#34;https://arxiv.org/abs/2601.21276&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;more redundancy and technical debt&lt;/a&gt; than human ones, yet reviewers express more positive sentiment toward them, and the majority of AI-coauthored pull requests &lt;a href=&#34;https://arxiv.org/abs/2601.13754&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;merge with no explicit human review at all&lt;/a&gt;.&#xA;Plausibility is what hides the problem.&lt;/p&gt;&#xA;&lt;p&gt;The implication for triage is concrete.&#xA;First, the durable defense against plausible code is not a sharper opinion but a machine-checkable gate, because opinion-based review loses against code that was designed to look right.&#xA;Tests, static analysis, type checking, reproducible builds: these operate on what the code does, not on how it reads, and they do not get fooled by confident prose.&#xA;Second, the absence of provenance is itself a routing signal.&#xA;A large, high-churn, undocumented pull request from an unknown contributor should default to high-risk, not because the contributor is malicious but because you have no evidence to assign it anything lower.&#xA;Third, the one piece of information that would most improve your triage, which model and what prompt, is the one nobody is giving you, which means the cheapest high-leverage intervention available is to start asking for it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Let Automation Carry the Logistics&#xA;    &lt;div id=&#34;let-automation-carry-the-logistics&#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;#let-automation-carry-the-logistics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first tier of triage is pure logistics, and all of it is solved.&#xA;You should not be tracking any of this by hand, and in 2026 you increasingly do not even have to build it yourself.&#xA;The most consequential shift is that GitHub started shipping these gates at the platform level, because the flood crossed a threshold unpaid maintainers could not hold: per-user caps on open pull requests, pull-request archiving, and &lt;a href=&#34;https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;smarter bypass&amp;rdquo; signals&lt;/a&gt; based on account age and merge history.&#xA;The stated rationale is the one this article rests on: the &lt;a href=&#34;https://github.blog/open-source/maintainers/welcome-to-the-eternal-september-of-open-source-heres-what-we-plan-to-do-for-maintainers/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;cost to create a change has fallen below the cost to review it&lt;/a&gt;.&#xA;When the host handles the load, your job narrows to the gates the platform cannot generalize.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Mark and close the stale, on a clock that forces a decision.&lt;/strong&gt;&#xA;A pull request that has had no activity for twenty-eight days is not waiting for you.&#xA;A stale pull request drags down the whole queue, because a queue full of stale PRs signals to new contributors that the project is unmaintained.&#xA;&lt;a href=&#34;https://github.com/actions/stale&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;actions/stale&lt;/a&gt; marks a pull request stale after twenty-eight days, posts a warning, and closes it seven days later if the contributor does not respond.&#xA;Twenty-eight is also the ceiling on a healthy open pull request, not just the stale timer.&#xA;If a PR has been open more than twenty-eight days and is not merged, the right answer is almost never &amp;ldquo;keep waiting,&amp;rdquo; it is one of two things: break it into smaller pieces that can each land on their own, or reject it.&#xA;A large PR that lingers is usually a PR that was too big to review in the first place, not a PR that is waiting for a reply.&#xA;This is not cruelty.&#xA;Letting a contributor&amp;rsquo;s work sit unread for a year is cruelty.&#xA;A fast, automatic close with a clear &amp;ldquo;reopen if you are still interested&amp;rdquo; is a kindness, and it is a kindness that costs you nothing.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Surface the conflicting.&lt;/strong&gt;&#xA;A pull request that no longer merges cleanly is a pull request that is wasting your attention, because until the contributor rebases, your review is provisional.&#xA;&lt;a href=&#34;https://github.com/eps1lon/actions-label-merge-conflict&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;eps1lon/actions-label-merge-conflict&lt;/a&gt; adds a &lt;code&gt;merge-conflict&lt;/code&gt; label the moment a PR falls behind main, and removes it the moment it merges again.&#xA;Now you can filter &lt;code&gt;label:-merge-conflict&lt;/code&gt; and only review work that is actually ready.&#xA;The contributor also gets a clear, automated nudge that rebase is needed, without you having to be the one to say it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Label by size.&lt;/strong&gt;&#xA;The blast radius of a change is the single best predictor of how much attention it deserves, a point I made in &lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt;: a README typo and a schema migration are both pull requests, and they do not need the same gate.&#xA;A size action tags every PR with &lt;code&gt;size/S&lt;/code&gt; through &lt;code&gt;size/XL&lt;/code&gt; based on diffstat.&#xA;Small changes become candidates for fast-track; large ones become candidates for &amp;ldquo;please split this.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Label by area.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/actions/labeler&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;actions/labeler&lt;/a&gt; tags a pull request based on which files it touches, so you can route &lt;code&gt;area/ci&lt;/code&gt;, &lt;code&gt;area/docs&lt;/code&gt;, &lt;code&gt;area/security&lt;/code&gt; to the right context, or skip the areas you are not the expert in.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Flag the first-timers.&lt;/strong&gt;&#xA;Label first-time contributors explicitly.&#xA;Not so you can be suspicious of them, but so you can be generous with them, because a good first review is how a first-time contributor becomes a second-time contributor, and a second-time contributor is how a project outlives its original maintainer.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Enforce the conventions you already require.&lt;/strong&gt;&#xA;If your project requires a linked issue, a semantic title, a signed commit, a test for every new function, enforce each one with a check that runs on open.&#xA;&lt;a href=&#34;https://github.com/amannn/action-semantic-pull-request&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;amannn/action-semantic-pull-request&lt;/a&gt; is one example, but the specific tool matters less than the principle: anything you find yourself typing in review comments repeatedly belongs in a check that fails the build.&#xA;A review comment is a standard you enforce only when you are awake.&#xA;A failing check is a standard that runs forever.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Gate at the trust boundary, before the diff.&lt;/strong&gt;&#xA;The bluntest triage signal is whether you have any reason to trust the contributor at all, and in 2026 the canonical implementation of that idea is &lt;a href=&#34;https://github.com/mitchellh/vouch&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mitchellh/vouch&lt;/a&gt;, built for the Ghostty terminal against a large volume of AI-generated pull requests.&#xA;It auto-closes pull requests from unvouched contributors and routes them through a vouching issue, so the queue you actually read is the queue from people who have been vouched for.&#xA;It is a strong filter, and a truthful one to use carefully: the cost is friction for legitimate newcomers, which is why the vouching path has to let legitimate newcomers through, not block them.&lt;/p&gt;&#xA;&lt;p&gt;Each of these is a small automation, and none of them review code.&#xA;Together they collapse the queue from &amp;ldquo;everything that arrived&amp;rdquo; to &amp;ldquo;everything that is ready, relevant, and sized.&amp;rdquo;&#xA;That handles most of the work, and it cost you zero hours of reading diffs.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Demand Provenance&#xA;    &lt;div id=&#34;demand-provenance&#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;#demand-provenance&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The single most valuable triage signal is the one the current ecosystem refuses to provide, which means the maintainer has to require it.&lt;/p&gt;&#xA;&lt;p&gt;Add two fields to your pull request template, and make them hard to skip.&#xA;Was this change generated or significantly assisted by an AI tool?&#xA;If so, which model, and what was the prompt or task description?&#xA;A checkbox and a free-text line are enough.&#xA;You do not need a policy on whether AI contributions are welcome; you need the data to triage them on their actual risk rather than on a guess.&lt;/p&gt;&#xA;&lt;p&gt;This is no longer hypothetical.&#xA;In 2026, &lt;a href=&#34;https://github.com/rust-lang/rust-forge/pull/1040&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;rust-lang wired an AI policy&lt;/a&gt; into its contributing guide and pull request template, and it is not alone: &lt;a href=&#34;https://github.com/scipy/scipy/pull/24583&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;scipy&lt;/a&gt; asks for the model name, &lt;a href=&#34;https://www.qemu.org/docs/master/devel/code-provenance.html&#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=www.qemu.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;qemu&lt;/a&gt; requires code provenance, &lt;a href=&#34;https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Ghostty&lt;/a&gt; ships an AI_POLICY file, and the &lt;a href=&#34;https://kernel.org/doc/html/next/process/coding-assistants.html&#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=kernel.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Linux kernel&lt;/a&gt; has long held the submitter responsible for attesting to AI-generated code.&#xA;The convention is fragmenting into a field of per-project rules, which is messy, but the direction is clear, and the closest thing to a shared format, &lt;a href=&#34;https://github.com/Declare-AI/declare-ai&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;declare-ai&amp;rsquo;s provenance file&lt;/a&gt;, is emerging for exactly this gap.&#xA;The platform will not hand you this signal for free.&#xA;Everything GitHub has shipped for maintainers, &lt;a href=&#34;https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;per-user caps&lt;/a&gt;, archiving, smarter bypass signals, operates on volume and account history, and none of it tells you which pull requests a model wrote.&#xA;If you want provenance, you have to ask for it in the template.&lt;/p&gt;&#xA;&lt;p&gt;Label from the answer.&#xA;&lt;code&gt;human-authored&lt;/code&gt;, &lt;code&gt;ai-assisted&lt;/code&gt;, &lt;code&gt;ai-generated&lt;/code&gt;, and a tag for the model when it is disclosed.&#xA;Now provenance becomes a filter and a routing input instead of a mystery.&#xA;A &lt;code&gt;human-authored&lt;/code&gt; patch from a known contributor with passing tests can travel the fast lane.&#xA;An &lt;code&gt;ai-generated&lt;/code&gt; patch with no model disclosed and no linked issue starts one gate further back, by default, because it carries the provenance risk this era is defined by.&lt;/p&gt;&#xA;&lt;p&gt;Be explicit that disclosure is not a penalty.&#xA;The penalty is discovery, when you eventually realize a PR was generated and the contributor hid it, because at that point the trust that makes open source work is gone and the PR is closed on principle.&#xA;Disclosure is what lets a generated contribution compete for your attention on its merits.&#xA;Concealment is what makes every generated contribution read as an attempt to hide something from you.&lt;/p&gt;&#xA;&lt;p&gt;One caution, because the obvious next step is to use cryptographic attestation: signed provenance is not the same as trustworthy provenance.&#xA;In 2026, &lt;a href=&#34;https://openssf.org/blog/2026/06/10/mini-shai-hulud-where-slsas-boundaries-fall/&#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=openssf.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;cryptographically valid supply-chain attestations were produced for malicious packages&lt;/a&gt;, which means a signature confirms a chain of custody, not that the code is safe.&#xA;Demand disclosure, but verify the code on its own terms, not on the strength of the attestation alone.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A maintainer cannot triage what they cannot see, and in a queue full of plausible code, the origin of the code is the first thing they need to see.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Let the LLM Do the First Pass&#xA;    &lt;div id=&#34;let-the-llm-do-the-first-pass&#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;#let-the-llm-do-the-first-pass&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the logistics are handled, the remaining question is the one automation traditionally could not answer: is the code itself any good.&#xA;That used to require a human, because reading a diff and reasoning about its consequences was exactly the task machines could not do.&#xA;It is not anymore.&#xA;&lt;strong&gt;An LLM will not review a pull request as well as you would, but it will review it in seconds, on every pull request, at three in the morning, and it will produce a structured signal you can sort and filter on.&lt;/strong&gt;&#xA;That is a different value than correctness, and for triage it is the value that matters.&lt;/p&gt;&#xA;&lt;p&gt;The 2026 evidence is now strong enough to separate the hype from the result.&#xA;On the hype side, independent benchmarks are blunt about the ceiling: across eight frontier models, reviewers catch &lt;a href=&#34;https://arxiv.org/abs/2603.26130&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;only fifteen to thirty-one percent&lt;/a&gt; of the issues humans flag, and adding more context makes them worse, not better, while the first independent cross-vendor ranking puts the best tool at an &lt;a href=&#34;https://www.coderabbit.ai/blog/coderabbit-tops-martian-code-review-benchmark&#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=www.coderabbit.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;F1 near fifty-one&lt;/a&gt;.&#xA;An LLM review is a noisy signal, and treating it as a verdict is the mistake.&#xA;On the result side, the largest production deployment of the year &lt;a href=&#34;https://blog.cloudflare.com/ai-code-review/&#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=blog.cloudflare.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ran a hundred and thirty thousand review passes&lt;/a&gt; across five thousand repositories, and engineers reached for the human &amp;ldquo;break glass&amp;rdquo; override on six tenths of one percent of merge requests.&#xA;That number is the point: the system ran unattended on the easy tier not because the model was a great reviewer, but because it was a great sorter, tiering by risk and handing a coordinator a structured finding to deduplicate and rank.&lt;/p&gt;&#xA;&lt;p&gt;Run an LLM review on every pull request when it opens and on every push that updates it.&#xA;Give it your evaluation criteria, explicitly, the same checklist you would walk through mentally if you opened the diff yourself.&#xA;Does it add a new dependency?&#xA;Does it change a public interface?&#xA;Does it touch security-sensitive code paths?&#xA;Does it introduce backward/forward-incompatible behavior?&#xA;Are there tests for the new behavior?&#xA;Does it match the naming and structural conventions of the surrounding code?&lt;/p&gt;&#xA;&lt;p&gt;Ask for the output as structured data, not prose.&#xA;A risk score and a confidence score, say on a one-to-five scale, a one-line summary, and a short list of specific findings.&#xA;Then parse those fields and turn them into labels.&#xA;&lt;code&gt;risk:low&lt;/code&gt;, &lt;code&gt;risk:medium&lt;/code&gt;, &lt;code&gt;risk:high&lt;/code&gt;.&#xA;&lt;code&gt;confidence:high&lt;/code&gt;, &lt;code&gt;confidence:low&lt;/code&gt;.&#xA;&lt;code&gt;needs-human-review&lt;/code&gt; when the model is unsure or when the risk is high.&#xA;&lt;code&gt;auto-merge-candidate&lt;/code&gt; when the risk is low, the confidence is high, the size is small, the tests pass, and the contributor is trusted.&lt;/p&gt;&#xA;&lt;p&gt;Now your queue is sorted by signal instead of by arrival time.&#xA;The pull requests that are low-risk and high-confidence can be merged on green, or queued for a single glance, because the LLM has already done the scanning work you would have done anyway.&#xA;The pull requests that are high-risk, or where the model is uncertain, rise to the top of your attention with the findings already attached.&#xA;&lt;strong&gt;You are no longer choosing what to read.&#xA;You are confirming or rejecting a hypothesis the triage layer has already formed.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wire those scores back into the logistics layer, so a pull request that fails the review does not just sit and wait for you.&#xA;When confidence drops below three or risk climbs above three, post a comment that tells the author the specific findings they need to address, and let the stale action treat that as the notice that starts the closing clock.&#xA;The contributor gets a concrete path to merge instead of silence, and if they do not take it the pull request closes itself, decided by the standard you encoded rather than by your mood on a given Thursday.&lt;/p&gt;&#xA;&lt;p&gt;A few cautions, because this is the part people get wrong.&lt;/p&gt;&#xA;&lt;p&gt;The LLM review is advisory, not authoritative.&#xA;It hallucinates, it misses subtle bugs, and it is confidently wrong in exactly the way that makes you want to trust it.&#xA;Never wire it to merge on its own verdict for anything that crosses a trust boundary, changes a public contract, or is hard to undo.&#xA;Use it to route attention, not to replace it, and reserve the replaced attention for the small, reversible, low-risk changes where being wrong is cheap to fix.&#xA;This is the same risk-based gating &lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; argues for: the unit of gating is the blast radius of the change, not the existence of the pull request.&lt;/p&gt;&#xA;&lt;p&gt;The deepest caution is specific to this era, and you have to internalize it before trusting any automated score.&#xA;&lt;strong&gt;When an LLM reviews code that an LLM wrote, the reviewer shares the generator&amp;rsquo;s blind spots.&lt;/strong&gt;&#xA;Both are statistical models trained on overlapping corpora, and a mistake plausible enough for one model to make is often plausible enough for the other to overlook.&#xA;Two models agreeing that &amp;ldquo;this looks fine&amp;rdquo; is a weaker signal than either model issuing that verdict alone, and if the reviewer and the generator come from the same model family the agreement proves almost nothing.&lt;/p&gt;&#xA;&lt;p&gt;In 2026 this stopped being a conjecture.&#xA;Recursive self-training studies show that an AI reviewer gating its own output &lt;a href=&#34;https://arxiv.org/abs/2606.28438&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;collapses into a rubber-stamp regime&lt;/a&gt;, where acceptance scores rise while correctness falls, and that only model-independent checks, compilation, types, tests, slow the collapse without stopping it.&#xA;The one direct measurement of the effect found that heterogeneous pairs, a Claude reviewer over Codex output, &lt;a href=&#34;https://arxiv.org/abs/2606.14445&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;flag a defect sixty-nine percent of the time&lt;/a&gt;, where homogeneous pairs flag it only fifty-three percent of the time.&#xA;Same-family agreement is measurably weaker than cross-family agreement, which is the empirical form of the warning above.&lt;/p&gt;&#xA;&lt;p&gt;This is why provenance matters at the review layer as well: feed the disclosed model and prompt into the reviewer&amp;rsquo;s context so it can target the failure modes that model is known for, rather than re-reading the diff from the same perspective that produced it.&#xA;And it is why, for &lt;code&gt;ai-generated&lt;/code&gt; pull requests, you must discount the confidence score and default toward &lt;code&gt;needs-human-review&lt;/code&gt; unless the change is independently verified by something that does not share the blind spot: a passing test, a type checker, a reproducible build, a specification the code is checked against.&#xA;&lt;strong&gt;The LLM review is one signal in the triage layer, never the only one, and against generated code its job is to surface hypotheses for a human or a gate to confirm, not to pronounce the code correct.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Calibrate by reviewing the reviewer.&#xA;For your first month, read the LLM&amp;rsquo;s review on every pull request you also review yourself, and keep a tally of where it was right, where it was wrong, and where it missed something you caught.&#xA;That tally tells you which criteria to strengthen in the prompt and which labels to distrust.&#xA;An uncalibrated LLM gate is a liability.&#xA;A calibrated one is an extra reviewer that never tires, and that gets more accurate every time you adjust the criteria.&lt;/p&gt;&#xA;&lt;p&gt;Post the rationale, not just the label.&#xA;Have the action leave the summary and findings as a comment on the pull request.&#xA;The contributor sees what was flagged, the maintainer sees why a label was applied, and the verdict is auditable rather than opaque.&#xA;Transparency is what keeps an automated review from feeling arbitrary, and it is what lets a contributor fix the problem before you ever have to look.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Route by Risk, Not by Arrival&#xA;    &lt;div id=&#34;route-by-risk-not-by-arrival&#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;#route-by-risk-not-by-arrival&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the triage layer is producing labels, the routing follows directly, and it should match the risk profile of each change rather than the order it was submitted.&#xA;The tiering is no longer theoretical: the production system cited above classifies every change into trivial, lite, or full tiers and &lt;a href=&#34;https://blog.cloudflare.com/ai-code-review/&#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=blog.cloudflare.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;spends twenty cents of review on a typo fix&lt;/a&gt; where it spends a dollar sixty-eight on a sprawling one, because the gate a change deserves is a function of its blast radius, not its existence.&lt;/p&gt;&#xA;&lt;p&gt;Low risk, high confidence, small, passing tests: auto-merge on green, or batch them into a single weekly pass where you glance and click.&#xA;High risk, or low confidence, or large, or crossing a security boundary: hold for human review, and review those first.&#xA;AI-generated with no model disclosed, or no linked issue, or no tests: default to the human queue until a test or a specification proves it, regardless of how small it looks, because small and plausible is exactly the profile of a subtle bug.&#xA;First-time contributor: prioritize the response, because the speed of your first reply decides whether they come back.&#xA;Conflicting: invisible until rebased.&#xA;Stale: closed.&lt;/p&gt;&#xA;&lt;p&gt;Within the human-review queue, start with the oldest first.&#xA;A pull request that has waited the longest is the one closest to going stale, and clearing it, by merging or by closing, is what keeps the queue from accumulating old pull requests that nobody will ever get to, so weight your attention toward age, not toward whatever arrived most recently.&lt;/p&gt;&#xA;&lt;p&gt;This is the open source version of the argument from &lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt;: treating every pull request as needing the same gate is a failure to think about risk, and most pull requests do not need a human at all.&#xA;&lt;strong&gt;The maintainer who wins is not the one who reads the most diffs.&#xA;The maintainer who wins is the one whose queue has been pre-sorted so that the diffs they do read are the only ones that ever needed a human.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Contributor Relationship Is the Hidden Triage&#xA;    &lt;div id=&#34;the-contributor-relationship-is-the-hidden-triage&#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-contributor-relationship-is-the-hidden-triage&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a layer underneath the triage setup, and it is the one maintainers most often neglect, because it is not technical.&#xA;Most of the pain of an overflowing queue is not the code.&#xA;It is the guilt of unanswered contributors, the dread of opening the tab, and the slow resentment of work that is supposed to be voluntary but has started to feel like a debt.&lt;/p&gt;&#xA;&lt;p&gt;Automation is part of the answer, but so is setting expectations, because a contributor who knows what to expect does not require a personal reply to stay patient.&lt;/p&gt;&#xA;&lt;p&gt;Write a &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; that says what you will and will not accept, what a good pull request looks like, and how long response takes.&#xA;Use a pull request template that asks for the linked issue, the motivation, and the test.&#xA;Publish a response-time norm, even a truthful one: &amp;ldquo;I review pull requests on Thursdays.&amp;rdquo;&#xA;State it, link it in every template, and let the automation reinforce it.&#xA;&lt;strong&gt;Predictability is a contribution, and a maintainer who responds every Thursday is more sustainable than one who responds in a burst and then disappears for three months.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The economics underneath this are shifting, slowly.&#xA;The clearest 2026 voice on maintainer sustainability argues that the polite channels, sponsorship and pledge drives, have &lt;a href=&#34;https://ossresistance.com/&#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=ossresistance.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;failed&lt;/a&gt;, and that maintainers should take open source work on company time rather than donate their evenings, because attention donated after hours is attention that does not scale.&#xA;The funding is present but thin: sovereign and industry programs disbursed millions to individual projects this year, with a sovereign fund investing &lt;a href=&#34;https://www.theregister.com/oses/2026/05/14/kde-bags-13m-as-europe-realizes-it-might-need-an-os-of-its-own/5240562/&#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=www.theregister.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;over a million euros in a single project&lt;/a&gt; and the &lt;a href=&#34;https://opensourcepledge.com/&#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=opensourcepledge.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;open source pledge&lt;/a&gt; setting a two-thousand-dollar-per-engineer floor, yet no 2026 survey has measured whether maintainer burnout actually fell.&#xA;Treat the automation and the expectations as the primary means of managing the queue, and the funding as the still-insufficient subsidy.&lt;/p&gt;&#xA;&lt;p&gt;And learn to close fast.&#xA;A fast, clear &amp;ldquo;no, and here is why&amp;rdquo; is a gift.&#xA;It respects the contributor&amp;rsquo;s time, it keeps the queue fair, and it is almost always kinder than a silence that stretches into a year.&#xA;The maintainer&amp;rsquo;s fear of seeming ungrateful is what grows the queue beyond recovery.&#xA;A no is not ungrateful.&#xA;A no is an answer, and an answer is all a contributor is waiting for.&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;p&gt;You do not need to build the whole layer at once, and you should not try.&#xA;&lt;strong&gt;Pick the single thing that is costing you the most attention right now and automate that one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Add &lt;a href=&#34;https://github.com/actions/stale&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;actions/stale&lt;/a&gt; and let it start closing the pull requests you were never going to get to.&#xA;Add &lt;a href=&#34;https://github.com/eps1lon/actions-label-merge-conflict&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;eps1lon/actions-label-merge-conflict&lt;/a&gt; and stop looking at diffs that are not ready to merge.&#xA;Add a size labeler and a path-based labeler and make the queue sortable.&#xA;Write the &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; you have been meaning to write, and add the two provenance fields, AI-assisted yes or no, and which model, to the pull request template, so every contribution arrives with the one piece of context this era hides by default.&#xA;If the flood is mostly from contributors you have no reason to trust, add a trust gate like &lt;a href=&#34;https://github.com/mitchellh/vouch&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;vouch&lt;/a&gt; before any of the rest, because closing unvouched pull requests up front is the single largest reduction in queue size available to you.&lt;/p&gt;&#xA;&lt;p&gt;Then, and only then, wire in the LLM first-pass review.&#xA;Start it in shadow mode, posting its summary as a comment without applying any labels, and read along with it for a month.&#xA;When you trust its risk and confidence calls, turn the labels on.&#xA;When you trust the labels, let the lowest-risk, highest-confidence, smallest changes merge on green.&#xA;Each step is attention you stop spending by hand and start spending on the pull requests that actually need a human.&lt;/p&gt;&#xA;&lt;p&gt;A sustainable open source project is not one where the maintainer reads everything.&#xA;It is one where the maintainer has built a triage layer good enough that almost nothing needs to reach them unread, and what does reach them is exactly what was worth their time.&#xA;Build that, one automation at a time, and the queue stops controlling your schedule.&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;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt; - the team-codebase version of the same argument: encode the standard where work is forced to pass through it, instead of carrying it as a per-PR review habit&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-merge-gate/&#34; &gt;The Merge Gate&lt;/a&gt; - the case for gating on the blast radius of the change rather than on the existence of a pull request, which is the principle behind risk-based triage routing&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why an automated first pass plus a precise specification outperforms a tired human scanning a diff, the premise the LLM review layer stands on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/defects-flow-downstream/&#34; &gt;Defects Flow Downstream, Fixes Must Flow Upstream&lt;/a&gt; - why repeated review comments signal a missing check rather than a missing reviewer, the root of &amp;ldquo;encode it, do not retype it&amp;rdquo;&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://github.com/actions/stale&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;actions/stale&lt;/a&gt; - the official GitHub Action for marking inactive pull requests and issues stale and closing them after a configurable window&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/eps1lon/actions-label-merge-conflict&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;eps1lon/actions-label-merge-conflict&lt;/a&gt; - labels pull requests that no longer merge cleanly and unlabels them once the conflict is resolved&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/actions/labeler&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;actions/labeler&lt;/a&gt; - the official GitHub Action for applying labels based on the files a pull request touches&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/amannn/actions-semantic-pull-request&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;amannn/action-semantic-pull-request&lt;/a&gt; - enforces conventional-commit-style pull request titles as a required check&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Theory of Constraints&amp;rdquo;&lt;/a&gt; - Goldratt&amp;rsquo;s framing for why you change the bottleneck station rather than adding effort at it, the basis for moving the maintainer out of the triage station&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Paved_road&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Paved road&amp;rdquo;&lt;/a&gt; - the principle of making the compliant path the easiest path, applied here to contributor conventions and templates&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub, &amp;ldquo;Agent pull requests are everywhere&amp;rdquo;&lt;/a&gt; - the 2026 scale data (one in five reviews involve an agent; Copilot review at 60M+, 10x growth) and GitHub&amp;rsquo;s own &amp;ldquo;judgment is the bottleneck&amp;rdquo; framing&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub, &amp;ldquo;How pull request limits are cutting down the noise&amp;rdquo;&lt;/a&gt; - the platform shipping per-user PR caps, archiving, and smarter bypass signals&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/maintainers/welcome-to-the-eternal-september-of-open-source-heres-what-we-plan-to-do-for-maintainers/&#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=github.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub, &amp;ldquo;Welcome to the Eternal September of open source&amp;rdquo;&lt;/a&gt; - the cost-to-create versus cost-to-review framing that motivates platform-level triage controls&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.cloudflare.com/ai-code-review/&#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=blog.cloudflare.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cloudflare, &amp;ldquo;Orchestrating AI Code Review at scale&amp;rdquo;&lt;/a&gt; - the largest 2026 production dataset (131k runs, 0.6% break-glass) and the coordinator-plus-specialists-plus-risk-tiers reference architecture&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2603.26130&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SWE-PRBench, &amp;ldquo;Benchmarking LLM-Driven Pull Request Review&amp;rdquo;&lt;/a&gt; - the independent efficacy ceiling: eight frontier models catch 15-31% of human-flagged issues, and more context hurts&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.coderabbit.ai/blog/coderabbit-tops-martian-code-review-benchmark&#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=www.coderabbit.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Martian Code Review Bench, via CodeRabbit&lt;/a&gt; - the first independent cross-vendor ranking (~300k PRs, ten tools)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2606.28438&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Song et al., &amp;ldquo;When AI Reviews Its Own Code&amp;rdquo;&lt;/a&gt; - the formal proof that AI self-gating collapses into a rubber-stamp regime, requiring exogenous verification&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2606.14445&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Kim, &amp;ldquo;tap: A File-Based Protocol for Heterogeneous LLM Agent Collaboration&amp;rdquo;&lt;/a&gt; - the direct measurement of the homologation effect (heterogeneous pairs flag defects 69.8% vs 53.1% for homogeneous)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2601.21276&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;More Code, Less Reuse&amp;rdquo; (MSR 2026)&lt;/a&gt; - agent PRs carry more debt yet reviewers go easier on them&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2601.13754&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;On Autopilot? Human-AI Teaming in OSS&amp;rdquo; (MSR 2026)&lt;/a&gt; - most AI-coauthored PRs merge with no explicit review&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2606.24429&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;Detecting AI Coding Agents in Open Source&amp;rdquo; (180M-repo census)&lt;/a&gt; - bot-account detection recovers only ~3.3% of AI-agent commits&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mitchellh/vouch&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mitchellh/vouch&lt;/a&gt; - the canonical 2026 trust-before-the-diff gate, built for Ghostty&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rust-lang/rust-forge/pull/1040&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;rust-lang/rust-forge, &amp;ldquo;LLM policy&amp;rdquo; PR #1040&lt;/a&gt; - a provenance policy wired into CONTRIBUTING.md and the PR template, with a prior-art index&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://openssf.org/blog/2026/06/10/mini-shai-hulud-where-slsas-boundaries-fall/&#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=openssf.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenSSF, &amp;ldquo;Mini Shai-Hulud: Where SLSA&amp;rsquo;s Boundaries Fall&amp;rdquo;&lt;/a&gt; - signed provenance produced for malicious packages, the caveat against equating attestation with trust&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Declare-AI/declare-ai&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Declare-AI&lt;/a&gt; - the closest thing to an emerging machine-readable provenance standard&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ossresistance.com/&#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=ossresistance.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Open Source Resistance&lt;/a&gt; - the 2026 argument that maintainer attention must be taken on company time, not donated after hours&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learn the Foundation, Not the Syntax: Why Low-Level Languages Still Matter When the Machine Writes the Code</title>
      <link>https://tomrochette.com/learn-the-foundation-not-the-syntax/</link>
      <pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learn-the-foundation-not-the-syntax/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>learning</category><category>craft</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The question gets asked as a binary choice: either drill new developers on low-level languages until they can write a kernel from memory, or accept that writing code is finished and retrain everyone into product managers who write prompts.&#xA;It is a false dichotomy, and both options are wrong for the same reason.&#xA;&lt;strong&gt;They both confuse the surface of programming with the thing programming was always meant to teach, and that thing is now the only part AI cannot do for you.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Two Errors, Shared Confusion&#xA;    &lt;div id=&#34;two-errors-shared-confusion&#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;#two-errors-shared-confusion&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The &amp;ldquo;teach them everything&amp;rdquo; camp treats low-level fluency as a production skill.&#xA;It points at manual memory management, pointer arithmetic, and hand-rolled data structures as requirements for entering the profession, and it is right that these were once essential.&#xA;It is wrong that they still are, as production.&#xA;Writing C by hand stopped being the bottleneck the year a model could write it, read it, and port it faster than a careful senior could, and the market has already priced that in.&lt;/p&gt;&#xA;&lt;p&gt;The &amp;ldquo;writing code is over&amp;rdquo; camp takes the same observation and extends it too far.&#xA;If production is automated, the argument goes, the developer&amp;rsquo;s job becomes specification and orchestration, and the foundation the code runs on is somebody else&amp;rsquo;s problem, probably the machine&amp;rsquo;s.&#xA;This position is the AI-maxxing error applied to education, and it is the more dangerous of the two, because it feels like foresight while quietly removing the one capability that becomes scarcer and more valuable exactly as production gets cheap: the mental model of how the system actually behaves.&lt;/p&gt;&#xA;&lt;p&gt;Both camps make the same mistake the resistor and the maximalist make in &lt;a href=&#34;https://tomrochette.com/ai-maxxing-vs-fighting-against-it/&#34; &gt;AI-Maxxing and Resistance Are the Same Mistake&lt;/a&gt;: &lt;strong&gt;they argue about how much low-level to use instead of asking what low-level is for.&lt;/strong&gt;&#xA;The answer to that question dissolves the debate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Low-Level Actually Teaches, and Why It Compounds&#xA;    &lt;div id=&#34;what-low-level-actually-teaches-and-why-it-compounds&#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-low-level-actually-teaches-and-why-it-compounds&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Set aside the syntax drills and the &amp;ldquo;implement linked lists in C&amp;rdquo; exercises, and a low-level language is a teaching apparatus for a small number of durable mental models.&#xA;None of them are about the language.&#xA;They are about the machine the language sits on top of, and they are exactly the models that become structural once you can no longer trust the code you are reading.&lt;/p&gt;&#xA;&lt;p&gt;A model of execution.&#xA;What lives in memory, what gets allocated where, what a call frame is, what happens when a function returns.&#xA;This is not trivia.&#xA;It is the difference between an engineer who can read a stack trace and one who can only read an error message, and the generated code that breaks in 2026 breaks in ways that only the first engineer can diagnose.&lt;/p&gt;&#xA;&lt;p&gt;A model of cost.&#xA;Big-O is taught in school and forgotten because it is inert until you have experienced a cache miss, an allocation storm, or an N-plus-one query at the boundary between the ORM and the database.&#xA;Low-level work is the cheapest known way to experience that cost directly, and once experienced it transfers to every higher language you will ever use.&#xA;When the model produces plausible code that is also quietly quadratic across a network boundary, the person with a cost model catches it and the person without ships it.&lt;/p&gt;&#xA;&lt;p&gt;A model of failure.&#xA;Low-level code fails loudly: a segfault, a leak, a data race, a corrupted pointer.&#xA;The cause is concrete and the lesson is remembered.&#xA;High-level and generated code fails softly, at the seams between abstractions, and the softness is the hazard, because soft failures train nothing and accumulate until they become outages.&#xA;The engineer who learned on hard failures can debug the soft ones.&#xA;The reverse is not true.&lt;/p&gt;&#xA;&lt;p&gt;And, most importantly, a model of where the abstractions leak.&#xA;Every stack you will ever work on is a tower of abstractions, and every one of them &lt;a href=&#34;https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/&#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=www.joelonsoftware.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;leaks under stress&lt;/a&gt;: the ORM leaks into SQL, the garbage collector leaks into latency, the container leaks into the kernel, the model&amp;rsquo;s confidence leaks into a hallucinated API call.&#xA;When a leak surfaces in production, the person who can identify the layer underneath the abstraction is the person who fixes it.&#xA;Everyone else files a ticket and waits.&lt;/p&gt;&#xA;&lt;p&gt;These four models are not production skills.&#xA;They are not even, strictly, low-level skills.&#xA;They are durable skills, in the sense &lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; draws between the ephemeral and the durable: they do not decay across model generations, and they make every other thing you do, including supervising a model, more effective.&#xA;&lt;strong&gt;That is the entire case for low-level in one sentence: it is the most efficient known way to build the models that do not depreciate.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why &amp;ldquo;Writing Code Is Over&amp;rdquo; Is the Dangerous Half&#xA;    &lt;div id=&#34;why-writing-code-is-over-is-the-dangerous-half&#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;#why-writing-code-is-over-is-the-dangerous-half&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the asymmetry that settles which error matters more.&lt;/p&gt;&#xA;&lt;p&gt;Forgetting low-level syntax is a recoverable error.&#xA;The developer who never memorized the C calling conventions can look them up, or ask the model, the day they need them, and the cost is a few minutes.&lt;/p&gt;&#xA;&lt;p&gt;Losing the mental model is not recoverable in the moment you need it.&#xA;When the generated code is failing in production at three in the morning, there is no time to develop an intuition for memory layout, and the model that wrote the code is the same model confidently misdiagnosing it.&#xA;You can build a mental model with an LLM as a tutor, over time, the same way you can build one with a good textbook or a patient colleague; the tool is not the obstacle, the hours of deliberate study are.&#xA;&lt;strong&gt;What you cannot do is prompt one into existence under time pressure, and using the model to debug its own output already presupposes the very model it would take weeks to build.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;shifting bottleneck&lt;/a&gt; in its clearest form.&#xA;Production was the bottom of the stack, and automating it moved the constraint up to verification, and verification is precisely the layer that demands the foundation knowledge the &amp;ldquo;code is over&amp;rdquo; camp wants to skip.&#xA;The preparation that says &amp;ldquo;we will not need this because writing is automated&amp;rdquo; is the preparation that makes you unable to do the job writing&amp;rsquo;s automation created.&#xA;You are optimizing away the exact layer the bottleneck landed on.&lt;/p&gt;&#xA;&lt;p&gt;There is a near-term counter-argument worth taking seriously: that verification gets automated too, and then specification, and so on up the stack.&#xA;Even granting that, the same framework says the bottleneck just moves to deciding what to build and whether what was built is correct, which still requires understanding systems deeply.&#xA;I cannot find a version of this future in which understanding the foundation stops compounding, only versions in which the surface syntax stops mattering.&#xA;Those are different claims, and the debate quietly collapses them into one.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Onboarding Hole the Tools Opened&#xA;    &lt;div id=&#34;the-onboarding-hole-the-tools-opened&#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-onboarding-hole-the-tools-opened&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a structural reason this question is urgent now, and it is not philosophical.&#xA;For most of the profession, a developer built their mental model of systems the only way the model can be built: by struggling with code that broke, reading core dumps, profiling slow paths, and fixing actual failures under actual pressure, repeatedly, for years.&#xA;The struggle was the curriculum, and it was free, because it was simply the job.&lt;/p&gt;&#xA;&lt;p&gt;The tools have quietly removed the struggle, and with it, the curriculum.&#xA;An engineer who starts today can ship a feature without ever reading the code the tool wrote, without ever opening a profiler, without ever needing to understand why the first version was slow, because the tool never produced a slow first version for them to fix.&#xA;The onboarding path that used to build that underlying mental model now bypasses it, and the &lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;onboarding paradox in Software Engineering Teams in the Age of AI&lt;/a&gt; is the downstream symptom: juniors ship faster and understand less, and the understanding gap is invisible until something breaks.&lt;/p&gt;&#xA;&lt;p&gt;So the question is not whether to teach low-level.&#xA;It is whether to teach it deliberately, because the accidental curriculum that used to teach it for free has been automated away.&#xA;&lt;strong&gt;A generation that learns to prompt before it learns how a machine actually executes will be fluent at the surface and weak at the foundation, and the weakness will only become visible at the moment it becomes expensive, in production, at three in the morning, with no model able to help.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Synthesis: Read the Foundation, Don&amp;rsquo;t Write It&#xA;    &lt;div id=&#34;the-synthesis-read-the-foundation-dont-write-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;#the-synthesis-read-the-foundation-dont-write-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The resolution is not a midpoint between the two camps.&#xA;It is a different axis entirely.&lt;/p&gt;&#xA;&lt;p&gt;Stop teaching new developers to produce low-level code as if they would ship it.&#xA;Manual memory management as a daily craft, pointer arithmetic as a drill, hand-rolled allocators as a traditional requirement: these are depreciating production skills, and spending years on them is the &lt;a href=&#34;https://tomrochette.com/ai-maxxing-vs-fighting-against-it/&#34; &gt;two-year test&lt;/a&gt; failing gradually and visibly.&#xA;The surface area of low-level is large and mostly irrelevant to the work most developers will actually do, and Brooks&amp;rsquo;s old split between &lt;a href=&#34;https://en.wikipedia.org/wiki/No_Silver_Bullet&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;accidental and essential complexity&lt;/a&gt; still maps onto it cleanly: the syntax and the boilerplate are accidental, and the accident is exactly what the model now absorbs.&lt;/p&gt;&#xA;&lt;p&gt;Do teach them to read the foundation.&#xA;Read a stack trace down to the frame that matters.&#xA;Read a flame graph and point at the function that is consuming the budget.&#xA;Read a heap profile, an strace, a slow query log, a core dump.&#xA;Read the source of the standard library they use every day, at least once, until the abstraction is no longer mysterious.&#xA;Reading is cheaper than writing, it transfers to every language and every model generation, and it builds exactly the four models above without demanding the years of production fluency the old curriculum required.&lt;/p&gt;&#xA;&lt;p&gt;The rule of thumb is simple and useful: &lt;strong&gt;enough low-level to debug, not enough to ship.&lt;/strong&gt;&#xA;A few focused weeks of C or Rust, or even a careful tour through how the managed language you already use actually executes, is enough to install the models for a working lifetime, provided the engineer keeps reading systems instead of reading only diffs.&#xA;A career of writing C, in 2026, is overkill for most roles and a misallocation of the time that should be going into domain depth and judgment.&lt;/p&gt;&#xA;&lt;p&gt;And for the small fraction of work that genuinely lives at the foundation, embedded, kernels, databases, runtimes, high-frequency paths, the calculus flips and fluency is still required.&#xA;The point is not that nobody should write low-level code.&#xA;The point is that &amp;ldquo;should every new developer learn to write low-level code&amp;rdquo; is the wrong question, asked about the wrong layer, and the answer, which is &amp;ldquo;no, but every developer should learn to read the machine,&amp;rdquo; is what the two camps keep talking past.&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;p&gt;If you hire or mentor new developers, stop using &amp;ldquo;do you know C&amp;rdquo; as a proxy for anything.&#xA;It measures syntax, and syntax is cheap.&lt;/p&gt;&#xA;&lt;p&gt;Instead, hand them a deliberately broken program, one with a memory or concurrency bug hidden behind a clean high-level interface, and watch what they do.&#xA;The ones who can form a hypothesis about the layer underneath are the ones who can supervise a machine.&#xA;The ones who can only describe the symptom to the model and accept its first confident answer are the ones who will ship that bug to production and then be unable to explain it.&lt;/p&gt;&#xA;&lt;p&gt;If you are a new developer yourself, do not let the tools talk you out of the foundation.&#xA;Generate the boilerplate, take the shortcut, and then, separately, on your own time, read the source of something you depend on until you can explain how it actually works.&#xA;The generation is free.&#xA;The understanding is not, and it is the only part of this profession that the next ten years will reward more, not less.&lt;/p&gt;&#xA;&lt;p&gt;The debate between &amp;ldquo;learn everything low-level&amp;rdquo; and &amp;ldquo;writing code is dead&amp;rdquo; is two ways of staring at the surface.&#xA;&lt;strong&gt;The surface is going away.&#xA;The foundation is not.&#xA;Prepare accordingly.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why automating production moves the constraint to verification, the exact layer where foundation knowledge becomes structural&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/ai-maxxing-vs-fighting-against-it/&#34; &gt;AI-Maxxing and Resistance Are the Same Mistake&lt;/a&gt; - the depreciating-versus-compounding two-year test this article applies to low-level skills, and the two-camps-one-error structure it borrows&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the durable-versus-ephemeral distinction that frames why mental models compound while syntax decays&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - the onboarding paradox this article traces back to its root cause in the vanished struggle curriculum&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt; - how skills encode the describable process but cannot encode the foundation judgment this article argues we still have to teach by hand&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://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/&#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=www.joelonsoftware.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Spolsky, &amp;ldquo;The Law of Leaky Abstractions&amp;rdquo;&lt;/a&gt; - the original framing for why every abstraction eventually fails at the layer underneath, which is where foundation knowledge pays&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Theory of Constraints&amp;rdquo;&lt;/a&gt; - the framework for why automating code production relocates rather than removes the bottleneck, landing it on verification&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/No_Silver_Bullet&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;No Silver Bullet&amp;rdquo;&lt;/a&gt; - Brooks&amp;rsquo;s split between accidental complexity (the syntax and boilerplate AI now handles) and essential complexity (the mental model of the problem it cannot)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Accidental_complexity&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Accidental complexity&amp;rdquo;&lt;/a&gt; - the distinction that lets you sort low-level trivia, which is accidental and depreciating, from low-level mental models, which are essential and compounding&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Vibe_coding&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Vibe coding&amp;rdquo;&lt;/a&gt; - the extreme of the &amp;ldquo;writing code is over&amp;rdquo; position, used here as the steelman argued against rather than a strawman&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://simonwillison.net/2025/Mar/19/vibe-coding/&#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=simonwillison.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Willison, &amp;ldquo;Vibe coding&amp;rdquo;&lt;/a&gt; - a practitioner&amp;rsquo;s account of what you can and cannot safely delegate, and why supervision still requires understanding the output&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What I&#39;ve built and what I need: June 2026</title>
      <link>https://tomrochette.com/what-ive-built-and-what-i-need/2026-06/</link>
      <pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-ive-built-and-what-i-need/2026-06/</guid>
      <category>what-ive-built-and-what-i-need</category><category>personal-update</category><category>skills</category><category>ai</category><category>automation</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Over the month since May, the &lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents&lt;/a&gt; repository &lt;strong&gt;evolved from building the SDLC pipeline into a mature, self-improving system&lt;/strong&gt;.&#xA;The biggest shift was adding verification and consistency tooling, introducing stateful SDLC tracking, and standardizing conventions across the skill library.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Have Been Working On&#xA;    &lt;div id=&#34;what-i-have-been-working-on&#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-i-have-been-working-on&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Added verification and consistency tooling.&lt;/strong&gt;&#xA;The latter half of the month focused on checking the system&amp;rsquo;s own work.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/validate-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;validate-pr&lt;/a&gt; runs runtime validation of PRs, checking out a branch, building it, and proving every claim in the PR description through execution.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/verify-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;verify-pr&lt;/a&gt; performs static code inspection covering quality, correctness, and architecture alignment.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/backpropagate-sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;backpropagate-sdlc&lt;/a&gt; walks the SDLC artifact chain in reverse, from code back to issue, to verify end-to-end traceability and detect drift accumulated across phases.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-repository/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-repository&lt;/a&gt; ensures the entire repository stays consistent across SDLC, code, tests, documentation, types, and observability.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/improve-autonomy/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;improve-autonomy&lt;/a&gt; assesses what would be needed to run a session fully autonomously end to end.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Overhauled the SDLC infrastructure.&lt;/strong&gt;&#xA;The old bootstrap-sdlc was replaced by &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-sdlc&lt;/a&gt;, which reconciles the codebase with the &lt;code&gt;.sdlc/&lt;/code&gt; directory instead of just bootstrapping it.&#xA;A new &lt;code&gt;.sdlc/state.yml&lt;/code&gt; file in worktrees tracks the current phase, GitHub reference, and feature, giving skills persistent context across invocations.&#xA;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sdlc-status/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sdlc-status&lt;/a&gt; skill was extracted and heavily improved through multiple iterations, adding vocabulary tooltips, open questions, and a footer.&#xA;Observability and telemetry phases were added to the SDLC pipeline, extending coverage from needs assessment through deployment and retrospective.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/qualify-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;qualify-issue&lt;/a&gt; drives a multi-round Q&amp;amp;A loop to gather enough information before requirements.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-feasibility/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-feasibility&lt;/a&gt; / &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-feasibility/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-feasibility&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-existing-solutions/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-existing-solutions&lt;/a&gt; / &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-existing-solutions/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-existing-solutions&lt;/a&gt; assess viability and survey prior art before committing to a build.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/fix-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;fix-issue&lt;/a&gt; orchestrates a bug fix end to end by delegating to reproduce-issue, create-implementation, and create-pr.&#xA;Post-merge coverage extends through &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/deploy-pr/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;deploy-pr&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/observe-production/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;observe-production&lt;/a&gt;, which deploy changes and verify SLOs and error rates in production.&#xA;Production health is planned from the start with &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-observability/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-observability&lt;/a&gt; / &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-observability/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-observability&lt;/a&gt; / &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/audit-observability/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;audit-observability&lt;/a&gt;, which define logging, metrics, tracing, and alerting for each feature.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-telemetry/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-telemetry&lt;/a&gt; / &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-telemetry/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-telemetry&lt;/a&gt; define the analytics events for each feature.&#xA;Cross-skill conventions were consolidated into a shared references file, and per-repository AGENTS.md overrides can now be stored under &lt;code&gt;repositories/&lt;/code&gt; for project-specific instructions.&#xA;SDLC artifacts produced by the skills across projects I contribute to or monitor are tracked in a dedicated &lt;a href=&#34;https://github.com/TomzxCode/sdlc&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sdlc&lt;/a&gt; repository.&#xA;That repository includes automation to generate static HTML status pages from the output of the &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sdlc-status/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sdlc-status&lt;/a&gt; skill.&#xA;Each project&amp;rsquo;s artifacts are reviewed weekly by &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sync-sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sync-sdlc&lt;/a&gt; to detect and correct drift.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Shipped 7 maintenance skills for code quality.&lt;/strong&gt;&#xA;A new &amp;ldquo;maintenance&amp;rdquo; skill category was added covering security auditing, code duplication detection, type gap analysis, churn analysis, and related diagnostics.&#xA;These maintenance skills were integrated into the SDLC pipeline as a structured diagnose-harden-clean-document workflow, giving every feature a code health pass alongside the existing requirements-to-learnings flow.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Polished PR and issue workflows.&lt;/strong&gt;&#xA;Issue triage gained duplicate detection and smarter label management, and triage-issue was split out from triage-issues for single-issue versus batch processing.&#xA;The &lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; CLI was introduced and integrated into the review and feedback skills.&#xA;It adds inline PR review comments, pending reviews, and comment stashing that the standard &lt;code&gt;gh&lt;/code&gt; CLI does not support.&#xA;Reversibility checks were added across review-* skills, and forward compatibility checks were introduced.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-issue&lt;/a&gt; had its duplicate checking restored and time estimates improved.&#xA;A new &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/automate-session/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;automate-session&lt;/a&gt; skill was added to identify repetitive workflows worth encoding as skills.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Added new lifecycle and utility skills.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-needs-assessment/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-needs-assessment&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-needs-assessment/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-needs-assessment&lt;/a&gt; evaluate whether a feature addresses a genuine need before investing in feasibility or requirements.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/research-article/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;research-article&lt;/a&gt; maps the state of the art before writing, producing a research brief with organized sources.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/setup-docs-site/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;setup-docs-site&lt;/a&gt; scaffolds a MkDocs documentation site with a GitHub Actions publish workflow.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/vacation-handoff/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;vacation-handoff&lt;/a&gt; generates a pre-leave handoff covering deadlines, on-call coverage, and in-flight work.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/audit-attention/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;audit-attention&lt;/a&gt; analyzes how time splits between compounding and depreciating activities using the two-year test, suggesting what to delegate versus protect.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-message/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-message&lt;/a&gt; improves outgoing messages by removing negative tone and adding actionable suggestions.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/summarize-meeting/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;summarize-meeting&lt;/a&gt; produces a structured meeting summary from a transcript file.&#xA;&lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/review-skills/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;review-skills&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/compare-skills/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;compare-skills&lt;/a&gt; audit the skill library itself for duplicates, broken references, orphaned skills, and practices worth adopting from other libraries.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Closed three of last month&amp;rsquo;s needs.&lt;/strong&gt;&#xA;Replying to inline PR comments, listed as a need in May, is now fully integrated into the review and feedback skills via &lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt;.&#xA;Incremental PR description updates, also listed in May, are now handled by the &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/update-pr-description/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;update-pr-description&lt;/a&gt; skill, which makes minimal adjustments to the existing description after new commits rather than regenerating from scratch.&#xA;Bug reproduction now triggers automatically when the &amp;ldquo;bug&amp;rdquo; label is added to an issue via &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/reproduce-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;reproduce-issue&lt;/a&gt;, though commenting results back on the issue is still unreliable.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Currently Need&#xA;    &lt;div id=&#34;what-i-currently-need&#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-i-currently-need&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;From last month, the following are still needed in priority order:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/8&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Scheduled issue-to-PR automation in OpenChamber&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/6&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Memory that agents manage automatically&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/5&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Accuracy pass on daily summaries&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/9&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Automatic context clearing between execution and review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The new needs for this month:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/7&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Skill usage tracking&lt;/a&gt;.&lt;/strong&gt;&#xA;I started using &lt;a href=&#34;https://github.com/kenn-io/agentsview&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agentsview&lt;/a&gt;, which lets you filter conversation logs on terms.&#xA;Given a list of skill names over time, it is possible to filter on those names as long as they were not expanded.&#xA;OpenCode only expands slash commands if they start a message, so prefixing them with a space prevents auto-expansion and would allow tracking, but that workaround is inelegant and needs a cleaner solution.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/4&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Contextual Slack support&lt;/a&gt;.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/TomzxCode/slack-cached&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slack-cached&lt;/a&gt; can already read Slack threads, and given the right working directory it may have enough relevant context to help users better than generic Q&amp;amp;A pairs.&#xA;What remains is connecting it to an actual support workflow.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/14&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Automate issue triage follow-up conversations&lt;/a&gt;.&lt;/strong&gt;&#xA;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/triage-issues/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;triage-issues&lt;/a&gt; skill currently sends a single message when an issue is received.&#xA;If the user replies, no further LLM interaction happens.&#xA;The triage loop should continue the conversation until the issue is fully qualified.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/10&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Reliable bug reproduction comments&lt;/a&gt;.&lt;/strong&gt;&#xA;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/reproduce-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;reproduce-issue&lt;/a&gt; skill now triggers automatically when the &amp;ldquo;bug&amp;rdquo; label is added to an issue, but commenting the reproduction results back on the issue is unreliable and needs to be stabilized.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Introduce loops to automate skill usage.&lt;/strong&gt;&#xA;As described in &lt;a href=&#34;https://tomrochette.com/loops-as-files/&#34; &gt;Loops as Files&lt;/a&gt;, loops provide a scheduling layer that can run skills on a recurring basis without manual triggering.&#xA;Connecting skills to loops would enable workflows like automated issue triage, weekly repository syncs, and scheduled PR reviews to run unattended.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Explore routines, habits, and event-driven skill triggering.&lt;/strong&gt;&#xA;Beyond loops, I want to investigate routines and event-driven triggers that fire skills when the right conditions occur.&#xA;As the skill library grows past 130 skills, some are never used simply because nothing is set up to invoke them.&#xA;Connecting those skills to the right trigger or schedule would enable work that currently goes undone.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Improve the SDLC status report.&lt;/strong&gt;&#xA;As I work on large features, iterating involves back and forth between SDLC stages that requires changes to be backported and then forward propagated.&#xA;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sdlc-status/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;sdlc-status&lt;/a&gt; report needs better content and visualization to make this flow visible and navigable.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reduce manual testing and validation.&lt;/strong&gt;&#xA;I spend too much time manually testing and validating that a feature works as expected.&#xA;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/improve-autonomy/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;improve-autonomy&lt;/a&gt; skill should help close this gap, but the challenge is behavioral: I instinctively revert to doing it myself instead of immediately asking how an agent could do what I am about to do.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Rework llm-augmented-workflows for flexibility.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/TomzxCode/llm-augmented-workflows&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;llm-augmented-workflows&lt;/a&gt; needs to be reworked to handle feature and bug fix requests flows more flexibly, and to support other harnesses beyond Claude Code such as OpenCode and Pi.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>AI-Maxxing and Resistance Are the Same Mistake: Optimize Attention, Not AI Quantity</title>
      <link>https://tomrochette.com/ai-maxxing-vs-fighting-against-it/</link>
      <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/ai-maxxing-vs-fighting-against-it/</guid>
      <category>ai</category><category>llm</category><category>strategy</category><category>productivity</category><category>judgment</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Two camps have formed around LLMs, and they sound like opposites.&#xA;One wants AI in everything, automating every task that can be automated, measuring success by how little the human touches.&#xA;The other wants AI kept at a distance, preserving the craft, the understanding, and the roles that made the field what it is.&#xA;&lt;strong&gt;They are not opposites; they are the same mistake pointed in different directions, and the mistake is optimizing how much AI to use instead of where to spend the attention AI frees up.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Two Stances, One Error&#xA;    &lt;div id=&#34;two-stances-one-error&#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;#two-stances-one-error&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;AI-maxxing treats the fraction of work delegated to a model as a score to be maximized.&#xA;If a task can be automated, it should be, and the human&amp;rsquo;s remaining job is to orchestrate ever more automation.&#xA;Its logical endpoint is the self-evolving codebase, the LLM agent company, the one-person team driving a dozen agents in parallel, none of them jokes and all of them early sketches of a genuine stance.&lt;/p&gt;&#xA;&lt;p&gt;Resistance treats the fraction of work kept in human hands as a value to be defended.&#xA;If a task can be done by hand, it should be, because doing it by hand is what builds the skill and the identity that make the work worth doing.&#xA;Its logical endpoint is the engineer in 2026 still typing boilerplate from memory and calling it craft.&lt;/p&gt;&#xA;&lt;p&gt;Each camp has a valid insight.&#xA;The AI-maxxer is right that production has stopped being the bottleneck, and that clinging to manual production is no longer rational.&#xA;The resistor is right that not everything delegable should be delegated, because delegation can erode the very capability that makes delegation safe.&#xA;&lt;strong&gt;Both are right about the other&amp;rsquo;s blind spot and wrong about their own, because neither is asking the question that actually decides the outcome.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Question Neither Camp Asks&#xA;    &lt;div id=&#34;the-question-neither-camp-asks&#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-question-neither-camp-asks&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The question that matters is not &amp;ldquo;how much AI should I use?&amp;rdquo;&#xA;It is &amp;ldquo;of the things I do, which are depreciating and which are compounding, and does AI move each one in the right direction?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;A depreciating activity is one whose value drops as the environment changes.&#xA;Typing boilerplate, memorizing an API, writing the fifth CRUD endpoint of the week: these were valuable when production was scarce, and their value keeps dropping every month that models get better.&#xA;A compounding activity is one whose value rises the more of it you do, and that feeds back into everything else.&#xA;Understanding a domain deeply, holding taste about what to build, judging whether a piece of code solves the right problem: these do not decay, and they make every other thing you do more effective.&lt;/p&gt;&#xA;&lt;p&gt;The right stance follows from this distinction immediately.&#xA;&lt;strong&gt;Delegate depreciating activities ruthlessly, and protect compounding activities ferociously.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The AI-maxxer breaks this rule by applying delegation to everything, including the compounding activities, and slowly weakens the judgment layer that makes the delegation produce anything worth having.&#xA;The resistor breaks it by applying the protection rule to everything, including the depreciating activities, and slowly trades future capability to preserve a skill the market no longer rewards.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why AI-Maxxing Is the More Insidious Error&#xA;    &lt;div id=&#34;why-ai-maxxing-is-the-more-insidious-error&#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;#why-ai-maxxing-is-the-more-insidious-error&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the asymmetry that makes this more than a polite &amp;ldquo;both sides&amp;rdquo; essay.&lt;/p&gt;&#xA;&lt;p&gt;Resistance is a recoverable error.&#xA;The resistor falls behind, notices eventually, and can adopt the tools later.&#xA;The depreciating skills they protected are still useful during the transition, and the AI is still available.&#xA;The cost is lost time, which is significant but bounded.&lt;/p&gt;&#xA;&lt;p&gt;AI-maxxing is an insidious error, because it feels like winning the whole time.&#xA;The output keeps flowing.&#xA;The pull requests keep landing.&#xA;The agents keep producing plausible, confident, well-formatted work, and nothing in the loop tells you that the judgment layer underneath has been quietly atrophying.&lt;/p&gt;&#xA;&lt;p&gt;Delegation is not free even when the model is free.&#xA;Every time you delegate a compounding activity, deciding what to build, evaluating whether the generated code is correct, choosing between two architectures, you forgo the practice that built the judgment you would need to evaluate the delegation.&#xA;The AI-maxxer assumes judgment persists without exercise.&#xA;It does not.&#xA;&lt;strong&gt;A mind that never decides what to build loses the ability to tell whether what was built is worth shipping, and no model substitutes for that loss, because using the model well already presupposes it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This atrophy is the problem I described in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;: when you automate a layer, the bottleneck moves up to a more judgment-heavy layer, it does not disappear.&#xA;The difference is that the bottleneck article described the move as something that happens to the system.&#xA;AI-maxxing is what happens when you mistake the move for a disappearance, and convince yourself there is no bottleneck left worth staffing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Resistance Is Wrong, but Less Dangerously&#xA;    &lt;div id=&#34;why-resistance-is-wrong-but-less-dangerously&#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;#why-resistance-is-wrong-but-less-dangerously&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The resistor&amp;rsquo;s error is the opposite, and it deserves to be stated fairly.&lt;/p&gt;&#xA;&lt;p&gt;Most of what the resistor calls craft is just production, and production has stopped being the scarce thing.&#xA;Writing code by hand does not teach the domain faster than reading code, including generated code, with intent.&#xA;Memorizing an API does not make you a better architect; it makes you a faster typist, for an API that will be deprecated in eighteen months.&#xA;&lt;strong&gt;Protecting a depreciating activity in the name of craft is not craft; it is nostalgia that will not last.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The legitimate part of resistance is the fear that delegation erodes capability.&#xA;That fear is correct, and the AI-maxxer should adopt it too.&#xA;But the answer is not to refuse delegation across the board.&#xA;The answer is to refuse it selectively, at exactly the compounding activities where the erosion matters, and to embrace it everywhere else so aggressively that you free up the time to do the compounding work properly.&lt;/p&gt;&#xA;&lt;p&gt;The resistor who types their own boilerplate to stay skilled ends up with less time for the deep domain work that would actually build their skill, and they are protecting the wrong layer.&#xA;The AI-maxxer who delegates the deep domain work to &amp;ldquo;focus on orchestration&amp;rdquo; ends up with nothing left to orchestrate well, because orchestration without domain depth is just queue management.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Test That Settles It&#xA;    &lt;div id=&#34;the-test-that-settles-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;#the-test-that-settles-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For any activity on your plate, ask one question.&#xA;If I let the model do this for the next two years, will the me that emerges be more valuable, or less, than the me that kept doing it by hand?&lt;/p&gt;&#xA;&lt;p&gt;Boilerplate, scaffolding, routine tests, formatting, summarizing a thread, drafting a first pass at a known pattern: delegate all of it, and the you that emerges after two years is more valuable, because you spent those two years on something else that compounded.&#xA;Deciding what to build, judging whether a design is right, reading a hard paper with the intent of being able to teach it, debugging a subtle failure by reasoning about the system: keep these, even when a model offers to do them, because the two years of practice is the entire asset.&lt;/p&gt;&#xA;&lt;p&gt;Notice that the test is about the allocation of your attention, not the quantity of AI you use.&#xA;An engineer who delegates ninety percent of their work to a model and spends the freed time going deeper on the remaining ten percent is not the AI-maxxer this essay argues against.&#xA;They are doing it right, and the high delegation ratio is a symptom of having correctly identified their compounding layer, not a target they are optimizing for.&#xA;&lt;strong&gt;The number to watch is not how much you delegate; it is how much of your remaining time lands on compounding work.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Boundary Moves, and That Is the Hard Part&#xA;    &lt;div id=&#34;the-boundary-moves-and-that-is-the-hard-part&#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-boundary-moves-and-that-is-the-hard-part&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The complication, and the reason the sorting is not a one-time exercise, is that the line between depreciating and compounding is not fixed.&lt;/p&gt;&#xA;&lt;p&gt;A thing that was compounding yesterday can become depreciating tomorrow.&#xA;Writing SQL by hand was once a compounding skill, a path to a deep understanding of how the data informs the business; today the model writes the query and the deep part is knowing what to ask it for and whether the result is truthful.&#xA;Reading logs was once a compounding skill; increasingly the model triages them and the deep part is deciding which anomalies matter.&#xA;Each shift in capability redraws the line, and the stance that worked last year can become either error in the next.&lt;/p&gt;&#xA;&lt;p&gt;The moving boundary is why neither camp has a stable answer.&#xA;The AI-maxxer&amp;rsquo;s &amp;ldquo;delegate everything&amp;rdquo; is wrong because some of what they delegate is still compounding, and the resistor&amp;rsquo;s &amp;ldquo;do everything by hand&amp;rdquo; is wrong because some of what they protect has already stopped compounding.&#xA;&lt;strong&gt;The only stable skill is the meta-skill of repeatedly telling the two apart, and that meta-skill is itself compounding, which is the strongest case I can make for spending attention on it.&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;p&gt;Stop measuring yourself by how much AI you use, in either direction.&#xA;Run the inventory instead.&#xA;List the activities that fill your week, and mark each one depreciating or compounding, using the two-year test.&#xA;Then act forcefully in both directions: delegate the depreciating ones as aggressively as you can, and reserve time for the compounding ones so that the time you freed up actually lands on them.&lt;/p&gt;&#xA;&lt;p&gt;Do not be surprised if the result is a higher delegation ratio than the resistor would tolerate and a lower one than the AI-maxxer would brag about.&#xA;That is what getting it right looks like.&#xA;The ratio is an output, not a target.&lt;/p&gt;&#xA;&lt;p&gt;And watch the boundary.&#xA;Re-run the inventory every few months, because the model&amp;rsquo;s growth will have moved it, and an activity that was worth keeping may now be worth delegating, or, more dangerously, the reverse.&#xA;The most expensive mistake in either direction is the one you keep making because you sorted the list once and never looked again.&lt;/p&gt;&#xA;&lt;p&gt;The AI-maxxer and the resistor are each certain they have found the answer, and that certainty is the actual cost.&#xA;&lt;strong&gt;The correct stance is uncomfortable: delegate like a maximalist, protect like a minimalist, and never stop asking which is which.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - why automating a layer moves the bottleneck up to a more judgment-heavy layer rather than away, the mechanism that makes AI-maxxing hollow&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/keeping-up-with-ai/&#34; &gt;Keeping Up With AI Is a Losing Strategy&lt;/a&gt; - the durable-versus-ephemeral distinction this article generalizes from information consumption to the whole of work&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - which friction is structural and which is waste, the team-level version of the same allocation question&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; - defending durable standards while letting ephemeral ones go, a concrete instance of the selective-protection approach argued for here&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; - the near-limit of AI-maxxing at organizational scale, and what it still requires of human judgment&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://en.wikipedia.org/wiki/Goodhart%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Goodhart&amp;rsquo;s law&lt;/a&gt; - why maximizing a proxy (fraction of work delegated) undermines the outcome the proxy stood for&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Theory of constraints&lt;/a&gt; - the framework for why removing one bottleneck reveals the next, and why delegation never eliminates the judgment layer&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Automation_bias&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Automation bias&lt;/a&gt; - the tendency to over-trust automated output, the failure mode that lets AI-maxxing feel like winning while judgment atrophies&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Satisficing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Satisficing&lt;/a&gt; - settling for &amp;ldquo;good enough&amp;rdquo; outputs, the silent cost of delegating compounding activities to a system that optimizes plausibility&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Keeping Up With AI Is a Losing Strategy</title>
      <link>https://tomrochette.com/keeping-up-with-ai/</link>
      <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/keeping-up-with-ai/</guid>
      <category>ai</category><category>llm</category><category>information-overload</category><category>productivity</category><category>learning</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Every week brings a new frontier model, a new agent framework, a new benchmark, and a new wave of posts explaining why this latest development changes everything.&#xA;The production of AI-related information is growing exponentially.&#xA;My ability to consume it is not, and neither is yours.&#xA;&lt;strong&gt;Keeping up is the wrong goal, and chasing it will quietly consume the time and attention you need to actually use any of it.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Asymmetry&#xA;    &lt;div id=&#34;the-asymmetry&#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-asymmetry&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Information_overload&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Information overload&lt;/a&gt; is not new.&#xA;What is new is the asymmetry between production and consumption in a domain that is itself being transformed by the technology it covers.&lt;/p&gt;&#xA;&lt;p&gt;A human reads at roughly the same rate today as a generation ago: a few hundred words per minute, a handful of long-form pieces per day, a finite number of hours in the week.&#xA;Meanwhile the supply of AI content is compounding.&#xA;arXiv&amp;rsquo;s machine learning categories add thousands of papers every month, with submission volumes &lt;a href=&#34;https://arxiv.org/help/stats&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;climbing year over year&lt;/a&gt;.&#xA;Model providers ship flagship releases on a monthly cadence where they used to ship annually.&#xA;And now a meaningful fraction of that content is itself written, summarized, or generated by LLMs, which means: AI produces content about AI faster than humans can read content about AI.&lt;/p&gt;&#xA;&lt;p&gt;The loop is structurally different from &amp;ldquo;there is a lot to read.&amp;rdquo;&#xA;&lt;strong&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Half-life_of_knowledge&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;half-life&lt;/a&gt; of any specific fact is shrinking while the rate at which new facts arrive is rising.&lt;/strong&gt;&#xA;Both halves of the ratio are changing at once, and both changes make keeping up harder.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why &amp;ldquo;Just Keep Up&amp;rdquo; Fails&#xA;    &lt;div id=&#34;why-just-keep-up-fails&#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;#why-just-keep-up-fails&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The instinctive response to the volume of AI content is to read faster, subscribe to more newsletters, and make more time.&#xA;I tried all three.&#xA;Reading faster works for a linear stream.&#xA;The strategy fails when the stream grows exponentially.&lt;/p&gt;&#xA;&lt;p&gt;Every new source you add also adds its own outgoing links, its own recommendations, its own &amp;ldquo;you should also read this.&amp;rdquo;&#xA;The graph of things you could read grows faster than the list of things you have read.&#xA;&lt;strong&gt;You are not behind because you are undisciplined.&lt;/strong&gt;&#xA;&lt;strong&gt;You are behind because the target is moving faster than your means of reaching it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The cost is not only time.&#xA;Constant context-switching between model announcements, framework launches, and benchmark debates produces the same attention residue and decision fatigue that come from managing too many concurrent tasks.&#xA;The result is feeling informed without being informed, superficial awareness with nothing behind it.&#xA;You know the names of ten new models and cannot explain how any of them differ in a way that matters.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Reframe: Optimize for Signal, Not Coverage&#xA;    &lt;div id=&#34;the-reframe-optimize-for-signal-not-coverage&#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-reframe-optimize-for-signal-not-coverage&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Coverage is impossible, so stop measuring yourself against it.&#xA;The objective is not to read everything.&#xA;&lt;strong&gt;The objective is to make good decisions about what to read, what to build, and what to ignore.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Making those decisions is a filtering problem, not a reading problem.&#xA;And filters are something you can design, tune, and improve, unlike your reading speed.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Separate the Durable From the Ephemeral&#xA;    &lt;div id=&#34;separate-the-durable-from-the-ephemeral&#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;#separate-the-durable-from-the-ephemeral&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most of what feels urgent in the AI cycle is ephemeral.&#xA;A specific model&amp;rsquo;s benchmark numbers, a specific launch event, a specific viral demo: these items date within weeks.&#xA;A surprising amount is durable.&#xA;The mechanics of attention, the basics of context and prompting, the theory of constraints in a pipeline, the economic profile of inference costs, the difference between evaluation and vibes: these ideas barely change across model generations.&lt;/p&gt;&#xA;&lt;p&gt;When you are time-constrained, overweight the durable.&#xA;&lt;strong&gt;Read one paper that teaches you a concept you will reuse for years over ten posts that summarize this week&amp;rsquo;s leaderboard.&lt;/strong&gt;&#xA;The ephemeral items are not worthless, but they should be consumed on demand, when a specific decision requires them, not on a schedule driven by fear.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Build a Funnel, Not a List&#xA;    &lt;div id=&#34;build-a-funnel-not-a-list&#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;#build-a-funnel-not-a-list&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A reading list is an unordered collection of &amp;ldquo;should read&amp;rdquo; items.&#xA;A funnel is a staged filter that gets cheaper at each stage.&lt;/p&gt;&#xA;&lt;p&gt;At the top, sample broadly through a small number of trusted curators and aggregators, and let them do the first pass.&#xA;At the middle, use titles and one-paragraph summaries to decide what earns a closer look.&#xA;At the bottom, read the few items that survive, deeply.&#xA;Most items should be discarded at the top of the funnel, never reaching your full attention.&#xA;&lt;strong&gt;The goal of a funnel is to discard almost everything, confidently and without guilt.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the same principle behind supervising many agents at once: you cannot hold it all in working memory, so you externalize state, standardize summaries, and let most of the system run without your involvement (see &lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt;).&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Use AI to Compress the Stream to Your Bandwidth&#xA;    &lt;div id=&#34;use-ai-to-compress-the-stream-to-your-bandwidth&#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;#use-ai-to-compress-the-stream-to-your-bandwidth&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The same technology producing this volume of content is also the best tool for handling it.&lt;/p&gt;&#xA;&lt;p&gt;Have an LLM summarize a forty-page paper into the three things you actually need.&#xA;Have it compare two model release notes and tell you what differs in a way that affects your work.&#xA;Have it triage a week of submissions and rank them against your stated interests.&#xA;&lt;strong&gt;Used this way, the LLM is a lossy compressor tuned to the decisions you actually need to make.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The risk is that summaries carry the summarizer&amp;rsquo;s blind spots.&#xA;Mitigate it by going to primary sources for anything you intend to act on, and by keeping the durable layer of your understanding built from full readings, not compressions.&#xA;Summaries are for triage and breadth; depth still requires reading the original document.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Consume on Demand, Not on Schedule&#xA;    &lt;div id=&#34;consume-on-demand-not-on-schedule&#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;#consume-on-demand-not-on-schedule&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Push consumption, reading whatever arrived in your feed today, optimizes for the producer&amp;rsquo;s schedule.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Just-in-time_learning&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Pull consumption&lt;/a&gt;, reading what a current problem requires, optimizes for yours.&lt;/p&gt;&#xA;&lt;p&gt;Most of what you &amp;ldquo;need to know&amp;rdquo; about a new model or tool only matters once you have a task that touches it.&#xA;Until then, the information is inventory.&#xA;When the task arrives, the information is usually still there, and a focused hour of just-in-time learning will beat ten hours of distracted pre-reading.&#xA;&lt;strong&gt;Knowing where to find something when you need it is a more durable skill than knowing it now.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This approach feels uncomfortable, because it requires trusting that you will not miss something critical.&#xA;You will miss some things.&#xA;You will also miss things by spending your day reading instead of doing, and those misses are silent.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pick a Few Sources and Defend Them&#xA;    &lt;div id=&#34;pick-a-few-sources-and-defend-them&#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;#pick-a-few-sources-and-defend-them&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There are more newsletters, podcasts, and feed channels than any person can sample, and most of them recycle the same primary sources.&#xA;Find the small set that consistently adds signal rather than volume, and defend that set against additions.&#xA;&lt;strong&gt;Every new subscription should displace an existing one, not stack on top of it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The same applies to people.&#xA;A few colleagues or communities that share your context will filter better than any algorithm, because they know what you already know and what you are trying to do.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Skill That Compounds&#xA;    &lt;div id=&#34;the-skill-that-compounds&#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-skill-that-compounds&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Fighting the volume of AI content makes it easy to miss what actually compounds.&lt;/p&gt;&#xA;&lt;p&gt;Your current knowledge of AI is a depreciating asset.&#xA;Specific model behaviors, tool APIs, and leaderboard rankings decay within months.&#xA;What does not depreciate is the rate at which you can learn a new tool when you need it, the quality of your filter, and your understanding of the durable layer beneath the releases.&#xA;&lt;strong&gt;These compound, and they are the only things in this cycle that do.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A developer who has internalized the theory of constraints, the structure of an LLM pipeline, and the difference between evaluation and marketing can pick up this week&amp;rsquo;s framework in an afternoon.&#xA;A developer who chased every release for two years but never built that foundation knows a hundred tool names and cannot reason about any of them.&#xA;The first developer can adapt to the pace of change.&#xA;The second is controlled by it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bottleneck Moves, Again&#xA;    &lt;div id=&#34;the-bottleneck-moves-again&#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-bottleneck-moves-again&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The deeper pattern is the one described in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;.&#xA;When code generation stopped being the bottleneck, review became it.&#xA;When review is automated, specification and judgment become it.&lt;/p&gt;&#xA;&lt;p&gt;Information consumption has its own version.&#xA;Once reading everything stops being possible, triage becomes the bottleneck.&#xA;Once triage is delegated to AI, choosing what to care about, at the level of goals and taste, becomes the bottleneck.&#xA;&lt;strong&gt;Each time you solve one layer, the constraint moves up to a more human, more judgment-heavy layer.&lt;/strong&gt;&#xA;The judgment layer is where the durable work happens, and it is also the layer that reading faster helps least.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What to Actually Do&#xA;    &lt;div id=&#34;what-to-actually-do&#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-actually-do&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Stop trying to keep up.&#xA;Pick a small set of high-signal sources and ignore the rest.&#xA;Overweight durable concepts over ephemeral releases.&#xA;Build a funnel that discards most things.&#xA;Use LLMs to compress the stream to your bandwidth, then read primary sources for anything you will act on.&#xA;Switch from push to pull: learn on demand, when an actual task requires it.&#xA;And spend the time you reclaim on the layer that compounds, your filter, your learning rate, and your judgment.&lt;/p&gt;&#xA;&lt;p&gt;You will miss things.&#xA;&lt;strong&gt;So will the person who reads all day, and they will also have missed the chance to build anything with what they read.&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;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - the same constraint-moving pattern applied to the development pipeline; this article extends it to information consumption&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the cognitive-limit strategies (externalize state, funnel, batch) that a good reading filter reuses&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - how teams, not just individuals, absorb rapid AI-driven change&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://en.wikipedia.org/wiki/Information_overload&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Information overload&lt;/a&gt; - the long-standing name for the underlying problem, predating the current AI cycle&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Half-life_of_knowledge&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Half-life of knowledge&lt;/a&gt; - frames why specific facts decay while fundamentals hold&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Just-in-time_learning&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Just-in-time learning&lt;/a&gt; - the pull-based alternative to scheduled, fear-driven consumption&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/help/stats&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;arXiv usage statistics&lt;/a&gt; - makes the production side of the asymmetry concrete&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Loops as Files: The Scheduling Layer Skills Forgot</title>
      <link>https://tomrochette.com/loops-as-files/</link>
      <pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/loops-as-files/</guid>
      <category>llm</category><category>ai-agents</category><category>skills</category><category>automation</category><category>loops</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Skills as files solved one half of the automation problem.&#xA;They told the model &lt;em&gt;how&lt;/em&gt; to do a task, versioned and reviewable, loaded into context on demand.&#xA;They did not solve the other half.&#xA;They told the model nothing about &lt;em&gt;when&lt;/em&gt; to run.&#xA;&lt;strong&gt;A skill is inert until something invokes it, and in practice that something is almost always a human typing a command.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That leaves the most experienced agent in your system doing nothing until you remember to ask it.&#xA;It also leaves every event in your environment, the issue that was just opened, the Slack thread that just became active, the dependency that just shipped a security patch, waiting for a human to notice and forward it to the right skill.&#xA;The human has become the scheduler.&lt;/p&gt;&#xA;&lt;p&gt;The fix is the same form as the fix for the variance problem in &lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt;: take the invisible process out of someone&amp;rsquo;s head and make it a file.&#xA;Except the process to extract now is not &amp;ldquo;how do I triage an issue,&amp;rdquo; it is &amp;ldquo;when do I triage issues, and what triggers that decision.&amp;rdquo;&#xA;That belongs in a file too, and that file is a loop.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Asymmetry Between How and When&#xA;    &lt;div id=&#34;the-asymmetry-between-how-and-when&#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-asymmetry-between-how-and-when&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Skills files normalized a useful idea.&#xA;The prompt is the asset, the asset is text, text is versioned in git, and versioned text is reviewed, diffed, shared, and reused like code.&#xA;The same model that made skills valuable applies cleanly to the trigger layer, but the trigger layer is still being treated as an implementation detail.&#xA;It lives in crontabs nobody reads, in GitHub Action YAMLs that drift away from the skills they invoke, in shell scripts that bake agent invocations into system paths.&lt;/p&gt;&#xA;&lt;p&gt;The result is that the two halves of an autonomous workflow are managed in different places.&#xA;The prompt is curated.&#xA;The trigger is improvised.&#xA;When the prompt changes, the trigger does not, and when the trigger breaks, nobody who understands the prompt finds out until the agent has been silent for a week.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The schedule is part of the behavior.&#xA;A skill that runs on &lt;code&gt;/deploy&lt;/code&gt; and the same skill that runs at 02:00 every Tuesday are not the same skill.&#xA;They have different blast radius, different cost profile, and different failure modes, and they deserve to be specified, reviewed, and owned together.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What a Loop File Is&#xA;    &lt;div id=&#34;what-a-loop-file-is&#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-a-loop-file-is&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A loop file is a markdown document with two parts.&#xA;The frontmatter declares when it runs and under what constraints.&#xA;The body declares what it does, almost always by composing skills that already exist.&lt;/p&gt;&#xA;&lt;p&gt;In form it is the closest existing analog to a GitHub Actions workflow file, except the unit of work is not a shell command, it is an agent invocation with a loaded skill.&lt;/p&gt;&#xA;&lt;p&gt;A minimal example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;hourly-issue-triage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Triage new issues as they appear, every hour.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;schedule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cron&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0 * * * *&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;skills&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;triage-issue]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;budget&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-runs-per-day&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-cost-usd-per-run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0.50&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Hourly Issue Triage&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;For every issue opened since the last run, invoke &lt;span class=&#34;sb&#34;&gt;`/triage-issue`&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Defer to the skill for all classification logic.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Stop when the budget for this run is exhausted and resume on the next tick.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;That is the whole artifact.&#xA;&lt;strong&gt;The skill owns the how.&lt;/strong&gt;&#xA;&lt;strong&gt;The loop owns the when, the how-often, the how-much, and the what-to-do-when-it-breaks.&lt;/strong&gt;&#xA;Each concern is in its own file, each file is reviewable, and changes to one do not silently invalidate the other.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Frontmatter Is the Contract&#xA;    &lt;div id=&#34;the-frontmatter-is-the-contract&#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-frontmatter-is-the-contract&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The reason the frontmatter matters more than the body is that the frontmatter is the part the runtime actually parses.&#xA;It is &lt;strong&gt;the contract between the human writing the loop and the system executing it&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A skill with no frontmatter is still useful as a document.&#xA;&lt;strong&gt;A loop with no frontmatter is a skill with no trigger.&lt;/strong&gt;&#xA;So the fields that go in the frontmatter are not cosmetic metadata, they are the trigger specification, and they should be designed the way any interface is designed, with the smallest set of concepts that covers the realistic workload.&lt;/p&gt;&#xA;&lt;p&gt;The field I want to anchor on is &lt;code&gt;on&lt;/code&gt;, borrowed deliberately from GitHub Actions because the mental model is already widely understood.&#xA;&lt;code&gt;on&lt;/code&gt; says what causes this loop to fire, and its value can be one or many of three things.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Time&#xA;    &lt;div id=&#34;time&#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;#time&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;schedule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cron&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0 * * * *&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Cron is the obvious first case, and there is no reason to invent a new syntax for it.&#xA;Cron is ugly, but it is universally understood, parseable, and already supported by every scheduler the reader is likely to have.&#xA;Most loops that need to run on a clock are well expressed as a single cron expression, and loops that need more complex recurrence can compose multiple loop files.&lt;/p&gt;&#xA;&lt;p&gt;A secondary form worth supporting is an interval, for cases where wall-clock alignment does not matter:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;every&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;15m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Interval is easier to read and easier to distribute across a fleet, since N agents with &lt;code&gt;every: 15m&lt;/code&gt; will naturally desynchronize in a way that &lt;code&gt;cron&lt;/code&gt; will not.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Events&#xA;    &lt;div id=&#34;events&#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;#events&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Time is the easy case.&#xA;The interesting case is event-driven, which is where the word &amp;ldquo;loop&amp;rdquo; undersells what is going on.&#xA;A loop that fires on a schedule is just a cron job with a markdown file on top.&#xA;A loop that fires on an event is something genuinely new: a versioned, reviewable handler for things that happen in the world.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;events&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;github.issues.opened&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;owner/repo&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;labels.length == 0&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;slack.mention&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;channels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#support&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;text contains &amp;#39;sev1&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;github.pull_request.opened&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;owner/repo&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;author.trust &amp;lt; &amp;#39;trusted&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;file.changed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pyproject.toml&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;uv.lock&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metric.threshold&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metric&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;api.error_rate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;5m&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;op&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0.01&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The pattern is the same in every case: a typed event source, an optional scope, and an optional filter expression.&#xA;The types themselves are namespaced by source (&lt;code&gt;github.*&lt;/code&gt;, &lt;code&gt;slack.*&lt;/code&gt;, &lt;code&gt;file.*&lt;/code&gt;, &lt;code&gt;metric.*&lt;/code&gt;) so that adding a new integration is additive rather than a schema change.&lt;/p&gt;&#xA;&lt;p&gt;A single loop can declare multiple events, and the runtime treats them as a logical OR.&#xA;That covers the common case of &amp;ldquo;I want this skill to fire on a cron &lt;em&gt;or&lt;/em&gt; when a human pokes it,&amp;rdquo; which is exactly the pattern of most operational loops.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Webhooks&#xA;    &lt;div id=&#34;webhooks&#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;#webhooks&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The third trigger is a catch-all for events the runtime cannot subscribe to directly.&#xA;A webhook is an event source the runtime exposes rather than consumes.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;webhook&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/loops/deploy-staging&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;secret&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;${DEPLOY_WEBHOOK_SECRET}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Anything that can hit an HTTP endpoint, from a monitoring tool to a ChatOps button to a physical device, can now trigger a skill, and the access control is defined next to the prompt it gates.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Frontmatter That Prevents the Loop From Eating Your Wallet&#xA;    &lt;div id=&#34;the-frontmatter-that-prevents-the-loop-from-eating-your-wallet&#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-frontmatter-that-prevents-the-loop-from-eating-your-wallet&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Time and events say when to start.&#xA;The loop also needs to say when to stop, and this is the part that existing skill files do not need and loop files cannot exist without.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;budget&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-runs-per-day&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-cost-usd-per-run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0.50&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;concurrency&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;cancel-previous &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# cancel-previous | queue | drop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;10m&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on-failure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;alert     &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# alert | retry | escalate | ignore&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;escalation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;skill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;notify-on-call&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;failures&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;I argued in &lt;a href=&#34;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt; that cost runaway is one of the defining failure modes of autonomous systems, and a loop without a budget is one bad &lt;code&gt;while True&lt;/code&gt; away from a runaway incident.&#xA;&lt;strong&gt;Every loop file should be able to answer three questions without ambiguity: how often can this run, how much can each run spend, and what happens when it fails.&lt;/strong&gt;&#xA;&lt;strong&gt;If a loop cannot answer those questions, the runtime should refuse to start it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;concurrency&lt;/code&gt; field is the other one that proves necessary early.&#xA;A loop that runs every five minutes and takes six minutes to finish will, without a concurrency policy, slowly consume every slot the runtime has.&#xA;&lt;code&gt;cancel-previous&lt;/code&gt;, &lt;code&gt;queue&lt;/code&gt;, and &lt;code&gt;drop&lt;/code&gt; cover the realistic cases, and the right default is &lt;code&gt;cancel-previous&lt;/code&gt; for anything stateless.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Loops Compose Skills, They Do Not Replace Them&#xA;    &lt;div id=&#34;loops-compose-skills-they-do-not-replace-them&#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;#loops-compose-skills-they-do-not-replace-them&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a temptation, once you have a loop format, to start inlining the prompt into the loop body.&#xA;Resist it.&#xA;&lt;strong&gt;A loop file should read like an orchestrator, not like a skill, because it is one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The body of a loop is typically a short sequence of skill invocations, with just enough glue logic to express ordering, branching, and handoff.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Nightly Dependency Review&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`/audit-dependencies`&lt;/span&gt; against the current lockfile.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; If it reports any &lt;span class=&#34;sb&#34;&gt;`severity &amp;gt;= high`&lt;/span&gt;, &lt;span class=&#34;sb&#34;&gt;`/create-issue`&lt;/span&gt; with the audit output.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. &lt;span class=&#34;sb&#34;&gt;`/notify-on-call`&lt;/span&gt; summarizing counts and the worst offender.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Three skills, one paragraph of orchestration, fully readable.&#xA;The logic that is hard (what counts as a high-severity vulnerability, how to phrase an issue, who the on-call is) lives in the skills it invokes, where it can be improved independently, tested independently, and reused from other loops.&lt;/p&gt;&#xA;&lt;p&gt;This also keeps the loop file focused on its job.&#xA;&lt;strong&gt;A loop file that grows past a screen of text is probably doing the work of a skill and should be split.&lt;/strong&gt;&#xA;The same length discipline that keeps skills effective, which I borrowed from the &amp;ldquo;lost in the middle&amp;rdquo; argument in &lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt;, applies to loops.&#xA;If the runtime has to parse a long preamble before it even reaches the trigger, the trigger is no longer the contract.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Loops Have to Be Files&#xA;    &lt;div id=&#34;why-loops-have-to-be-files&#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;#why-loops-have-to-be-files&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every argument for skills as files applies, with minor edits, to loops as files, and one new argument applies only to loops.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Versioning.&lt;/strong&gt;&#xA;A trigger change is a behavior change.&#xA;&amp;ldquo;Run triage on every new issue&amp;rdquo; and &amp;ldquo;run triage on every new issue except those from outside contributors&amp;rdquo; are different policies with different consequences.&#xA;A trigger that lives in a crontab or a GitHub Actions YAML that nobody reviews is a policy that nobody reviewed, and reviewing it matters because the consequences of a trigger bug (silently not running, or silently running too often) are usually larger than the consequences of a prompt bug.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reviewability.&lt;/strong&gt;&#xA;A loop file in git means every change goes through a pull request, which means the blast radius of the change is visible to the people who will be paged when it goes wrong.&#xA;This is the same point I made, about code, in &lt;a href=&#34;https://tomrochette.com/the-codebase-gardener/&#34; &gt;The Codebase Gardener&lt;/a&gt;: a standard that exists only in someone&amp;rsquo;s head is lost when that person goes on vacation.&#xA;A loop that exists only in someone&amp;rsquo;s crontab will be forgotten just as quickly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Portability.&lt;/strong&gt;&#xA;A loop file describes what should happen, not where it runs.&#xA;The same file can be executed by a local scheduler during development, by a team-shared runner in production, and by a CI provider that wants to dry-run it on every commit.&#xA;That portability is what makes loops shareable across teams the way skills are shareable, and it is what makes a &amp;ldquo;loop library&amp;rdquo; a coherent concept in a way that a &amp;ldquo;crontab library&amp;rdquo; never was.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Diffability.&lt;/strong&gt;&#xA;The single most useful property of a file is that you can &lt;code&gt;git blame&lt;/code&gt; it.&#xA;When the on-call gets paged at 03:00 because the deployment loop has been firing every two minutes for an hour, the first question is &amp;ldquo;who changed the trigger, when, and why,&amp;rdquo; and the answer should be one &lt;code&gt;git log&lt;/code&gt; away, not a long manual search through a CI settings UI.&lt;/p&gt;&#xA;&lt;p&gt;The argument that applies only to loops is &lt;strong&gt;co-location with the skill&lt;/strong&gt;.&#xA;A skill file and the loop that schedules it are describing two facets of the same behavior, and when they live in the same repository, in the same format, in the same review pipeline, they evolve together.&#xA;A skill change that should have changed the trigger (say, &amp;ldquo;this skill is now expensive, run it less often&amp;rdquo;) is a change that can actually be made in the same pull request by the same person who understood the consequence.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What the Runtime Owes You&#xA;    &lt;div id=&#34;what-the-runtime-owes-you&#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-the-runtime-owes-you&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A loop format without a runtime is only a proposal.&#xA;The runtime is what makes loops safe to leave running, and it owes the operator a small, specific set of behaviors that are not optional.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Idempotency by default.&lt;/strong&gt;&#xA;A loop will be double-triggered.&#xA;The cron will fire twice during a clock skew.&#xA;The webhook will be retried.&#xA;The runtime must be willing to run the same loop with the same inputs twice and treat the second run as a no-op, which means the skills it invokes must be idempotent, which is a property worth designing into skills whether they are loop-driven or not.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Per-run state.&lt;/strong&gt;&#xA;Every run writes a state file, in the same form I described in &lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt;: what fired, what ran, what it produced, what it cost, what it will do next time.&#xA;Without this, debugging a misbehaving loop is reading logs, and reading logs is what we used to do before we had files.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A kill switch.&lt;/strong&gt;&#xA;There must be one command, one CLI flag, one environment variable, that stops every running loop and disables every scheduled trigger.&#xA;The cost of not having this is the cost of not having a circuit breaker in your electrical panel.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Observability that is not optional.&lt;/strong&gt;&#xA;A loop that fails silently is strictly worse than no loop at all, because no loop at least fails loudly when a human expected it.&#xA;Every run emits run-started, run-succeeded, run-failed, run-budget-exceeded events, and the runtime ships them to whatever sink the operator already trusts.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Dry run.&lt;/strong&gt;&#xA;&lt;code&gt;--dry-run&lt;/code&gt; evaluates the trigger, selects the skill, expands the inputs, and prints what it would have done, without invoking the model.&#xA;This is the cheapest possible way to debug a trigger filter, and it should exist on every loop runner.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Goes Wrong&#xA;    &lt;div id=&#34;what-goes-wrong&#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-goes-wrong&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Loops inherit the failure modes of any autonomous system and add two of their own.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Drift toward the measurable.&lt;/strong&gt;&#xA;A loop that fires on &lt;code&gt;github.issues.opened&lt;/code&gt; will, over time, optimize the project for issue-driven signals, because those are the signals that cause work to happen.&#xA;The project stops reacting to anything that does not show up as an event the loop can see.&#xA;This is Goodhart&amp;rsquo;s law applied to ops automation, and the defense is the same as in &lt;a href=&#34;https://tomrochette.com/the-self-evolving-repository/&#34; &gt;The Self-Evolving Repository&lt;/a&gt;: keep a human-edited roadmap, and reserve a small number of loops for periodic &amp;ldquo;what should we be working on&amp;rdquo; reflection that is not event-driven.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Loops stepping on loops.&lt;/strong&gt;&#xA;Once loops are cheap to write, people write a lot of them.&#xA;Two loops that both touch the same issue tracker, both with their own opinions about labels and priorities, will quietly conflict with each other, and the issue tracker&amp;rsquo;s state will become inconsistent.&#xA;The runtime needs loop-level isolation (separate working directories, separate state files, separate rate limits) and a registry that makes it easy to answer &amp;ldquo;which loops currently fire on this event,&amp;rdquo; the same way a codebase makes it easy to answer &amp;ldquo;which tests currently exercise this function.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Trigger rot.&lt;/strong&gt;&#xA;A loop that worked when it was written will silently stop working when the thing it triggers on changes form, the GitHub webhook payload gains a field, the Slack channel gets renamed, the metric gets relabeled.&#xA;Loops need the same periodic sweep that code needs, and the sweep is mechanical: for each loop, fire its trigger in dry-run, confirm the skill still runs, retire the loops that nobody owns.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cost runaway, again.&lt;/strong&gt;&#xA;Worth saying twice.&#xA;An event-driven loop with no budget, attached to a busy event source, can turn a busy Slack day into a four-digit API bill.&#xA;The budget field in the frontmatter exists for exactly this reason, and the runtime must enforce it hard, not warn softly.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Naming Question&#xA;    &lt;div id=&#34;the-naming-question&#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-naming-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have used &amp;ldquo;loop&amp;rdquo; throughout because it captures the simplest mental model: something that runs again and again.&#xA;But &amp;ldquo;loop&amp;rdquo; undersells the format.&#xA;A loop that fires only on &lt;code&gt;slack.mention&lt;/code&gt; is not really looping.&#xA;It is reacting.&lt;/p&gt;&#xA;&lt;p&gt;The more accurate name is probably &amp;ldquo;routine,&amp;rdquo; &amp;ldquo;trigger,&amp;rdquo; or &amp;ldquo;automation,&amp;rdquo; and the reason none of those quite works is that each one emphasizes one of the two trigger classes at the expense of the other.&#xA;&amp;ldquo;Loop&amp;rdquo; emphasizes time.&#xA;&amp;ldquo;Trigger&amp;rdquo; emphasizes events.&#xA;&amp;ldquo;Routine&amp;rdquo; emphasizes the work.&#xA;The format itself does not care.&#xA;&lt;strong&gt;The &lt;code&gt;on:&lt;/code&gt; field is the source of truth, and the file is whatever its trigger says it is.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In practice, teams that adopt this will settle on one word and use it for both, the same way &amp;ldquo;skill&amp;rdquo; is now used for files that range from one-line hints to multi-page workflows.&#xA;The word matters less than the format, and the format is: markdown, frontmatter, &lt;code&gt;on&lt;/code&gt;, a budget, a short body.&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;p&gt;You do not need a runtime to start.&lt;/p&gt;&#xA;&lt;p&gt;Find the one task that you do on a cadence and keep doing manually because it is &amp;ldquo;too small to automate.&amp;rdquo;&#xA;Triage the overnight issue queue.&#xA;Summarize the Slack channel at end of day.&#xA;Check whether dependencies have shipped patches.&#xA;That task is your first loop.&lt;/p&gt;&#xA;&lt;p&gt;Write it as a loop file, even if the runtime that will execute it does not exist yet.&#xA;Write the frontmatter faithfully, the trigger you want, the budget you would accept, the skill it should invoke.&#xA;If the skill does not exist yet, write its stub too.&lt;/p&gt;&#xA;&lt;p&gt;You now have two artifacts that describe the behavior you want, in the same repository, in the same format, reviewable in the same pull request.&#xA;When a runtime arrives (and several already will, given how cheaply existing coding agents can be wrapped in a scheduler), your loop is ready to drop in.&lt;/p&gt;&#xA;&lt;p&gt;Then do it again with the next task, and the next.&#xA;Each loop file is a piece of operational judgment that stops being a private habit and starts being a shared, owned, versioned standard.&#xA;The team that wins in this era is not the one with the most skills.&#xA;&lt;strong&gt;It is the one whose skills run, on time and on event, without anyone remembering to ask them to.&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;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt; - the case for skills as files; this article is the same argument one layer up, applied to the trigger instead of the prompt&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 autonomous loop at project scale; loop files are how you make that loop inspectable and bounded&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/managing-many-llm-agent-sessions/&#34; &gt;Managing Many Concurrent LLM Agent Sessions&lt;/a&gt; - the per-run state file pattern that loops need to inherit to be debuggable&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; - the argument that standards only count when they are encoded; triggers are standards&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - once skills make execution cheap, the leverage moves up, and the trigger layer is one of the places it moves to&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; - the cost and correlated-failure concerns that the budget and concurrency fields in a loop file exist to contain&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://en.wikipedia.org/wiki/Cron&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Cron&amp;rdquo;&lt;/a&gt; - the time-based job scheduler whose syntax the &lt;code&gt;on.schedule.cron&lt;/code&gt; field borrows wholesale, because there is no value in inventing a new one&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows&#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 Actions documentation, &amp;ldquo;Events that trigger workflows&amp;rdquo;&lt;/a&gt; - the &lt;code&gt;on:&lt;/code&gt; mental model and event taxonomy this format deliberately mirrors, so readers do not have to learn a new concept&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Idempotence&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Idempotence&amp;rdquo;&lt;/a&gt; - the mathematical property that makes loops safe to re-trigger, and therefore the property every skill invoked by a loop must be designed to have&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Goodhart%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Goodhart&amp;rsquo;s law&amp;rdquo;&lt;/a&gt; - why an event-driven loop will optimize for whatever its events measure, and why a non-event-driven reflection loop must exist alongside it&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Checklist_Manifesto&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;The Checklist Manifesto&amp;rdquo;&lt;/a&gt; - Atul Gawande&amp;rsquo;s case that disciplined, written checklists outperform expert memory, which is the same argument for trigger files as it was for skill files&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>When a Closed Decision Reopens: Breaking the Scope Relitigation Cycle</title>
      <link>https://tomrochette.com/when-a-closed-decision-reopens/</link>
      <pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/when-a-closed-decision-reopens/</guid>
      <category>software-engineering</category><category>team-management</category><category>decision-making</category><category>scope</category><category>communication</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A decision reached with your principal did not actually close the question.&#xA;It closed the question in the room where it was made.&#xA;When a new manager met the senior leader for the first time, the shared understanding that took weeks to build did not transfer, and the original ambiguity returned.&#xA;&lt;strong&gt;The cycle you cannot escape is not a scope problem. It is a context-transfer problem that looks like a scope problem.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Decision Didn&amp;rsquo;t Reopen. The Context Didn&amp;rsquo;t Transfer.&#xA;    &lt;div id=&#34;the-decision-didnt-reopen-the-context-didnt-transfer&#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-decision-didnt-reopen-the-context-didnt-transfer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When leadership says &amp;ldquo;build this feature&amp;rdquo; without saying what &amp;ldquo;this&amp;rdquo; means, they have not given you a requirement.&#xA;They have given you a vague goal, and asked you to find a concrete target inside it.&#xA;You did the right thing.&#xA;You built a demo to make the vague goal concrete enough to react to, you sat with the principal, and you negotiated a concrete, buildable target.&#xA;That work was genuine, and it was correct.&lt;/p&gt;&#xA;&lt;p&gt;Then a person who was not in the room walked into a different room with the senior leader, and the target changed.&lt;/p&gt;&#xA;&lt;p&gt;The target moving feels like betrayal, or like a failure of the new manager, or like leadership changing its mind.&#xA;It is usually none of those.&#xA;It is the predictable consequence of a decision that was never written down in a form that could travel.&#xA;A decision that exists only in the memory of the people who were present is a decision that cannot hold when it reaches anyone who was absent.&#xA;Your organization keeps generating absent people: new hires, new managers, new conversations, new quarters.&#xA;&lt;strong&gt;Every unwritten decision remains valid only until one new person enters the chain.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The senior leader was never actually aligned with you on a specific scope.&#xA;They were aligned with a feeling, which is that the feature should be impressive and should exist.&#xA;The specific, feasible compromise you reached with the principal was never transferred back to the person whose vague wish started the whole thing.&#xA;So when the topic came up again, the leader returned to the only thing they still had, which was the original wish, unmodified by everything you had since learned was impossible.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;You Have Two Problems, Not One&#xA;    &lt;div id=&#34;you-have-two-problems-not-one&#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;#you-have-two-problems-not-one&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The conversation keeps switching between two positions because two genuinely different questions have been mixed together into one discussion, and the two questions keep conflicting.&lt;/p&gt;&#xA;&lt;p&gt;The first question is the north star: what would the ideal version of this feature look like, if the tools caught up and the constraints disappeared?&#xA;That vision is valuable.&#xA;It tells you which direction to take, and it is the thing that excites leadership in the first place.&lt;/p&gt;&#xA;&lt;p&gt;The second question is the milestone: what will we actually ship this quarter, with the tools we have today?&#xA;That answer is necessarily smaller, uglier, and more compromised than the north star, and it is the only thing you can actually build.&lt;/p&gt;&#xA;&lt;p&gt;The cycle happens when leadership talks about the north star and hears your milestone answer as a refusal, and when you talk about the milestone and hear their north star answer as scope creep.&#xA;&lt;strong&gt;You are both correct, about different questions, and the conflict continues entirely because nobody has written the two answers on the same page and separated them.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The fix is to separate the questions, explicitly and in writing.&#xA;Keep the north star.&#xA;Document it, reference it, and let it do the work of inspiring people.&#xA;Then, underneath it, write separately what you are committing to build now, why that subset and not another, and what specifically would have to change for the next increment to become feasible.&#xA;The north star is a direction.&#xA;The milestone is a contract.&#xA;Confusing the two is what makes every meeting feel like the last meeting, again.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;&amp;ldquo;That&amp;rsquo;s Impossible&amp;rdquo; Is Not an Answer a Leader Can Process&#xA;    &lt;div id=&#34;thats-impossible-is-not-an-answer-a-leader-can-process&#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;#thats-impossible-is-not-an-answer-a-leader-can-process&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the cruelest part of the situation, and the one most likely to block progress.&lt;/p&gt;&#xA;&lt;p&gt;When you tell leadership &amp;ldquo;we can&amp;rsquo;t build the full vision, the tools aren&amp;rsquo;t there yet,&amp;rdquo; you are reporting a technical fact, and you expect it to be received as a boundary.&#xA;It does not.&#xA;It is received as an opinion, and a suspicious one, because every leader has heard engineers declare things impossible that later turned out to be merely hard.&#xA;The word &amp;ldquo;impossible&amp;rdquo; carries no information a decision-maker can act on.&#xA;It sounds like reluctance, and so it invites the very relitigation you are trying to end.&lt;/p&gt;&#xA;&lt;p&gt;The move that actually ends the cycle is to convert impossibility into a set of specific, dated, falsifiable claims.&#xA;Not &amp;ldquo;we can&amp;rsquo;t do X,&amp;rdquo; but &amp;ldquo;X requires capability Y, which does not exist in our stack; the closest vendor offering is at stage Z; building it ourselves is an estimated N months of work from the platform team, which is not currently funded.&amp;rdquo;&#xA;Now the leader is not arguing with your willingness.&#xA;They are looking at a menu, and the menu has prices on it.&#xA;They can choose to accept the limit, fund the enabler, or descope, but whatever they choose, they are choosing with information instead of against a feeling.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Saying &amp;ldquo;impossible&amp;rdquo; stops the decision. An itemized list of what it would take lets the decision move forward.&lt;/strong&gt;&#xA;Leaders cannot act on a flat refusal, but they will act on an itemized list, and often they will fund the capability that enables the next step.&#xA;This reframing also protects you.&#xA;The day the tools do catch up, your document already names the capability you were waiting for, and reaching the north star becomes a matter of executing a plan you wrote months ago instead of restarting the conversation from scratch.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A Verbal Decision Is Just an Opinion That Hasn&amp;rsquo;t Been Overwritten Yet&#xA;    &lt;div id=&#34;a-verbal-decision-is-just-an-opinion-that-hasnt-been-overwritten-yet&#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;#a-verbal-decision-is-just-an-opinion-that-hasnt-been-overwritten-yet&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The single highest-leverage thing you can do to stop the cycle is to insist that decisions get written down the moment they are made, in a place that outlives the meeting.&lt;/p&gt;&#xA;&lt;p&gt;This is what Architecture Decision Records were invented for, as &lt;a href=&#34;https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions&#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=cognitect.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Michael Nygard argued&lt;/a&gt; when he proposed the format.&#xA;The record is a short document that captures the context, the decision, the alternatives considered, and the status, so that a person who arrives later can understand not just what was decided but why.&#xA;The same discipline applies to scope decisions, which are every bit as consequential as architectural ones.&#xA;A one-page record that says &amp;ldquo;we will build this subset, not the full vision, because of these specific constraints, and we agreed this on this date with these people&amp;rdquo; is worth more than any number of follow-up meetings.&lt;/p&gt;&#xA;&lt;p&gt;The reason writing matters more than talking is that writing behaves differently from speech.&#xA;A conversation degrades the instant it ends.&#xA;The memory of it degrades faster, and as it passes through more mouths it distorts, the way the children&amp;rsquo;s game of &lt;a href=&#34;https://en.wikipedia.org/wiki/Telephone_%28game%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;telephone&lt;/a&gt; turns a clean phrase into nonsense in a few retellings.&#xA;A document does not degrade.&#xA;It says the same thing to the new manager on their first day as it said to the principal on the day it was written.&#xA;It says the same thing to the senior leader in their next one-on-one as it said in the room where the compromise was struck.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If a decision is worth making, it is worth making durable, and a decision is only as durable as the artifact it is recorded in.&lt;/strong&gt;&#xA;The cost of writing it down is ten minutes.&#xA;The cost of not writing it down is the cycle you are currently in, repeated every week, forever.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The New Manager Is Not the Enemy. They Are a Missing Node.&#xA;    &lt;div id=&#34;the-new-manager-is-not-the-enemy-they-are-a-missing-node&#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-new-manager-is-not-the-enemy-they-are-a-missing-node&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It is easy, and emotionally satisfying, to blame the new manager for reopening the settled question.&#xA;Resist that interpretation.&#xA;Almost certainly, they walked into their first meeting with the senior leader underprepared, because nobody had handed them the history.&#xA;They improvised from the leader&amp;rsquo;s enthusiasm, which pointed at the north star, not at your milestone compromise.&#xA;That is not sabotage.&#xA;That is a new person doing their best with the information they were given, which was not enough.&lt;/p&gt;&#xA;&lt;p&gt;The deeper structural issue is that information in an organization flows along its communication paths, and an org that just gained a new link between the team and the senior leader has, in effect, &lt;a href=&#34;https://en.wikipedia.org/wiki/Conway%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;rewired those paths&lt;/a&gt;.&#xA;A decision that was stable under the old wiring may be unstable under the new wiring, because the new path bypasses the node where the context was stored.&#xA;&lt;strong&gt;This is why onboarding a new manager is not a courtesy, it is a defensive necessity.&lt;/strong&gt;&#xA;Within their first week, they need to receive, in writing, the current decisions, the reasons behind them, and the constraints that produced them.&#xA;A new manager who has read the decision records cannot accidentally contradict them, because they know they exist.&lt;/p&gt;&#xA;&lt;p&gt;There is also a principal-agent dynamic here that is worth naming.&#xA;The senior leader, the new manager, the principal, and you all have different information, different incentives, and different audiences they are trying to satisfy, the classic pattern of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Principal%E2%80%93agent_problem&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;principal-agent problem&lt;/a&gt;.&#xA;The new manager may be, reasonably, trying to demonstrate value to their new boss, and an enthusiastic &amp;ldquo;we can do more&amp;rdquo; lands better in that first meeting than a cautious &amp;ldquo;actually, we already agreed to less.&amp;rdquo;&#xA;They are not wrong to want to look good.&#xA;The system is wrong to have left them no shared record to align to.&#xA;Fix the system and the manager will follow it, because the record gives them something safer to bring to the leader than improvisation: a documented plan they can defend.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A Playbook for Breaking the Cycle&#xA;    &lt;div id=&#34;a-playbook-for-breaking-the-cycle&#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;#a-playbook-for-breaking-the-cycle&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When you find yourself back at the start of a scope conversation you thought was over, do the following, in order.&lt;/p&gt;&#xA;&lt;p&gt;First, stop re-arguing the scope in the meeting where it resurfaced.&#xA;Relitigating under pressure produces worse decisions than the original ones, and it &lt;a href=&#34;https://en.wikipedia.org/wiki/Decision_fatigue&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;taxes the same finite decision-making energy&lt;/a&gt; that you need for the work itself.&#xA;Gain time.&#xA;Say that you want to make sure the conversation reflects everything the team has already learned, and that you will come back with a written summary.&#xA;That sentence is free, and it stops the cycle.&lt;/p&gt;&#xA;&lt;p&gt;Second, write the decision record, if it does not already exist.&#xA;Context, the north star, the agreed milestone, the specific technical constraints that forced the compromise, the people who agreed, and the date.&#xA;This is the artifact that should have existed all along, and creating it now is not empty procedure, it is what makes every later step work.&lt;/p&gt;&#xA;&lt;p&gt;Third, convert every &amp;ldquo;we can&amp;rsquo;t&amp;rdquo; into a priced option.&#xA;For each piece of the vision that is out of reach, write what it would take to reach it: which capability, which team, which rough timeline, which dependency.&#xA;Give leadership the itemized options, not a flat refusal.&lt;/p&gt;&#xA;&lt;p&gt;Fourth, brief the new manager before the next senior-leader conversation.&#xA;Walk them through the record in person, make sure they understand the constraints, and explicitly invite them to bring their own objections now rather than in the room with the leader.&#xA;Make them a co-author of the record, and they will defend it instead of overturning it.&lt;/p&gt;&#xA;&lt;p&gt;Fifth, re-present to the senior leader, on your terms, with the record in hand.&#xA;Acknowledge the north star openly, because dismissing the vision is what makes leaders resist.&#xA;Then show the milestone, show the priced options, and ask for a single explicit decision: accept the current scope, fund an enabler, or descope.&#xA;Whatever they choose, write the new decision down before anyone leaves the conversation.&#xA;&lt;strong&gt;A meeting that ends without a written decision is a meeting that will have to be held again.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally, schedule the next scope review in advance, on a date you control, instead of waiting for the topic to come up on its own.&#xA;Scope conversations are not avoidable, and they are not the enemy.&#xA;The enemy is surprise relitigation, the version that catches you by surprise in someone else&amp;rsquo;s calendar.&#xA;A standing quarterly review where the north star, the milestone, and the priced options are revisited together turns the cycle into a rhythm, and a rhythm is something a team can plan around.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lesson&#xA;    &lt;div id=&#34;the-lesson&#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-lesson&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You cannot build something that is impossible today, and you should not promise that you can.&#xA;But you also cannot expect a vague wish, transmitted through a changing set of people, to ever stop generating the scope conversation you dread.&#xA;The way out is not to win the argument one more time, harder.&#xA;It is to change the medium in which the argument happens.&#xA;Write the vision.&#xA;Write the milestone.&#xA;Write the prices of the gaps between them.&#xA;Put all of it where the next person can find it.&#xA;The conversation that reopens next month will reopen against a record instead of against your memory, and records settle those questions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Decisions that are written, priced, and shared do not need to be relitigated, because they travel to the rooms you are not in and make your case for you.&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;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt; - the same decision-making discipline (reversible vs. irreversible, disagree and commit) applied to team-internal conflicts&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt; - the same context-transfer problem (knowledge held by one person) at the level of engineering execution&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://cognitect.com/blog/2011/11/15/documenting-architecture-decisions&#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=cognitect.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Michael Nygard, &amp;ldquo;Documenting Architecture Decisions&amp;rdquo;&lt;/a&gt; - the origin of the Architecture Decision Record format, the lightweight written record this article recommends for scope decisions&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Telephone_%28game%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Telephone (game)&amp;rdquo;&lt;/a&gt; - the canonical model for how information distorts as it passes through a chain of people, which is what happened when the decision crossed the new manager&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Conway%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Conway&amp;rsquo;s law&amp;rdquo;&lt;/a&gt; - why a reorganization that adds a communication link can destabilize a decision that was stable under the old structure&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Principal%E2%80%93agent_problem&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Principal-agent problem&amp;rdquo;&lt;/a&gt; - the incentive and information asymmetries between a leader, a manager, and a team that make a shared written record necessary&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Decision_fatigue&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Decision fatigue&amp;rdquo;&lt;/a&gt; - why re-arguing settled scope under pressure degrades the quality of the decision and should be deferred to a written process&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Codebase Gardener: Keeping a Codebase Sane When Teammates and Their Agents Pull in Every Direction</title>
      <link>https://tomrochette.com/the-codebase-gardener/</link>
      <pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-codebase-gardener/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>code-review</category><category>tech-debt</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;You cannot review your way to a sane codebase when the code is being produced faster than you can read it.&#xA;That mismatch is the new arithmetic of the LLM era, and it is brutal for the one engineer on the team who cares about consistency.&#xA;&lt;strong&gt;The strategy that actually works is to stop fighting at the pull request and start fighting at the layer everyone, and every agent, is forced to pass through.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Math Changed Under Us&#xA;    &lt;div id=&#34;the-math-changed-under-us&#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-math-changed-under-us&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For most of software history, one careful engineer could hold a codebase together by reviewing most of what landed in it.&#xA;The volume was human.&#xA;A teammate produced code at roughly the rate you could read it, and a determined reviewer could keep the drift in check.&#xA;That equilibrium is gone, and two things killed it.&lt;/p&gt;&#xA;&lt;p&gt;First, throughput.&#xA;A teammate driving an LLM agent now opens in an afternoon the pull requests that used to take a week.&#xA;The unit of work did not change; the rate at which units appear did.&lt;/p&gt;&#xA;&lt;p&gt;Second, plurality.&#xA;Each teammate may be driving a different agent, loaded with different skills, different conventions, a different mental picture of what &amp;ldquo;good&amp;rdquo; means for this codebase.&#xA;The codebase does not converge on a single style through argument anymore.&#xA;It fragments into as many dialects as there are agents producing it, and each dialect looks plausible, because plausibility is exactly what an LLM optimizes for.&#xA;A function can be internally coherent, consistent with nothing around it, and wrong about the domain all at once.&lt;/p&gt;&#xA;&lt;p&gt;You, alone, reading diffs, are now the slowest station in a pipeline that was designed to outrun you.&#xA;&lt;strong&gt;Per-unit review scales linearly with your hours, and the entropy is being produced exponentially.&lt;/strong&gt;&#xA;No amount of discipline closes that gap.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Reviewing Harder Is the Trap&#xA;    &lt;div id=&#34;reviewing-harder-is-the-trap&#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;#reviewing-harder-is-the-trap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The instinct of the engineer who cares is to review more, longer, more strictly.&#xA;Reviewing harder is exactly the wrong move, for reasons I laid out in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;.&#xA;Every hour you spend line-editing someone else&amp;rsquo;s agent output is an hour the next three pull requests go unread.&#xA;You become the bottleneck, and bottleneck reviewers do not stay bottleneck reviewers for long.&#xA;Teammates start tagging each other for approvals, slicing changes to slip under your threshold, or simply waiting you out until you tire.&lt;/p&gt;&#xA;&lt;p&gt;You end up exhausted, quietly resented, and still losing ground to the codebase.&#xA;The worst part is that the work feels virtuous while you do it.&#xA;Catching a misnamed variable in review feels like defending the standard.&#xA;It is not.&#xA;It is fixing one small problem while the codebase drifts as a whole.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Review is a per-unit activity, and per-unit activity cannot match entropy that is being produced faster than you can read it.&lt;/strong&gt;&#xA;If your entire strategy is &amp;ldquo;I will catch the problems at review,&amp;rdquo; the strategy has already lost.&#xA;The question is not how to review better.&#xA;The question is how to make most of the review unnecessary.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Move the Leverage From Review to Infrastructure&#xA;    &lt;div id=&#34;move-the-leverage-from-review-to-infrastructure&#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;#move-the-leverage-from-review-to-infrastructure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The way one person defends a codebase against many producers is to stop operating on the units and start operating on the system that produces them.&#xA;This strategy is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;theory of constraints&lt;/a&gt; applied to code quality: if you cannot keep up at the review station, do not add more reviewers.&#xA;Change the station.&lt;/p&gt;&#xA;&lt;p&gt;Concretely, it means every standard you care about has to live in one of the few places work is forced to pass through, rather than in your head or in your review comments.&#xA;There are only a handful of such places, and together they are the entire leverage surface available to a single engineer.&lt;/p&gt;&#xA;&lt;p&gt;The skill and rule files every agent loads at the start of a task.&#xA;The CI gates every pull request must clear before it can merge.&#xA;The templates and scaffolds every new module begins from.&#xA;The default configuration the linters, formatters, and analyzers ship with.&#xA;The hooks that run on commit, on push, and on merge.&lt;/p&gt;&#xA;&lt;p&gt;If your standard is encoded in any of these, it executes on every change, forever, without you being present.&#xA;&lt;strong&gt;If it lives only in your review comments, it executes only when you are awake, looking, and willing to argue about it.&lt;/strong&gt;&#xA;Running without you is the whole difference between a standard and an opinion.&#xA;A standard runs whether or not anyone agrees with it.&#xA;An opinion dies the moment you go on vacation.&lt;/p&gt;&#xA;&lt;p&gt;The same point is made, from the team&amp;rsquo;s perspective, in &lt;a href=&#34;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt;: the senior engineer&amp;rsquo;s edge was always a process they ran in their head, and a process in a head does not scale.&#xA;Here the stakes are higher, because you are not trying to lift the team to your level.&#xA;You are trying to keep the standard in place while the team is actively, if innocently, drifting from it.&#xA;The mechanism is the same.&#xA;Encode the process, and let the encoding do the defending.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Make the Right Thing the Path of Least Resistance&#xA;    &lt;div id=&#34;make-the-right-thing-the-path-of-least-resistance&#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;#make-the-right-thing-the-path-of-least-resistance&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most code in a codebase is the way it is because that was the easiest thing to type at the time.&#xA;This predictability is an advantage, not a problem, for someone trying to steer a codebase alone.&#xA;If the easiest path also happens to be the correct path, conformity is free, and nobody has to be persuaded of anything.&lt;/p&gt;&#xA;&lt;p&gt;This alignment is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Paved_road&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;paved road&lt;/a&gt; idea, and it is the single highest-leverage intervention available to a solo defender.&#xA;You do not get compliance by arguing for it.&#xA;You get it by making the compliant thing the thing that happens when nobody is thinking.&lt;/p&gt;&#xA;&lt;p&gt;Ship a project template that already has the test harness, the lint config, the migration format, and the observability scaffolding wired in, and a teammate who spins up a new service produces conforming code by default, without ever reading your standards document.&#xA;Wire the migration linter into CI so that a non-backward-compatible migration fails to merge, and the question of whether backward compatibility is &amp;ldquo;our standard&amp;rdquo; stops being a question at all.&#xA;&lt;strong&gt;Friction for the wrong thing, zero friction for the right thing.&lt;/strong&gt;&#xA;That asymmetry does more work than any amount of documentation, because it operates on the path of least resistance rather than against it.&lt;/p&gt;&#xA;&lt;p&gt;The reverse matters just as much.&#xA;Remove friction from the behavior you want.&#xA;If you want small, reversible changes, make small changes trivially easy to merge.&#xA;If reviewing is expensive, people batch, and batching is exactly what produces the large, entangled, unreviewable pull requests that defeat you.&#xA;Add friction to what you want less of, and remove friction from what you want more of, and do both in the tooling rather than in the standup.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Invariants, Not Preferences&#xA;    &lt;div id=&#34;invariants-not-preferences&#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;#invariants-not-preferences&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most review wars never end because most of what people fight over are preferences.&#xA;Tabs versus spaces.&#xA;Single exit versus early return.&#xA;One assertion per test.&#xA;Preferences are arguable, and in an LLM-saturated codebase, arguable means unwinnable, because the other engineer&amp;rsquo;s agent was told the exact opposite of what yours was told, with equal confidence.&lt;/p&gt;&#xA;&lt;p&gt;The move is to convert as many preferences as possible into invariants before they can become arguments.&#xA;&lt;strong&gt;An invariant is a property the system will enforce whether or not anyone agrees with it.&lt;/strong&gt;&#xA;Database migrations must be backward compatible.&#xA;New dependencies require an audit record.&#xA;Public API changes require a feature flag.&#xA;Cyclomatic complexity above a threshold fails the build.&#xA;These are not opinions.&#xA;They are &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;machine-checkable constraints&lt;/a&gt;, and a constraint that a machine checks is a constraint you never have to argue about again.&lt;/p&gt;&#xA;&lt;p&gt;Every preference you promote to an invariant is one fewer conversation you have to win, and one fewer place the codebase can drift while you are not looking.&#xA;Reserve your remaining human attention for the small set of things that genuinely cannot be encoded: taste, architectural direction, whether a feature should exist at all.&#xA;Everything else should be a gate or a default, silently doing the work you used to do by hand.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Garden in Sweeps, Not in Diffs&#xA;    &lt;div id=&#34;garden-in-sweeps-not-in-diffs&#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;#garden-in-sweeps-not-in-diffs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Per-PR review is not the only way to fight decay, and in this era it is no longer even the best way.&#xA;Some drift will always get through, because no gate is perfect and because some of what rots a codebase is not visible in any single diff.&#xA;Naming conventions slide.&#xA;Duplication accumulates.&#xA;A module that was clean in isolation becomes tangled once three teammates have each extended it in a different direction.&lt;/p&gt;&#xA;&lt;p&gt;The answer is to operate the &lt;a href=&#34;https://en.wikipedia.org/wiki/Robert_C._Martin&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Boy Scout rule&lt;/a&gt; at the codebase level rather than at the commit level: run regular maintenance sweeps instead of trying to catch everything one pull request at a time.&#xA;Once a week, run the dead-code analysis.&#xA;Run the duplication detector and look at the new clusters.&#xA;Pull the complexity trend report and see which functions crossed a threshold this week.&#xA;Skim a list of newly added dependencies.&lt;/p&gt;&#xA;&lt;p&gt;A sweep lets you fix the eighty percent of drift that no individual pull request would have surfaced, and it lets you fix it in a way that does not require winning an argument on each one.&#xA;You are not blocking anyone&amp;rsquo;s work.&#xA;You are tidying, in batches, on your own time, against objective signals from the tools.&#xA;&lt;strong&gt;The gardener does not follow every leaf as it falls.&#xA;The gardener rakes.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sweeping is also the frank acknowledgment that some entropy is the cost of speed, and that the goal is not zero drift.&#xA;The goal is a drift rate low enough that your weekly sweep runs net positive, so that over months the codebase gets cleaner rather than dirtier even as it grows.&#xA;A codebase that gets slowly cleaner under load is a codebase you are successfully defending.&#xA;A codebase that gets slowly dirtier no matter how hard you review is one you are losing, and the review is not the fix.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Write the Decisions That Outlast You&#xA;    &lt;div id=&#34;write-the-decisions-that-outlast-you&#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-decisions-that-outlast-you&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;One of the cheapest, highest-leverage things a solo defender can do is write things down in a form that survives without them.&#xA;&lt;a href=&#34;https://adr.github.io/&#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=adr.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Architecture decision records&lt;/a&gt;, one page each, capturing what was decided, what alternatives were rejected, and why.&#xA;A short conventions document that is explicitly the source of truth the lint config is derived from.&#xA;A &amp;ldquo;why this exists&amp;rdquo; header on the modules most likely to be misunderstood.&lt;/p&gt;&#xA;&lt;p&gt;The point of writing it down is not to win today&amp;rsquo;s argument.&#xA;Today&amp;rsquo;s argument will be re-litigated regardless, because the engineer on the other side, or their agent, has not read it.&#xA;The point is to ensure that the same argument does not have to be re-won from the beginning every time, by you, as it happens.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A decision that lives in a file is a decision the next agent can be pointed at.&lt;/strong&gt;&#xA;A decision that lives only in your head dies the moment you switch teams, or take a week off, or simply get tired of explaining it for the fiftieth time.&#xA;When your defenses are encoded as files, the codebase keeps its structure without you maintaining it.&#xA;When they are encoded only as your vigilance, the codebase is one two-week vacation away from drift you will spend a month undoing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pick the Battles That Are Actually One-Way Doors&#xA;    &lt;div id=&#34;pick-the-battles-that-are-actually-one-way-doors&#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;#pick-the-battles-that-are-actually-one-way-doors&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You cannot defend every standard, and trying to is the fastest route to burnout.&#xA;The discipline is to decide, in advance, which fights are worth your scarce attention, and the useful frame is the distinction between one-way and two-way doors, which I wrote about in &lt;a href=&#34;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A one-way door is a decision that is hard or impossible to reverse.&#xA;Choosing a primary database.&#xA;Committing to a service boundary that will be expensive to move later.&#xA;Adopting a framework that will permeate every file.&#xA;Dropping a database column.&#xA;These deserve your full attention, and as the defender of the codebase these are where you should spend it.&#xA;Block them, slow them, write the decision record, make the team justify the trade-off.&lt;/p&gt;&#xA;&lt;p&gt;A two-way door is a decision you can undo in an afternoon.&#xA;A naming convention.&#xA;A helper function in the wrong package.&#xA;A test that could have been structured better.&#xA;Let these go, or fix them in a sweep later.&#xA;&lt;strong&gt;The solo defender who treats every diff as a one-way door exhausts themselves on reversible things and has nothing left for the decisions that actually compound.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This discipline is also the cure for the resentment that otherwise makes this role unsustainable.&#xA;You will see things every day that are not how you would have done them.&#xA;Most of them do not matter.&#xA;Learn to recognize which decisions are irreversible, let the reversible ones pass, and you will last long enough to actually defend the things that count.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Limit&#xA;    &lt;div id=&#34;the-limit&#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-limit&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Sometimes the team will not align, and no amount of infrastructure will fully save you.&#xA;A teammate may insist on driving their own agent with their own skills, their own conventions, their own picture of the codebase, and treat your paved road as a suggestion rather than a default.&#xA;A manager may value shipping velocity over every standard you have encoded, and quietly override the gates that matter.&lt;/p&gt;&#xA;&lt;p&gt;At that point your job is no longer to win.&#xA;&lt;strong&gt;It is to make the cost of the drift visible.&lt;/strong&gt;&#xA;Keep the trend reports.&#xA;Keep the complexity numbers.&#xA;Keep the record of which decisions were one-way doors that got walked through without the decision being made.&#xA;Do this not to build a case against anyone, but because the most powerful thing a defender can produce, when defense fails, is a clear record of what was lost and when, so that the next attempt at sanity starts from evidence rather than from impressions.&lt;/p&gt;&#xA;&lt;p&gt;And know when to stop defending a particular part of the codebase.&#xA;A codebase is not worth your health, and a team that has decided, collectively, to let the codebase rot will rot it with or without you.&#xA;Your leverage is highest at the start of a codebase&amp;rsquo;s life and lowest once the rot is structural.&#xA;If you have encoded what you can, written down what you know, and the drift is still winning, the rational move is to spend less energy fighting and more energy deciding whether this is still the codebase you want to be responsible for.&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;p&gt;You do not need permission, and you do not need a migration.&#xA;Pick the single standard that is being violated most often, the one that costs you the most review time, and convert it from a review comment into a gate.&#xA;A lint rule.&#xA;A CI check.&#xA;A line in the skill file every agent loads.&#xA;Run it on every pull request, including the ones you do not personally review.&lt;/p&gt;&#xA;&lt;p&gt;Then do it again, next week, with the next most expensive standard.&#xA;Each conversion is a piece of vigilance that stops being yours and starts being the system&amp;rsquo;s.&#xA;Over a quarter, the surface you have to defend manually shrinks to the small set of genuinely judgment-laden calls, and the volume of entropy you face stops mattering quite so much, because most of it is being caught upstream of you, by machinery that does not tire.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The solo defender who wins is not the one who reviews the most.&lt;/strong&gt;&#xA;&lt;strong&gt;The solo defender who wins is the one who has made themselves, slowly and deliberately, the part of the pipeline that is no longer strictly necessary.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A sane codebase in this era is not one that a heroic reviewer holds together by force of attention.&#xA;It is one whose standards have been pushed so far upstream, into the skills and gates and defaults and templates, that the code arrives mostly correct, and the reviewer is left doing the small amount of work that only a human can do.&#xA;Build that, one encoded standard at a time, and the direction the rest of the team is pulling in starts to matter a great deal less.&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;https://tomrochette.com/bringing-everyone-to-the-same-level/&#34; &gt;Bringing Everyone to the Same Level&lt;/a&gt; &amp;ndash; the team-level argument for encoding senior engineers&amp;rsquo; processes into skills; this article is the adversarial, solo version of the same insight&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; &amp;ndash; the case that quality is a property of your constraints, not your reviewers, which is the premise the gardening strategy stands on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt; &amp;ndash; the one-way versus two-way door framing this article borrows for deciding which fights a solo defender should pick&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; &amp;ndash; which friction is structural and which is waste, the distinction that decides what to encode versus what to remove&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; &amp;ndash; why each layer of automation pushes leverage one step up the decision chain, into specification and infrastructure&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://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Theory of Constraints&amp;rdquo;&lt;/a&gt; &amp;ndash; Goldratt&amp;rsquo;s framing for why you change the bottleneck station rather than adding effort at it, the basis for moving leverage from review to infrastructure&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Paved_road&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Paved road&amp;rdquo;&lt;/a&gt; &amp;ndash; the principle of making the compliant path the easiest path, which lets a single engineer steer a codebase without persuading anyone&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Technical_debt&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Technical debt&amp;rdquo;&lt;/a&gt; &amp;ndash; the metaphor for accumulated drift that a weekly gardening sweep is meant to keep net-negative&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Broken_windows_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Broken windows theory&amp;rdquo;&lt;/a&gt; &amp;ndash; why visible decay accelerates further decay, and why keeping the drift rate below the sweep rate matters disproportionately&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzx/agents&lt;/a&gt; &amp;ndash; a working library of the skill files and review gates that implement the infrastructure-first defense described here&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Self-Evolving Repository: Automating a GitHub Project End to End with LLMs</title>
      <link>https://tomrochette.com/the-self-evolving-repository/</link>
      <pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-self-evolving-repository/</guid>
      <category>llm</category><category>ai-agents</category><category>automation</category><category>github</category><category>self-improving</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The question is not whether an LLM can write code for your project.&#xA;It already can.&#xA;The question is whether a project can continue to evolve, fix its own bugs, add its own features, and improve its own quality without you ever opening a terminal, writing a prompt, or reviewing a pull request.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is the self-evolving repository: a GitHub project where every function of the maintainer has been replaced by an automated loop driven by LLMs.&lt;/strong&gt;&#xA;No human control.&#xA;No human-in-the-loop.&#xA;The maintainer sets it up once, then does not intervene, and the project keeps making progress.&lt;/p&gt;&#xA;&lt;p&gt;I want to be precise about what a self-evolving repository means, what it requires, and where it breaks.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Full Automation Means&#xA;    &lt;div id=&#34;what-full-automation-means&#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-full-automation-means&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most LLM-assisted development today is interactive.&#xA;A developer describes a task, the LLM writes code, the developer reviews, requests changes, and merges.&#xA;The developer controls what the LLM works on.&#xA;The LLM does the work.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Full automation removes the developer&amp;rsquo;s control.&lt;/strong&gt;&#xA;The project must decide for itself what to work on, implement the work, verify it, and ship it.&#xA;The maintainer who set it up does not intervene in the loop.&lt;/p&gt;&#xA;&lt;p&gt;Full automation is a fundamentally different problem from &amp;ldquo;use an LLM to write faster code.&amp;rdquo;&#xA;It is the problem of encoding every judgment a maintainer makes into a system that can execute that judgment autonomously, reliably, and indefinitely.&lt;/p&gt;&#xA;&lt;p&gt;A maintainer of an active project does many things.&#xA;They triage bug reports.&#xA;They decide which feature requests align with the project&amp;rsquo;s direction.&#xA;They prioritize competing work.&#xA;They review contributions.&#xA;They fix CI when it breaks.&#xA;They update dependencies.&#xA;They write documentation.&#xA;They make architectural decisions.&#xA;They decline changes that would make the codebase worse.&lt;/p&gt;&#xA;&lt;p&gt;Each of these duties is a decision that currently requires human judgment.&#xA;Full automation means building a system that makes each of these decisions without the human.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Autonomous Loop&#xA;    &lt;div id=&#34;the-autonomous-loop&#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-autonomous-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A self-evolving repository runs a continuous loop.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Observe → Decide → Implement → Verify → Ship → Learn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;Each stage must be fully automated.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. Observe&#xA;    &lt;div id=&#34;1-observe&#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;#1-observe&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The system continuously monitors signals about the project&amp;rsquo;s state.&#xA;Open issues and their content.&#xA;Pull requests from external contributors.&#xA;CI failures and test results.&#xA;Dependency vulnerability alerts.&#xA;User feedback in discussions.&#xA;Stack Overflow questions mentioning the project.&#xA;Download and usage statistics.&#xA;Error reports from production telemetry if the project is a library or service.&lt;/p&gt;&#xA;&lt;p&gt;The system uses these signals to understand its state.&#xA;Without them, the project does not know what needs attention.&#xA;The richer the signal sources, the better the system can prioritize.&lt;/p&gt;&#xA;&lt;p&gt;A project that only monitors its own issue tracker misses much of what needs attention.&#xA;A project that also monitors community discussions, ecosystem health, and downstream breakage has much more information about where to invest effort.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;2. Decide&#xA;    &lt;div id=&#34;2-decide&#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;#2-decide&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The decide stage is the hardest, and I will return to it.&lt;/p&gt;&#xA;&lt;p&gt;Given the observed signals, the system must decide what to work on next.&#xA;Deciding what to work on is not just &amp;ldquo;pick the highest priority issue.&amp;rdquo;&#xA;It is a sequence of judgments: which problems are worth solving, which are urgent, which can wait, which should be declined, which require architectural changes versus incremental fixes.&lt;/p&gt;&#xA;&lt;p&gt;The decision stage encodes the maintainer&amp;rsquo;s judgment about what matters.&#xA;If the system encodes the maintainer&amp;rsquo;s judgment poorly, the project will be busy but not productive, shipping changes that do not move the project in a meaningful direction.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;3. Implement&#xA;    &lt;div id=&#34;3-implement&#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;#3-implement&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The system decomposes the chosen work into tasks and generates code.&#xA;Implementation is the part that LLMs are already good at.&#xA;Given a clear specification and sufficient context about the codebase, current models can produce working implementations for most routine tasks.&lt;/p&gt;&#xA;&lt;p&gt;The implementation stage benefits from the same patterns that work in interactive LLM development: competitive generation (multiple attempts, best one selected), iterative refinement (generate, evaluate, regenerate), and specification-driven development (the spec is authored before the code).&lt;/p&gt;&#xA;&lt;p&gt;The difference is that in the autonomous loop, the specification is also generated by the system, not by a human.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;4. Verify&#xA;    &lt;div id=&#34;4-verify&#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;#4-verify&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Before any change ships, it must pass automated verification.&#xA;This is the quality gate that replaces human code review.&lt;/p&gt;&#xA;&lt;p&gt;The verification pipeline should include: the existing test suite, static analysis and linting, security scanning, type checking, and scenario-based validation where an LLM evaluates whether the implementation satisfies the specification.&lt;/p&gt;&#xA;&lt;p&gt;As I argued in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;, human code review of LLM-generated code is the lowest-value activity in the pipeline.&#xA;Automated verification is not just faster, it is more consistent and more reliable for the kinds of checks that matter at this stage.&lt;/p&gt;&#xA;&lt;p&gt;The critical requirement is that verification criteria are defined before implementation, not after.&#xA;If the system writes tests to match what it already implemented, the tests prove nothing.&#xA;The specification and its acceptance criteria must exist first.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;5. Ship&#xA;    &lt;div id=&#34;5-ship&#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;#5-ship&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Verified changes are merged and released.&#xA;This stage is mostly mechanical: merge the pull request, run the release pipeline, publish the package, update the changelog.&lt;/p&gt;&#xA;&lt;p&gt;The one non-obvious requirement is a rollback mechanism.&#xA;If a shipped change introduces a regression that the verification pipeline missed, the system needs to detect the regression in production telemetry and automatically revert.&#xA;Without an automatic rollback, errors compound.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;6. Learn&#xA;    &lt;div id=&#34;6-learn&#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;#6-learn&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The system records what worked and what did not.&#xA;Every failed implementation, every reverted change, every missed bug is an input to future decisions.&lt;/p&gt;&#xA;&lt;p&gt;This learning takes several forms.&#xA;Failed prompts and their corrections become few-shot examples for future implementations.&#xA;Bugs that escaped verification become new test cases.&#xA;Decisions that led to regressions update the prioritization model.&#xA;Architectural patterns that caused repeated problems become constraints the system avoids.&lt;/p&gt;&#xA;&lt;p&gt;Over time, the system accumulates institutional knowledge the way a human maintainer does, but in a form that is explicit, versioned, and transferable.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Direction Problem&#xA;    &lt;div id=&#34;the-direction-problem&#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-direction-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The hardest problem in a self-evolving repository is not implementation.&#xA;It is not verification.&#xA;It is not even CI automation.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It is direction.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When a human maintainer decides what to work on, they are applying judgment that is difficult to articulate.&#xA;They know the project&amp;rsquo;s trajectory, the community&amp;rsquo;s needs, the competitive landscape, and the technical debt that is becoming critical.&#xA;&lt;strong&gt;They have taste.&lt;/strong&gt;&#xA;They have a vision for what the project should become.&lt;/p&gt;&#xA;&lt;p&gt;Encoding the maintainer&amp;rsquo;s judgment into an autonomous system is the central challenge.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The roadmap as a steering mechanism&#xA;    &lt;div id=&#34;the-roadmap-as-a-steering-mechanism&#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-roadmap-as-a-steering-mechanism&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The maintainer&amp;rsquo;s initial setup must include a machine-readable roadmap.&#xA;Not a vague vision statement, but a structured document that defines: the project&amp;rsquo;s purpose and non-goals, the target user and their needs, the quality bar for changes, the architectural principles that must be respected, and the current priorities ranked by importance.&lt;/p&gt;&#xA;&lt;p&gt;This roadmap is the project&amp;rsquo;s governing document.&#xA;Every autonomous decision is evaluated against it.&#xA;When the system decides what to work on, it checks the decision against the roadmap.&#xA;When the system reviews a contribution, it checks whether the contribution moves the project toward a roadmap goal.&lt;/p&gt;&#xA;&lt;p&gt;The roadmap does not need to be exhaustive.&#xA;It needs to be sufficient to distinguish work that matters from work that does not.&#xA;This is a lower bar than most people assume.&#xA;Most of a maintainer&amp;rsquo;s triage decisions are not subtle architectural judgments.&#xA;They are straightforward: this bug affects users, fix it; this feature request is out of scope, decline it; this dependency has a security vulnerability, update it.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Direction from external signals&#xA;    &lt;div id=&#34;direction-from-external-signals&#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;#direction-from-external-signals&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The roadmap provides static direction.&#xA;External signals provide dynamic direction.&lt;/p&gt;&#xA;&lt;p&gt;If the system observes that a particular error message is appearing frequently in community discussions, that is a signal to improve the error message or fix the underlying issue.&#xA;If the system observes that a downstream project broke after a recent release, that is a signal to fix the breaking change.&#xA;If the system observes that a dependency released a major version, that is a signal to evaluate the migration.&lt;/p&gt;&#xA;&lt;p&gt;These signals allow the project to evolve in response to its environment without a human pointing the way.&#xA;The system reacts to what is actually happening rather than to what someone predicted would happen.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The drift problem&#xA;    &lt;div id=&#34;the-drift-problem&#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-drift-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Signal-driven direction carries a fundamental tension.&#xA;A self-evolving repository that only reacts to external signals will optimize for whatever those signals measure.&#xA;If the signals are bug reports, the system will become excellent at fixing bugs and terrible at anything else.&#xA;If the signals are feature requests, the system will accumulate features and lose coherence.&lt;/p&gt;&#xA;&lt;p&gt;This drift is &lt;a href=&#34;https://en.wikipedia.org/wiki/Goodhart%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Goodhart&amp;rsquo;s law&lt;/a&gt; applied to software maintenance: when a measure becomes the target of an autonomous system, it ceases to be a good measure.&lt;/p&gt;&#xA;&lt;p&gt;The roadmap exists to counteract this drift.&#xA;It is the fixed point that keeps the project aligned with its original purpose even as the system optimizes for observable signals.&#xA;But the roadmap itself can become stale.&#xA;A project&amp;rsquo;s context changes over time.&#xA;User needs shift.&#xA;The ecosystem evolves.&#xA;A roadmap written in January may be wrong by July.&lt;/p&gt;&#xA;&lt;p&gt;A fully autonomous system needs a mechanism for updating its own roadmap.&#xA;Updating the roadmap is where the direction problem becomes genuinely difficult.&#xA;Updating the roadmap means making a judgment about what the project should become, and that judgment requires understanding the project&amp;rsquo;s users, ecosystem, and competitive position at a level that current LLMs can approximate but not fully replicate.&lt;/p&gt;&#xA;&lt;p&gt;The pragmatic solution is not to solve the stale-roadmap problem perfectly but to bound it.&#xA;Let the system make small roadmap adjustments based on observed signals, but require large directional changes to go through a human review.&#xA;This keeps the system autonomous for 95% of decisions while preserving human oversight for the 5% that determine the project&amp;rsquo;s long-term trajectory.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Quality Without a Human&#xA;    &lt;div id=&#34;quality-without-a-human&#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;#quality-without-a-human&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The quality question is the one most people get stuck on.&#xA;&amp;ldquo;How do you trust code that no human reviewed?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The answer is the same one I gave in &lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt;: you do not trust the code, you trust the verification system.&lt;/p&gt;&#xA;&lt;p&gt;A self-evolving repository needs a verification pipeline that is more rigorous than what most human-maintained projects have today.&#xA;Not because the code is worse, but because there is no human fallback.&lt;/p&gt;&#xA;&lt;p&gt;The pipeline should have multiple independent layers, each catching different classes of problems.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Unit and integration tests&lt;/strong&gt; catch functional regressions.&#xA;These should be comprehensive and fast.&#xA;The system should be able to run the full suite in minutes, not hours.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Property-based testing&lt;/strong&gt; catches edge cases that example-based tests miss.&#xA;For pure functions and data transformations, property tests can generate thousands of inputs automatically, surfacing bugs that a human would never think to test.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Static analysis&lt;/strong&gt; catches type errors, security vulnerabilities, and common anti-patterns.&#xA;Tools like &lt;a href=&#34;https://semgrep.dev/&#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=semgrep.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Semgrep&lt;/a&gt;, &lt;a href=&#34;https://codeql.github.com/&#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=codeql.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;CodeQL&lt;/a&gt;, and language-specific analyzers should run on every change.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Mutation_testing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mutation testing&lt;/a&gt;&lt;/strong&gt; verifies that the test suite is actually meaningful.&#xA;If you can mutate the code and the tests still pass, the tests are not testing what you think they are.&#xA;Mutation testing is especially important when the tests themselves are LLM-generated.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Scenario-based validation&lt;/strong&gt; uses an LLM to evaluate whether the implementation satisfies its specification.&#xA;Scenario-based validation is the layer that catches semantic problems that automated tests miss: the code works, but it solves the wrong problem.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Adversarial verification&lt;/strong&gt; has a separate agent actively try to break the implementation.&#xA;This agent writes tests designed to fail, probes edge cases, and attempts to find inputs that produce incorrect behavior.&#xA;It is the automated equivalent of a hostile code reviewer.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The key insight is that each layer should be independent.&lt;/strong&gt;&#xA;If the same LLM that wrote the code also wrote the tests and also ran the review, the correlated failure rate is high.&#xA;The system will make the same mistake in implementation, tests, and review because they all share the same blind spots.&lt;/p&gt;&#xA;&lt;p&gt;Diversity of verification methods reduces correlated failures.&#xA;Static analysis does not share blind spots with property testing.&#xA;Mutation testing does not share blind spots with scenario validation.&#xA;&lt;strong&gt;The layers are strongest when they are structurally different, not just different invocations of the same model.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Can Go Wrong&#xA;    &lt;div id=&#34;what-can-go-wrong&#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-can-go-wrong&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A self-evolving repository is a complex autonomous system.&#xA;Complex autonomous systems have failure modes that are hard to predict.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Silent quality decay&#xA;    &lt;div id=&#34;silent-quality-decay&#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;#silent-quality-decay&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Silent quality decay is the hardest failure mode to notice.&#xA;&lt;strong&gt;The system ships changes that pass all verification layers but gradually degrade the codebase&amp;rsquo;s quality.&lt;/strong&gt;&#xA;Each individual change is defensible.&#xA;The cumulative effect is a codebase that is harder to maintain, slower to evolve, and full of subtle interactions that no one understands.&lt;/p&gt;&#xA;&lt;p&gt;Silent quality decay happens when the verification pipeline measures immediate quality (does this change pass tests?) but not systemic quality (does this change make the codebase healthier?).&#xA;Metrics like cyclomatic complexity, coupling, and test coverage can help, but they are proxies, not ground truth.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The complexity spiral&#xA;    &lt;div id=&#34;the-complexity-spiral&#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-complexity-spiral&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Without a human saying &amp;ldquo;this is too complex, simplify it,&amp;rdquo; the system may accumulate complexity over time.&#xA;Each new feature adds code.&#xA;Each bug fix adds special cases.&#xA;Each dependency update adds compatibility layers.&#xA;The codebase grows without bound because nothing in the autonomous loop says &amp;ldquo;stop adding, start removing.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;A self-evolving repository needs an explicit simplification loop.&#xA;The system should periodically identify the most complex parts of the codebase and attempt to simplify them, even if no bug is forcing the change.&#xA;The simplification loop is technical debt reduction as an automated process.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Specification drift&#xA;    &lt;div id=&#34;specification-drift&#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;#specification-drift&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When the system writes its own specifications, the specifications can drift from what users actually need.&#xA;The system optimizes for specifications it can satisfy, not specifications that matter.&#xA;Over time, the project accumulates well-implemented features that nobody uses.&lt;/p&gt;&#xA;&lt;p&gt;Specification drift is the autonomous version of the problem I described in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;: when implementation becomes free, deciding what to implement becomes the hard part.&#xA;In a self-evolving repository, the decision problem is fully automated, which means the drift can go unnoticed for longer.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Cascading failures&#xA;    &lt;div id=&#34;cascading-failures&#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;#cascading-failures&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A single bad change that passes verification can break downstream functionality in ways that the verification pipeline does not catch.&#xA;The system then generates fixes for the symptoms rather than reverting the cause.&#xA;Each fix introduces new changes, each of which can introduce new problems.&#xA;The system enters a fix loop, shipping more patches that make the situation worse.&lt;/p&gt;&#xA;&lt;p&gt;The defense against cascading failures is blast radius limitation.&#xA;Changes should be small, merged incrementally, and monitored for downstream impact.&#xA;The system should have a threshold: if more than N changes in a row require fixes, stop and flag for human attention rather than continuing to patch.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Cost runaway&#xA;    &lt;div id=&#34;cost-runaway&#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;#cost-runaway&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Every iteration of the autonomous loop costs money: API calls for generation, verification, and decision-making.&#xA;A system that is stuck in a fix loop, or that is attempting overly ambitious changes, can spend a large amount of compute before anyone notices.&lt;/p&gt;&#xA;&lt;p&gt;The system needs explicit budgets.&#xA;A maximum number of iterations per change.&#xA;A maximum cost per change.&#xA;A maximum number of changes per day.&#xA;When a budget is exceeded, the system pauses and logs the situation rather than continuing to spend.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What the Maintainer Does Once&#xA;    &lt;div id=&#34;what-the-maintainer-does-once&#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-the-maintainer-does-once&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The maintainer&amp;rsquo;s role in a self-evolving repository is concentrated entirely in the setup phase.&#xA;Everything that happens after setup is automated.&lt;/p&gt;&#xA;&lt;p&gt;The setup has five components.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The roadmap.&lt;/strong&gt;&#xA;A structured document defining the project&amp;rsquo;s purpose, non-goals, priorities, quality standards, and architectural principles.&#xA;The roadmap is the single most important artifact.&#xA;It determines whether the autonomous system makes good decisions or busy decisions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The verification pipeline.&lt;/strong&gt;&#xA;The combination of test suites, static analysis, property tests, mutation tests, scenario validation, and adversarial verification that gates every change.&#xA;This pipeline must be in place and passing before the autonomous loop starts.&#xA;If the verification pipeline is weak, the autonomous system will ship low-quality code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The decision policy.&lt;/strong&gt;&#xA;The rules that govern how the system prioritizes work.&#xA;What signals does it monitor?&#xA;How does it rank competing tasks?&#xA;When does it work on bugs versus features versus technical debt versus documentation?&#xA;This policy encodes the maintainer&amp;rsquo;s judgment about how to allocate attention.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The guardrails.&lt;/strong&gt;&#xA;Budget limits, blast radius constraints, escalation triggers, and rollback mechanisms.&#xA;These are the safety systems that prevent the autonomous loop from causing damage when something goes wrong.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The learning infrastructure.&lt;/strong&gt;&#xA;The mechanisms by which the system records outcomes and feeds them back into future decisions.&#xA;This includes the few-shot example library, the bug-to-test pipeline, and the decision evaluation framework.&lt;/p&gt;&#xA;&lt;p&gt;Once these five components are in place, the autonomous loop can run.&#xA;The maintainer&amp;rsquo;s ongoing involvement is limited to reviewing escalation reports, the small percentage of decisions that the system flags as requiring human judgment.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When This Makes Sense&#xA;    &lt;div id=&#34;when-this-makes-sense&#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;#when-this-makes-sense&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Not every project should be a self-evolving repository.&lt;/p&gt;&#xA;&lt;p&gt;This approach makes sense for projects with: clear specifications and measurable quality criteria, active user bases generating feedback signals, maintenance-heavy codebases where most work is bug fixes and incremental improvements, and well-established architectures where most decisions are routine.&lt;/p&gt;&#xA;&lt;p&gt;It makes less sense for projects that are: in early exploration where direction changes frequently, in domains where correctness is safety-critical, in codebases with poor test coverage or unclear specifications, or where the competitive advantage is design taste that is hard to encode.&lt;/p&gt;&#xA;&lt;p&gt;The threshold question is simple: can you write down the rules a competent maintainer would follow, well enough that following them mechanically produces good outcomes?&#xA;If yes, the system can work.&#xA;&lt;strong&gt;If no, the system will be autonomous but not effective.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Deeper Question&#xA;    &lt;div id=&#34;the-deeper-question&#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-deeper-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A self-evolving repository raises a question that I explored in &lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt;: when the system is its prompts, its pipelines, and its proprietary context, what is the project?&lt;/p&gt;&#xA;&lt;p&gt;The project is no longer its code.&#xA;The code is a byproduct of the system that generates it.&#xA;&lt;strong&gt;The project is the roadmap, the verification pipeline, the decision policy, the guardrails, and the accumulated learning data.&lt;/strong&gt;&#xA;These are the artifacts that determine what the project becomes.&lt;/p&gt;&#xA;&lt;p&gt;This reframes what it means to maintain a project.&#xA;The maintainer&amp;rsquo;s most important work is not writing code, reviewing pull requests, or fixing bugs.&#xA;It is designing the system that does all of those things autonomously.&#xA;The maintainer becomes an architect of processes rather than an executor of tasks.&lt;/p&gt;&#xA;&lt;p&gt;The project that outlives this setup is the one where the autonomous system makes decisions the maintainer would have made, ships quality the maintainer would have approved, and evolves in a direction the maintainer would have chosen.&lt;/p&gt;&#xA;&lt;p&gt;The question is whether you can encode your judgment well enough to make yourself unnecessary.&lt;/p&gt;&#xA;&lt;p&gt;If you can, the project evolves without you.&#xA;If you cannot, no amount of automation will compensate for the missing taste.&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;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; - how agent companies invert traditional scaling constraints&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - how AI moves bottlenecks up the decision chain&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt; - the Software Factory paradigm and autonomous verification&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - why human review of LLM code is low-leverage&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - what processes to keep and what to eliminate&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - context engineering as the determinant of output quality&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Bringing Everyone to the Same Level: How Skills and LLMs Collapse Code Quality Variance</title>
      <link>https://tomrochette.com/bringing-everyone-to-the-same-level/</link>
      <pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/bringing-everyone-to-the-same-level/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>skills</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Every team has the same structure.&#xA;A few engineers ship clean, well-tested, well-scoped work, and the rest ship work that mostly works.&#xA;The gap between them is not typing speed.&#xA;It is everything that happens before and after the typing: the steps they remember to run, the checks they know to perform, the conventions they learned by fixing past failures.&#xA;&lt;strong&gt;That knowledge has always been the most valuable asset, and it has never scaled, because it existed in the heads of a small number of people.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;LLMs alone do not fix this.&#xA;They make everyone faster, which is a different thing from making everyone produce the same quality.&#xA;Done naively, they widen the variance, because an LLM is a multiplier on the quality of the instructions it receives.&#xA;The fix is to give every engineer, and every model, the same instructions.&#xA;A shared set of instructions is what a skill is, and it is why skills are the mechanism that finally brings everyone to the same level.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Variance Problem Has Always Been a Knowledge Problem&#xA;    &lt;div id=&#34;the-variance-problem-has-always-been-a-knowledge-problem&#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-variance-problem-has-always-been-a-knowledge-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Ask yourself what actually separates the output of your strongest engineer from your weakest.&#xA;It is rarely the language syntax.&#xA;Both of them can write a function.&lt;/p&gt;&#xA;&lt;p&gt;The difference is that the strong engineer, before touching code, performs a long list of steps they never write down.&#xA;They look for an existing solution before building a new one.&#xA;They write down what &amp;ldquo;done&amp;rdquo; means before they implement.&#xA;They check whether the change can be undone.&#xA;They name things the way the rest of the codebase names things.&#xA;They write the edge case the junior would have forgotten.&#xA;They run the linter, and they run it before opening the pull request, not after a reviewer asks.&lt;/p&gt;&#xA;&lt;p&gt;Each of these is a step, and a step can be written down.&#xA;For most of the history of software, these steps were passed on informally, by watching and working alongside others.&#xA;You learned them by pairing with someone better, by getting review comments on your seventh PR, by breaking production once and remembering forever.&#xA;This is mentorship, and it works, but it is slow, expensive, and uneven.&#xA;It cannot keep up with a team that is hiring, and it cannot keep up with a codebase that is changing.&#xA;&lt;strong&gt;The senior engineer&amp;rsquo;s advantage was always a process they followed in their head, and a process in a head does not scale.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;LLMs Raise the Floor but Not the Ceiling&#xA;    &lt;div id=&#34;llms-raise-the-floor-but-not-the-ceiling&#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;#llms-raise-the-floor-but-not-the-ceiling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Drop an LLM into this situation and the naive expectation is that it makes everyone equal.&#xA;It does not, at least not on its own.&lt;/p&gt;&#xA;&lt;p&gt;What an LLM actually does is amplify whatever it is given.&#xA;Give it a vague one-line prompt and you get back plausible, generic code that does not match your conventions and forgets your edge cases.&#xA;Give it a precise specification, the relevant files, the patterns to reuse, and the checks to satisfy, and you get back code that is hard to distinguish from your best engineer&amp;rsquo;s output.&#xA;The model is the same in both cases.&#xA;The difference is entirely in the context, which, as I argued in &lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt;, is the entire mechanism by which a frozen set of weights produces behavior relevant to your situation.&lt;/p&gt;&#xA;&lt;p&gt;The amplification effect has an uncomfortable implication.&#xA;&lt;strong&gt;Before skills, the LLM made the senior engineer better and the junior engineer faster, and the gap between them stayed roughly the same.&lt;/strong&gt;&#xA;The senior engineer instinctively provides the context the model needs, because they know what good work requires.&#xA;The junior engineer does not know what they do not know, so they ask for less, and they get less back.&#xA;The tool that was supposed to democratize quality quietly reproduced the existing hierarchy, because it rewarded the same hidden knowledge that had always separated them.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A Skill Is the Senior Engineer&amp;rsquo;s Process, Made Executable&#xA;    &lt;div id=&#34;a-skill-is-the-senior-engineers-process-made-executable&#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;#a-skill-is-the-senior-engineers-process-made-executable&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A skill is a versioned file, usually markdown, that tells an LLM agent exactly how to perform a task.&#xA;Not a vague hint.&#xA;The steps, in order, the checks to run before declaring success, the gates the output must pass, and the format the output should take.&#xA;When the agent loads the skill, it stops improvising and follows the encoded process instead.&lt;/p&gt;&#xA;&lt;p&gt;The difference between a skill and advice is where the comparison to a human matters.&#xA;A junior engineer told to &amp;ldquo;go implement the feature&amp;rdquo; forgets half the steps, because they never fully learned them.&#xA;A junior engineer, or even an autonomous agent, told to implement the feature &lt;em&gt;through a skill&lt;/em&gt; cannot forget the steps, because the steps are in the prompt the model reads on every run.&#xA;The skill is not advice the engineer might ignore.&#xA;It is part of the execution path.&lt;/p&gt;&#xA;&lt;p&gt;Think of it as &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Checklist_Manifesto&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;the checklist idea&lt;/a&gt; from medicine and aviation, with one critical upgrade.&#xA;A surgical checklist still depends on a tired human choosing to read it and choosing to follow it.&#xA;A loaded skill does not depend on anyone&amp;rsquo;s discipline.&#xA;&lt;strong&gt;The model follows it because the skill is the instruction, and following instructions is what the model does.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why This Collapses the Variance&#xA;    &lt;div id=&#34;why-this-collapses-the-variance&#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;#why-this-collapses-the-variance&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Run the same task through two engineers with two different LLMs, but the same skill, and watch what happens to the output.&#xA;Both implementations start from the same specification step.&#xA;Both run the same &amp;ldquo;have you checked for an existing solution?&amp;rdquo; step.&#xA;Both end at the same verification step, with the same gates.&#xA;The code they produce is not identical, but it converges toward a common standard, because the process that produced it is identical.&lt;/p&gt;&#xA;&lt;p&gt;The thing that used to vary, the unwritten checklist inside each engineer&amp;rsquo;s head, is now constant.&#xA;What varies is only the judgment applied at each step, and even that is bounded by the gates the skill enforces.&#xA;&lt;strong&gt;Skills do not make everyone equally brilliant.&#xA;They make everyone equally unable to skip the steps that matter, and skipping the steps that matter is what produced most of the variance in the first place.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The convergence logic is the same one I described, from the other direction, in &lt;a href=&#34;https://tomrochette.com/developer-trust-profiles/&#34; &gt;Developer Trust Profiles&lt;/a&gt;.&#xA;There I argued the ideal end state is one where &amp;ldquo;every contributor, senior engineer or new hire, funnels their work through agents that enforce the same standards,&amp;rdquo; so that authorship stops carrying signal and &amp;ldquo;the output converges into something homogeneous.&amp;rdquo;&#xA;The trust profile was a transitional step, and the point was to make itself obsolete.&#xA;&lt;strong&gt;Skills are the mechanism that completes that transition.&#xA;They are the shared, enforced pipeline that makes the variance shrink in the first place.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Leverage Moves Up, Again&#xA;    &lt;div id=&#34;the-leverage-moves-up-again&#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-leverage-moves-up-again&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If the junior engineer can now produce work that follows the senior engineer&amp;rsquo;s process, what is left for the senior engineer to do?&lt;/p&gt;&#xA;&lt;p&gt;The answer is the same one that keeps appearing everywhere AI touches the development pipeline.&#xA;The bottleneck moves up the decision chain, as in &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt;, and the leverage moves with it.&lt;/p&gt;&#xA;&lt;p&gt;The new seniority is not in running the skills.&#xA;Anyone, and any agent, can do that.&#xA;&lt;strong&gt;The new seniority is in writing them.&lt;/strong&gt;&#xA;Deciding what the process should be in the first place.&#xA;Deciding which gate matters and which only looks like a gate.&#xA;Deciding what &amp;ldquo;done&amp;rdquo; means for this kind of task, precisely enough that a model can enforce it.&#xA;The judgment that used to be applied privately, one pull request at a time, is now applied once, at the skill level, where it benefits every future execution.&lt;/p&gt;&#xA;&lt;p&gt;This shift is why a good skill library is one of the most valuable assets a team can hold.&#xA;It is the institutional memory of how the team does things well, written in a form that executes itself instead of sitting in a wiki nobody reads.&#xA;&lt;strong&gt;When a senior engineer leaves, the skills stay, and the standard stays with them.&lt;/strong&gt;&#xA;When a new engineer joins, they do not spend a year absorbing the conventions through code review.&#xA;They load the skills on day one, and their first pull request already follows the team&amp;rsquo;s process.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What a Skill Has to Get Right to Actually Level the Field&#xA;    &lt;div id=&#34;what-a-skill-has-to-get-right-to-actually-level-the-field&#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-a-skill-has-to-get-right-to-actually-level-the-field&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Not every file labeled &amp;ldquo;skill&amp;rdquo; collapses the variance.&#xA;Most do not.&#xA;Writing a skill that raises everyone to the same level requires a few specific disciplines.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Encode the steps that are actually forgotten, not the steps everyone already does.&lt;/strong&gt;&#xA;A skill that says &amp;ldquo;write clean code&amp;rdquo; is worthless, because nobody sets out to write dirty code and the phrase carries no executable instruction.&#xA;A skill that says &amp;ldquo;before implementing, run a search for existing solutions and list what you found&amp;rdquo; changes behavior, because that is exactly the step people skip when they are in a hurry.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make the gates concrete enough for a model to evaluate.&lt;/strong&gt;&#xA;&amp;ldquo;Make sure it is well tested&amp;rdquo; is an opinion.&#xA;&amp;ldquo;Write tests for the empty input, the maximum value, and the concurrent case, then run the suite and confirm it passes&amp;rdquo; is a gate.&#xA;The whole mechanism depends on the model being able to check its own work, and it can only do that against criteria it can test.&#xA;The need for testable criteria is the same reason I argued, in &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt;, that quality is a property of your constraints, not of your reviewers.&#xA;The constraints in a skill are where the quality actually lives.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Keep the skill shorter than the attention it will receive.&lt;/strong&gt;&#xA;As the &amp;ldquo;lost in the middle&amp;rdquo; work showed, &lt;a href=&#34;https://arxiv.org/abs/2307.03172&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;a model&amp;rsquo;s reliability degrades when a context fills with noise&lt;/a&gt;.&#xA;A skill that tries to encode every possible consideration becomes a skill the model half-follows.&#xA;Prefer several focused skills over one giant document, and cut anything the model would do correctly without being told.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Version and maintain it like the code it produces.&lt;/strong&gt;&#xA;A skill that encodes a convention from two years ago is worse than no skill, because it enforces a stale standard on every run.&#xA;Treat the skill library as part of the codebase, with owners, review, and the same &amp;ldquo;does this still justify its cost?&amp;rdquo; scrutiny you would give any dependency.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Realistic Limits&#xA;    &lt;div id=&#34;the-realistic-limits&#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-realistic-limits&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Skills only work for the part of the job that is describable, and it is worth being clear about where that stops.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Skills cannot encode taste that the writer cannot articulate.&lt;/strong&gt;&#xA;If your best engineer&amp;rsquo;s advantage is a feel for when an abstraction is about to collapse, and they cannot explain the signals they are reading, that advantage does not survive the translation into a file.&#xA;It stays in their head, and the skill without it will produce work that is competent but not inspired.&#xA;For the routine majority of software, which is most of software, the describable process is enough.&#xA;For the genuinely hard design calls, it is not.&lt;/p&gt;&#xA;&lt;p&gt;Skills can also lock in mediocrity.&#xA;&lt;strong&gt;A skill that encodes a mediocre process enforces that mediocrity on everyone, consistently, forever.&lt;/strong&gt;&#xA;The mechanism is morally neutral.&#xA;It collapses the variance in whichever direction the skill points, so a careless skill library can quietly lower a strong team to a lower common standard instead of raising the rest.&#xA;The remedy is that the skills themselves have to be written by the people whose process you actually want to reproduce, and revisited when the process improves.&lt;/p&gt;&#xA;&lt;p&gt;Finally, skills raise the standard for producing code, but producing code was never the only bottleneck.&#xA;As &lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; argues, deciding whether a feature should exist, and writing a precise specification for it, remain human and valuable.&#xA;Skills make the execution layer homogeneous.&#xA;They do not decide what to execute.&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;p&gt;You do not need a grand migration to start closing the gap.&lt;/p&gt;&#xA;&lt;p&gt;Pick the one task where your team&amp;rsquo;s output varies the most, the one where the senior engineer&amp;rsquo;s pull request looks nothing like the junior&amp;rsquo;s.&#xA;Write down the steps your strongest engineer actually takes when they do it well, the steps they would never admit to because they seem obvious to them.&#xA;Turn that into a skill, and run the next instance of that task through it, regardless of who is doing it.&lt;/p&gt;&#xA;&lt;p&gt;Watch the output converge toward the standard.&#xA;Then do it again for the next task.&#xA;The variance does not close all at once.&#xA;It closes one encoded process at a time, and each skill you add moves a piece of seniority from a private habit to a shared standard.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The team that wins in this era is not the one with the most powerful model.&#xA;It is the one whose best engineer&amp;rsquo;s process runs, unchanged and unskipped, in every other engineer&amp;rsquo;s session.&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;https://tomrochette.com/developer-trust-profiles/&#34; &gt;Developer Trust Profiles&lt;/a&gt; - names the end state this article describes how to reach, where authorship stops carrying signal because everyone ships the same quality&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; - why context is the entire mechanism by which a frozen model produces good output, and why a skill is just well-engineered context&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; - how each layer of automation pushes leverage, and seniority, one step up the decision chain&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;Rethinking Code Review in the Age of LLMs&lt;/a&gt; - the case that quality is a property of your constraints, not your reviewers, which is exactly what a skill encodes&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - which processes to keep and which to eliminate once execution is cheap&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/when-engineers-disagree-on-best-practices/&#34; &gt;When Engineers Disagree on Best Practices&lt;/a&gt; - how teams settle the conventions that skills eventually enforce&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://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tomzx/agents&lt;/a&gt; - a working library of the skills this article describes, including the create-implementation and quick-pr-review skills referenced throughout the blog&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2005.14165&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Brown et al., &amp;ldquo;Language Models are Few-Shot Learners&amp;rdquo;&lt;/a&gt; - established in-context learning, the capability that lets a loaded skill alter a model&amp;rsquo;s behavior without retraining&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2307.03172&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Liu et al., &amp;ldquo;Lost in the Middle: How Language Models Use Long Contexts&amp;rdquo;&lt;/a&gt; - why a skill must stay focused, since model reliability degrades as context fills with noise&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Checklist_Manifesto&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;The Checklist Manifesto&amp;rdquo;&lt;/a&gt; - Atul Gawande&amp;rsquo;s case that disciplined checklists outperform expert memory, the human analogue to the skills mechanism&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>When Engineers Disagree on Best Practices: Surviving the Forming Stage</title>
      <link>https://tomrochette.com/when-engineers-disagree-on-best-practices/</link>
      <pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/when-engineers-disagree-on-best-practices/</guid>
      <category>software-engineering</category><category>team-management</category><category>decision-making</category><category>conflict-resolution</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A new team&amp;rsquo;s first disagreement about best practices is not a warning sign.&#xA;It is the moment the team actually starts becoming a team.&#xA;&lt;strong&gt;What separates teams that survive this phase from those that stall is not which practices they adopt, but how they resolve the disagreement.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why the Forming Stage Produces Disagreement&#xA;    &lt;div id=&#34;why-the-forming-stage-produces-disagreement&#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;#why-the-forming-stage-produces-disagreement&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every engineer arrives with a set of practices that worked somewhere else.&#xA;The testing strategy that saved your last team from weekly regressions.&#xA;The code review checklist that caught the security bug before it shipped.&#xA;The branching model that kept releases sane.&#xA;These are not random preferences.&#xA;&lt;strong&gt;They are lessons from actual failures, and the engineer who brings them believes, correctly, that they matter.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The problem is that every other engineer on the new team arrives with their own set of practices, learned from different failures.&#xA;When these differing practices meet, you get the pattern Bruce Tuckman described in his 1965 study of small-group development: &lt;a href=&#34;https://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;forming, storming, norming, performing&lt;/a&gt;.&#xA;Teams do not skip from forming straight to performing.&#xA;They pass through storming, the phase where members test each other, surface conflicting assumptions, and negotiate how work should be done.&lt;/p&gt;&#xA;&lt;p&gt;The forming stage is uniquely prone to practice disagreements for three reasons.&lt;/p&gt;&#xA;&lt;p&gt;First, there is no shared history.&#xA;On an established team, conventions are settled and invisible.&#xA;The team just does things a certain way because that is how it has always been done.&#xA;A new team has no &amp;ldquo;always,&amp;rdquo; so everything is up for debate at once.&lt;/p&gt;&#xA;&lt;p&gt;Second, there is no established trust.&#xA;Disagreeing about code style feels low-stakes on a team where everyone has shipped together for a year, because everyone knows the argument is about the style, not about competence.&#xA;On a new team, the same disagreement can feel like a judgment of someone&amp;rsquo;s expertise, because no one has yet proven anything to anyone else.&lt;/p&gt;&#xA;&lt;p&gt;Third, there is no shared vocabulary for resolving conflict.&#xA;An established team has accumulated meta-norms: how they make decisions, who decides what, when to escalate, when to let something go.&#xA;A new team has none of this.&#xA;So every disagreement is also, simultaneously, a negotiation about how disagreements get resolved.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Most &amp;ldquo;Best Practice&amp;rdquo; Debates Are Preference Debates&#xA;    &lt;div id=&#34;most-best-practice-debates-are-preference-debates&#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;#most-best-practice-debates-are-preference-debates&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first thing to recognize is that the phrase &amp;ldquo;best practice&amp;rdquo; misleads.&#xA;A best practice is a practice that is demonstrably better than its alternatives across most contexts.&#xA;Very few software engineering practices meet that standard.&lt;/p&gt;&#xA;&lt;p&gt;Consider the debates that take up the most discussion time on a new team.&#xA;Tabs versus spaces.&#xA;Git Flow versus trunk-based development.&#xA;Story points versus no estimates.&#xA;Unit tests versus integration tests as the primary signal.&#xA;Commit message conventions.&#xA;These are not best practices.&#xA;They are conventions, and a convention&amp;rsquo;s value comes almost entirely from being shared, not from being optimal.&#xA;&lt;strong&gt;The team that uses the second-best testing framework consistently will outperform the team that uses the best one inconsistently.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This does not mean all practices are equal.&#xA;Some debates involve genuine principles where the choice has lasting consequences: whether to build or buy a critical dependency, how much to invest in observability before shipping, whether a monolith or services is the right starting architecture.&#xA;These deserve careful deliberation.&#xA;The skill is in telling the convention debate from the principle debate, because they require completely different resolution mechanisms.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Reversible Versus Irreversible Decisions&#xA;    &lt;div id=&#34;reversible-versus-irreversible-decisions&#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;#reversible-versus-irreversible-decisions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A distinction that &lt;a href=&#34;https://www.amazon.com/p/feature/z6o9g6sysxur57t&#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=www.amazon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Jeff Bezos drew in his 2016 letter to shareholders&lt;/a&gt; maps directly onto the convention-versus-principle problem.&#xA;Some decisions are one-way doors.&#xA;Once you walk through, you cannot come back.&#xA;Choosing a primary database, committing to a cloud provider, or picking a framework that will permeate your codebase are one-way door decisions.&#xA;These deserve heavy deliberation, because the cost of being wrong is high and the cost of reversing is higher.&lt;/p&gt;&#xA;&lt;p&gt;Most practice debates on a new team are two-way doors.&#xA;You can adopt trunk-based development, try it for six weeks, and switch back if it is not working.&#xA;You can pick a linter configuration, discover it fights your codebase, and change it.&#xA;&lt;strong&gt;Two-way door decisions should be made quickly, because the fastest way to learn is often to try.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A new team that treats every practice debate as a one-way door will spend its first two months in meetings and produce nothing.&#xA;A team that treats a genuine one-way door as reversible will make a choice it regrets for years.&#xA;The discipline is in classifying the decision before debating it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Experiment Mindset&#xA;    &lt;div id=&#34;the-experiment-mindset&#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-experiment-mindset&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The single most effective frame for resolving practice disagreement during forming is to treat practices as hypotheses, not as identities.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When two engineers disagree about whether to require code review before merge, the unproductive version of that conversation is an argument about whether code review is good.&#xA;Both people hold their position, cite their favorite blog posts, and the discussion becomes about winning.&lt;/p&gt;&#xA;&lt;p&gt;The productive version converts the disagreement into an experiment.&#xA;You require code review for the next month, track how many defects it catches in review versus in production, and look at the data together at the end.&#xA;Now the two engineers are not opponents.&#xA;They are co-investigators running the same experiment.&lt;/p&gt;&#xA;&lt;p&gt;The experiment works because it removes the requirement that someone be wrong.&#xA;An engineer who advocated for mandatory review does not lose standing if the experiment shows it adds little value, because they ran the test in good faith.&#xA;An engineer who opposed it does not lose standing if the experiment shows it catches actual bugs, because they agreed to look at the evidence.&lt;/p&gt;&#xA;&lt;p&gt;A few rules make experiments work.&lt;/p&gt;&#xA;&lt;p&gt;Time-box them.&#xA;An open-ended experiment is just a delayed argument.&#xA;Four to six weeks is usually enough to see signal without exhausting the team&amp;rsquo;s patience.&lt;/p&gt;&#xA;&lt;p&gt;Define success criteria before you start.&#xA;If you wait until the experiment is over to decide what would count as success, you will re-litigate the original disagreement with data instead of opinions, which is only marginally better.&lt;/p&gt;&#xA;&lt;p&gt;Keep the cost of reversal low.&#xA;If switching back after the experiment is expensive, the experiment is an irreversible decision.&lt;/p&gt;&#xA;&lt;p&gt;Write down the result.&#xA;A one-paragraph note recording what you tried, what you observed, and what you decided turns a single resolution into institutional memory that saves the next new team member from repeating the same debate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How You Decide Matters More Than What You Decide&#xA;    &lt;div id=&#34;how-you-decide-matters-more-than-what-you-decide&#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;#how-you-decide-matters-more-than-what-you-decide&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the point that is easy to miss when you are in the middle of a heated debate about, say, whether to use feature branches or trunk-based development.&lt;/p&gt;&#xA;&lt;p&gt;The specific answer matters less than you think.&#xA;&lt;strong&gt;What matters enormously, especially during the forming stage, is that the team builds a repeatable process for reaching decisions together.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A team that resolves its first disagreement well, with a clear process, shared evidence, and a decision everyone can live with, has just created something more valuable than the practice it chose.&#xA;It has created the template for the next disagreement, and the one after that.&#xA;Each resolved disagreement makes the next one easier, because the meta-process is now familiar.&lt;/p&gt;&#xA;&lt;p&gt;A team that resolves its first disagreement badly, by letting the loudest person win, or by avoiding the conflict until it grows worse, or by escalating to a manager who picks a winner, has also created a template.&#xA;That template will repeat.&#xA;&lt;strong&gt;The first disagreement a new team faces sets the pattern for every disagreement that follows.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That template is why the forming stage deserves deliberate attention rather than the hope that things will sort themselves out.&#xA;The norms a team establishes in its first weeks tend to persist.&#xA;They become &amp;ldquo;how we do things here,&amp;rdquo; and once that identity forms, it is far harder to change later than to set well at the start.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A Playbook for the First Disagreement&#xA;    &lt;div id=&#34;a-playbook-for-the-first-disagreement&#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;#a-playbook-for-the-first-disagreement&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Concretely, when the first genuine practice disagreement surfaces on a new team, the following sequence works.&lt;/p&gt;&#xA;&lt;p&gt;Name it.&#xA;Say out loud that this is a disagreement about practice, that disagreements are expected, and that the goal is to find a resolution the team can commit to, not to identify who is right.&lt;/p&gt;&#xA;&lt;p&gt;Classify it.&#xA;Ask whether this is a convention debate, where value comes from consistency, or a principle debate, where the choice has lasting consequences.&#xA;Ask whether it is a one-way door or a two-way door.&lt;/p&gt;&#xA;&lt;p&gt;For conventions and two-way doors, decide fast.&#xA;Default to whoever has to live with the consequence most directly, or to the option that is easiest to change, or to the existing convention if one already exists.&#xA;Time-box the decision to one conversation, not three.&lt;/p&gt;&#xA;&lt;p&gt;For principles and one-way doors, slow down.&#xA;Write a short decision record capturing the options, the trade-offs, and the reasoning.&#xA;Get the right people in the room, which usually means the people who will own the consequences, not necessarily the people with the strongest opinions.&lt;/p&gt;&#xA;&lt;p&gt;Either way, record the outcome.&#xA;A one-page architecture decision record or a paragraph in the team handbook turns a fragile verbal agreement into something a new hire can read six months later.&lt;/p&gt;&#xA;&lt;p&gt;And then commit.&#xA;The principle of &lt;a href=&#34;https://en.wikipedia.org/wiki/Disagree_and_commit&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;disagree and commit&lt;/a&gt; applies here.&#xA;Once the team has decided, even those who argued otherwise support the decision fully.&#xA;&lt;strong&gt;A practice executed with full commitment and an imperfect choice beats a better practice executed with resentment and inconsistency.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When Someone Refuses to Commit&#xA;    &lt;div id=&#34;when-someone-refuses-to-commit&#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;#when-someone-refuses-to-commit&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a failure mode worth naming.&lt;/p&gt;&#xA;&lt;p&gt;Occasionally an engineer treats a practice debate as something they will not concede under any circumstance, refuses to accept the team&amp;rsquo;s decision, and continues working the old way.&#xA;This is no longer a disagreement about practice.&#xA;It is a disagreement about whether the team&amp;rsquo;s decision-making process has legitimacy.&lt;/p&gt;&#xA;&lt;p&gt;This must be addressed directly, and early.&#xA;&lt;strong&gt;A team that tolerates a member who overrides collective decisions after they are made has no process at all.&lt;/strong&gt;&#xA;It has a veto by the most stubborn person.&#xA;The conversation is no longer about the practice.&#xA;It is about participation in a shared system.&lt;/p&gt;&#xA;&lt;p&gt;In a healthy forming team, this conversation is rare, because the process itself was fair enough that losing a debate does not feel like losing status.&#xA;When it does happen, resolving it cleanly, with empathy but without accommodation, is one of the most important trust-building acts the team will undertake.&#xA;Underneath that trust is psychological safety, the shared belief that you can speak up, dissent, and even be wrong without being humiliated, which &lt;a href=&#34;https://rework.withgoogle.com/print/guides/5727380657274880/&#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=rework.withgoogle.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google&amp;rsquo;s Project Aristotle&lt;/a&gt; identified as the single strongest predictor of team effectiveness.&#xA;A team cannot storm productively without it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Payoff&#xA;    &lt;div id=&#34;the-payoff&#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-payoff&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A team that navigates its forming-stage disagreements well emerges with two assets.&lt;/p&gt;&#xA;&lt;p&gt;The first is a set of shared conventions, probably imperfect, that let the team move fast without relitigating every choice.&#xA;The second, and more important, is a shared process for handling the next thing they do not yet agree on.&lt;/p&gt;&#xA;&lt;p&gt;New disagreements never stop.&#xA;The codebase grows, the team grows, technology changes, and yesterday&amp;rsquo;s settled practice becomes tomorrow&amp;rsquo;s debate.&#xA;The teams that handle this well are not the ones that picked the best practices on day one.&#xA;&lt;strong&gt;They are the ones that learned, during forming, how to disagree productively, decide efficiently, and commit fully.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That skill compounds for the life of the team.&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;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; - team composition and which processes are worth keeping under pressure&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/principles/&#34; &gt;Principles&lt;/a&gt; &amp;ndash; decision-making principles, including separating structural friction from waste&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://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Tuckman&amp;rsquo;s stages of group development&amp;rdquo;&lt;/a&gt; - the forming-storming-norming-performing model that explains why early friction is structural, not pathological&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Disagree_and_commit&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wikipedia, &amp;ldquo;Disagree and commit&amp;rdquo;&lt;/a&gt; - documents the one-way/two-way door distinction and the disagree-and-commit principle for group decision-making&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rework.withgoogle.com/print/guides/5727380657274880/&#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=rework.withgoogle.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google re:Work, &amp;ldquo;Guide: Understand team effectiveness&amp;rdquo;&lt;/a&gt; - Project Aristotle&amp;rsquo;s finding that psychological safety is the top predictor of team performance&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Managing Many Concurrent LLM Agent Sessions</title>
      <link>https://tomrochette.com/managing-many-llm-agent-sessions/</link>
      <pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/managing-many-llm-agent-sessions/</guid>
      <category>llm</category><category>ai-agents</category><category>human-in-the-loop</category><category>cognitive-load</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&lt;strong&gt;When one person can spawn a dozen LLM agent sessions in parallel, the bottleneck is no longer the agents.&lt;/strong&gt;&#xA;&lt;strong&gt;It is the human trying to keep track of them all.&lt;/strong&gt;&#xA;Your working memory holds a handful of items at best, your context switching cost is measurable, and every interruption leaves residue that degrades the next task you pick up.&#xA;The question is not whether you can run 20 sessions simultaneously.&#xA;The question is whether you can remain effective while doing so.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cognitive Bottleneck&#xA;    &lt;div id=&#34;the-cognitive-bottleneck&#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-cognitive-bottleneck&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before discussing strategies, it helps to understand what actually limits a human supervisor.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Working memory is tiny.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;George Miller&amp;rsquo;s foundational work&lt;/a&gt; suggested that humans can hold approximately seven plus or minus two items in short-term memory.&#xA;Later research by &lt;a href=&#34;https://en.wikipedia.org/wiki/Working_memory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Nelson Cowan&lt;/a&gt; revised this estimate down to about four chunks for young adults.&#xA;Either way, the number is small.&#xA;If each agent session requires you to remember its goal, its current state, its blockers, and the decision you were about to make, you hit the ceiling at three to five sessions, not twenty.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Context switching has a measurable cost.&lt;/strong&gt;&#xA;Research on &lt;a href=&#34;https://en.wikipedia.org/wiki/Human_multitasking&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;task switching&lt;/a&gt; in cognitive psychology shows that switching between tasks incurs a time penalty, sometimes called &amp;ldquo;switch cost.&amp;rdquo;&#xA;This cost ranges from fractions of a second to several minutes depending on task complexity.&#xA;When you switch from agent session A to agent session B, you must offload A&amp;rsquo;s context from your working memory, load B&amp;rsquo;s context, and reconstruct where you left off.&#xA;The more complex each session&amp;rsquo;s context, the more expensive the switch.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Attention residue accumulates.&lt;/strong&gt;&#xA;When you switch from one task to another without fully completing the first, part of your attention remains stuck on the previous task.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Zeigarnik_effect&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The Zeigarnik effect&lt;/a&gt; describes how unfinished tasks persist in memory, consuming cognitive resources even when you are trying to focus on something else.&#xA;With multiple agent sessions running concurrently, many are perpetually unfinished, creating constant attention residue.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Decision fatigue compounds.&lt;/strong&gt;&#xA;Each agent session requires you to make decisions: approve this output, redirect this approach, answer this clarifying question.&#xA;Research on &lt;a href=&#34;https://en.wikipedia.org/wiki/Decision_fatigue&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;decision fatigue&lt;/a&gt; shows that the quality of decisions degrades after a long session of choice-making.&#xA;Supervising many sessions means making many decisions, and the later decisions in the day will be worse than the earlier ones unless you manage the load.&lt;/p&gt;&#xA;&lt;p&gt;Working memory, switch cost, attention residue, and decision fatigue together define the ceiling on how many sessions you can manage.&#xA;Every strategy below works by attacking one or more of them.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 1: Externalize All Session State&#xA;    &lt;div id=&#34;strategy-1-externalize-all-session-state&#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;#strategy-1-externalize-all-session-state&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The single most powerful principle is to stop relying on your brain to hold session state.&#xA;If it is not written down, it is consuming working memory.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Maintain a state file per session.&lt;/strong&gt;&#xA;Every agent session should produce a machine-readable and human-readable state file that captures its current status, goal, progress, blockers, and next steps.&#xA;When you return to a session after an hour or a day, you read the file, not your memory.&#xA;The file is the single source of truth.&#xA;This state file is the agent equivalent of the &lt;a href=&#34;https://tomrochette.com/workstack/&#34; &gt;workstack&lt;/a&gt; concept applied at scale.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Use structured status summaries.&lt;/strong&gt;&#xA;The state file should follow a consistent template across all sessions.&#xA;A format like the following works well:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Session: fix-auth-bug&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Goal: Fix OAuth callback failing on production&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Status: blocked&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Progress: Identified root cause (clock skew on load balancer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Blocker: Need production access to verify fix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Next: Deploy fix to staging, verify callback works&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;When every session uses the same structure, you can scan a dashboard of twenty sessions in under a minute.&#xA;The consistency eliminates the cognitive parsing overhead that comes from varied formats.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write decisions to a log.&lt;/strong&gt;&#xA;Every decision you make about a session should be written to the session&amp;rsquo;s log file with a timestamp and rationale.&#xA;Writing to the log serves two purposes.&#xA;First, when you return to the session, you can see not just where it is but why it is there, without reconstructing the reasoning.&#xA;Second, the log becomes an audit trail that other humans (or agents) can consume.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Checkpoint before switching.&lt;/strong&gt;&#xA;Before switching away from any session, write a one-line &amp;ldquo;resume hint&amp;rdquo; that tells your future self exactly where to pick up.&#xA;This takes five seconds and saves minutes of reconstruction time.&#xA;The hint should be specific enough that you can act on it without re-reading the entire session history.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 2: Standardize All Interactions&#xA;    &lt;div id=&#34;strategy-2-standardize-all-interactions&#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;#strategy-2-standardize-all-interactions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Variability prevents scaling.&#xA;Every difference between how sessions operate is a new thing your brain must parse, increasing cognitive load and switch cost.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Use a uniform session protocol.&lt;/strong&gt;&#xA;Every session should follow the same lifecycle: initialization, execution, checkpointing, escalation, and completion.&#xA;The protocol defines what the agent does at each stage, what it reports, and how it signals that it needs human input.&#xA;When the protocol is uniform, switching between sessions costs less because you always know what to expect.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Standardize output formats.&lt;/strong&gt;&#xA;If session A reports progress in a bulleted list and session B writes a paragraph and session C uses a table, your brain must context-switch not just on content but on format.&#xA;Pick one format and enforce it everywhere.&#xA;Markdown headers, numbered lists, and consistent section ordering let your eyes scan quickly without parsing structure.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Establish a shared vocabulary.&lt;/strong&gt;&#xA;Define the terms agents use to communicate status: &amp;ldquo;blocked,&amp;rdquo; &amp;ldquo;waiting-for-human,&amp;rdquo; &amp;ldquo;in-progress,&amp;rdquo; &amp;ldquo;complete,&amp;rdquo; &amp;ldquo;failed.&amp;rdquo;&#xA;Every agent uses the same words to mean the same things.&#xA;A shared vocabulary reduces ambiguity and eliminates the need to translate between sessions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Create session naming conventions.&lt;/strong&gt;&#xA;A session named &amp;ldquo;auth-fix-3&amp;rdquo; tells you nothing when you have twenty sessions.&#xA;A session named &amp;ldquo;fix-oauth-callback-prod-bug&amp;rdquo; tells you exactly what it is doing.&#xA;Descriptive names reduce the time to identify and triage sessions, which reduces the overhead of switching between them.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 3: Make Interactions Asynchronous and Batched&#xA;    &lt;div id=&#34;strategy-3-make-interactions-asynchronous-and-batched&#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;#strategy-3-make-interactions-asynchronous-and-batched&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Synchronous interaction with agents prevents parallelism.&#xA;If you must respond to each agent within seconds, you can only effectively manage one at a time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Let agents run to a natural stopping point.&lt;/strong&gt;&#xA;Instead of watching each agent in real-time and responding to each question as it arises, configure agents to work until they hit a genuine blocker.&#xA;At that point, they checkpoint their state and wait.&#xA;You then process the batch of blocked agents at your convenience.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Batch your decisions.&lt;/strong&gt;&#xA;When multiple sessions need human input, collect all the requests and process them in a single sitting.&#xA;Batching is more efficient than context-switching for each one individually, because you stay in the same cognitive &amp;ldquo;mode&amp;rdquo; for the entire batch.&#xA;Five decisions made in one focused session will be faster and higher quality than the same five decisions made across five interruptions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Time-box your session reviews.&lt;/strong&gt;&#xA;Instead of monitoring sessions continuously, check them at fixed intervals: every 30 minutes, every hour, twice a day.&#xA;This creates predictable rhythm and eliminates the reactive, interrupt-driven pattern that fragments attention.&#xA;Between check-ins, agents work autonomously and you focus on other things.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Coalesce interruptions.&lt;/strong&gt;&#xA;If you have three sessions that will each need input within the next 15 minutes, do not handle them one at a time.&#xA;Wait until all three are ready, then handle them together.&#xA;Interruption coalescing is a well-known technique in operating systems and it applies equally to human attention management.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 4: Make Agents Resolve Their Own Ambiguities&#xA;    &lt;div id=&#34;strategy-4-make-agents-resolve-their-own-ambiguities&#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;#strategy-4-make-agents-resolve-their-own-ambiguities&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every question an agent asks you is a context switch.&#xA;The fewer questions it asks, the more sessions you can manage.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Provide rich default resolution rules.&lt;/strong&gt;&#xA;Instead of letting agents escalate every ambiguity, give them standing instructions for common situations.&#xA;&amp;ldquo;If the test suite fails, attempt to fix it before escalating.&amp;rdquo;&#xA;&amp;ldquo;If a dependency is missing, install it from the lockfile.&amp;rdquo;&#xA;&amp;ldquo;If a naming convention is unclear, follow the pattern used in the nearest file.&amp;rdquo;&#xA;These defaults eliminate a large fraction of questions that would otherwise interrupt you.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Define escalation thresholds explicitly.&lt;/strong&gt;&#xA;Agents should escalate to you only when they cross a defined threshold: they have tried multiple approaches and failed, they need access they do not have, or they are about to make an irreversible decision.&#xA;Everything else should be handled autonomously.&#xA;The clearer the threshold, the fewer unnecessary escalations.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Allow agents to ask other agents.&lt;/strong&gt;&#xA;If you have multiple sessions running, agents can sometimes resolve each other&amp;rsquo;s questions.&#xA;An agent that needs to understand how another part of the system works can query the agent working on that part.&#xA;This peer-to-peer resolution keeps you out of the loop for routine coordination.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Use confidence-based escalation.&lt;/strong&gt;&#xA;Agents that can express confidence in their outputs can be configured to escalate only when confidence drops below a threshold.&#xA;High-confidence work proceeds without interruption.&#xA;Low-confidence work pauses for review.&#xA;Confidence-based escalation naturally filters your attention toward the sessions that need it most.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 5: Use Hierarchical Orchestration&#xA;    &lt;div id=&#34;strategy-5-use-hierarchical-orchestration&#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;#strategy-5-use-hierarchical-orchestration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The most effective way to manage many agents is to not manage them all directly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Introduce orchestrator agents.&lt;/strong&gt;&#xA;Instead of you supervising 20 worker agents, have 4 orchestrator agents each supervise 5 workers.&#xA;You interact only with the orchestrators, who aggregate and summarize their workers&amp;rsquo; status.&#xA;This reduces your direct interaction count by a factor of 5 and lets you operate within your working memory limit.&#xA;This mirrors the pattern described in &lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt;, where the orchestration layer replaces the human management layer.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Fan-out and fan-in.&lt;/strong&gt;&#xA;Give an orchestrator a single high-level task.&#xA;It decomposes the task, assigns subtasks to workers, collects results, and presents you with a synthesized output.&#xA;You never interact with the individual workers.&#xA;Your cognitive load is the same whether the orchestrator manages 3 workers or 30.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Assign team leads per domain.&lt;/strong&gt;&#xA;If your agents work across multiple domains (frontend, backend, infrastructure, testing), assign one orchestrator per domain.&#xA;Each domain lead reports to you with a one-paragraph summary.&#xA;You manage four domain leads instead of twenty individual contributors.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer the hierarchy as needed.&lt;/strong&gt;&#xA;For very large numbers of agents, add another layer.&#xA;A chief orchestrator manages domain orchestrators, who manage team leads, who manage workers.&#xA;Each layer compresses information, so you always deal with a manageable number of direct reports.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 6: Practice Progressive Disclosure&#xA;    &lt;div id=&#34;strategy-6-practice-progressive-disclosure&#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;#strategy-6-practice-progressive-disclosure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You should never need to understand everything about every session to make a decision.&#xA;Information should arrive in layers, from summary to detail, on demand.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Lead with the one-line summary.&lt;/strong&gt;&#xA;Every session status should begin with a single sentence that tells you whether action is needed: &amp;ldquo;Session blocked, needs your decision on X&amp;rdquo; or &amp;ldquo;Session running normally, 60% complete.&amp;rdquo;&#xA;If the summary says no action needed, you move on.&#xA;You never read the details unless the summary demands it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Provide drill-down on request.&lt;/strong&gt;&#xA;Behind the one-line summary is a paragraph.&#xA;Behind the paragraph is the full session log.&#xA;Behind the log are the raw outputs.&#xA;Each layer is available but not shown by default.&#xA;Progressive disclosure keeps your default view clean and your cognitive load low.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Use severity indicators.&lt;/strong&gt;&#xA;Color-code or tag sessions by urgency: red for &amp;ldquo;needs immediate human input,&amp;rdquo; yellow for &amp;ldquo;proceeding but with a risk you should know about,&amp;rdquo; green for &amp;ldquo;all clear.&amp;rdquo;&#xA;Your eye scans for red first, yellow second, and ignores green.&#xA;This triage happens in seconds, not minutes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Summarize at the right granularity.&lt;/strong&gt;&#xA;An orchestrator reporting &amp;ldquo;all five workers are making progress&amp;rdquo; is useless if one of them is about to make a critical mistake.&#xA;An orchestrator reporting every token from every worker is noise.&#xA;The right granularity is: what is done, what is in progress, what is blocked, and what decision you need to make next.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 7: Isolate Sessions from Each Other&#xA;    &lt;div id=&#34;strategy-7-isolate-sessions-from-each-other&#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;#strategy-7-isolate-sessions-from-each-other&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Interference between sessions is a major source of cognitive load.&#xA;When sessions share state, a change in one can invalidate your understanding of another.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Enforce session independence.&lt;/strong&gt;&#xA;Each session should operate in its own workspace, with its own file tree, its own dependencies, and its own state.&#xA;Sessions should not mutate shared resources that other sessions depend on.&#xA;Session independence prevents the &amp;ldquo;I changed something in session A that broke session B&amp;rdquo; problem, which is one of the most expensive debugging scenarios when managing many sessions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Use separate branches or worktrees.&lt;/strong&gt;&#xA;If sessions work on the same repository, each should use its own &lt;a href=&#34;https://git-scm.com/docs/git-worktree&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;git worktree&lt;/a&gt; or branch.&#xA;Separate worktrees ensure that the output of one session does not corrupt the working state of another.&#xA;When you are ready to integrate, you merge branches deliberately, not accidentally.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Scope tools and permissions per session.&lt;/strong&gt;&#xA;Each session should have access only to the tools and resources it needs.&#xA;A session fixing a frontend bug does not need database write access.&#xA;Scoping permissions reduces the impact of errors and eliminates cross-session interference.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Make session boundaries explicit.&lt;/strong&gt;&#xA;When you switch from session A to session B, the boundary should be clear.&#xA;Close session A&amp;rsquo;s workspace, open session B&amp;rsquo;s.&#xA;The physical or virtual separation reinforces the cognitive separation.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 8: Build a Session Dashboard&#xA;    &lt;div id=&#34;strategy-8-build-a-session-dashboard&#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;#strategy-8-build-a-session-dashboard&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When managing more than three or four sessions, you need a single view that shows all of them at once.&#xA;Switching between terminal tabs or IDE windows to check on each session is itself a form of context switching.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Create a single pane of glass.&lt;/strong&gt;&#xA;A dashboard that lists all active sessions with their status, progress, and severity indicators lets you assess every session in one glance.&#xA;This dashboard can be as simple as a generated text file or as sophisticated as a web UI.&#xA;The key is that it presents all sessions in a uniform, scannable format.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Surface only actionable information.&lt;/strong&gt;&#xA;The dashboard should show you what needs your attention, not everything that is happening.&#xA;Sessions running normally should be collapsed or summarized.&#xA;Sessions that need input should be highlighted.&#xA;The dashboard is a triage tool, not a log viewer.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Automate status collection.&lt;/strong&gt;&#xA;The dashboard should be generated automatically from the state files that each session produces.&#xA;No manual updates.&#xA;If a session&amp;rsquo;s state file changes, the dashboard reflects it.&#xA;Automatic generation eliminates the overhead of manually polling each session for status.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Add alerting for critical events.&lt;/strong&gt;&#xA;Instead of watching the dashboard continuously, configure alerts for events that genuinely require immediate attention: a session failed, a session is about to make an irreversible change, a session has been blocked for more than N minutes.&#xA;Everything else can wait for your next scheduled review.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 9: Use AI to Triage AI&#xA;    &lt;div id=&#34;strategy-9-use-ai-to-triage-ai&#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;#strategy-9-use-ai-to-triage-ai&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;One of the most effective ways to manage many agent sessions is to use an LLM to help you manage them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI-assisted summarization.&lt;/strong&gt;&#xA;Before you look at a blocked session, have an LLM read the session log and produce a one-paragraph summary of what happened, what the blocker is, and what decision you need to make.&#xA;The summary saves you from reading potentially hundreds of lines of conversation history.&#xA;The summary gets you to the decision point faster.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI-assisted triage.&lt;/strong&gt;&#xA;When you return from a break and find 12 sessions waiting for input, have an LLM rank them by urgency and group similar requests.&#xA;&amp;ldquo;Sessions 3, 7, and 12 all need the same decision about database schema, you can answer them together.&amp;rdquo;&#xA;&amp;ldquo;Session 9 is urgent, it is blocked on a production deploy.&amp;rdquo;&#xA;This pre-processing reduces your cognitive load and helps you batch effectively.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI-assisted decision drafting.&lt;/strong&gt;&#xA;For each blocked session, have an LLM propose a decision with rationale.&#xA;You review the proposal, accept it or modify it, and move on.&#xA;Reviewing a well-formed proposal is faster and less cognitively demanding than constructing a response from scratch, especially for the tenth session of the day.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI-assisted state reconstruction.&lt;/strong&gt;&#xA;When you return to a session after days away, have an LLM produce a &amp;ldquo;previously on&amp;rdquo; summary that reconstructs the relevant context.&#xA;A reconstructed summary is faster and more reliable than reading the full log yourself, and it handles the long-gap resumption problem that pure state files struggle with.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 10: Manage Your Own Cognitive Resources&#xA;    &lt;div id=&#34;strategy-10-manage-your-own-cognitive-resources&#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;#strategy-10-manage-your-own-cognitive-resources&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The human supervisor is a finite resource.&#xA;Strategies that optimize agent throughput while ignoring human cognitive limits will fail.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Chunk sessions into clusters.&lt;/strong&gt;&#xA;Instead of treating 20 sessions as 20 independent items, group them into 4 clusters of 5.&#xA;Each cluster shares a domain, a goal, or an orchestrator.&#xA;You manage 4 clusters, not 20 sessions.&#xA;This grouping leverages &lt;a href=&#34;https://en.wikipedia.org/wiki/Chunking_%28psychology%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;chunking&lt;/a&gt;, the same memory technique that lets experts recall complex board positions in chess.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Dedicate focus blocks.&lt;/strong&gt;&#xA;Reserve uninterrupted blocks of time for session supervision.&#xA;During a focus block, you process the queue of blocked sessions, make decisions, and unblock agents.&#xA;Outside of focus blocks, you do other work.&#xA;Focus blocks prevent the constant low-level attention drain that comes from monitoring sessions while trying to do other things.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reserve decision budget for high-stakes sessions.&lt;/strong&gt;&#xA;Not all decisions are equal.&#xA;A decision about whether to deploy to production matters more than a decision about variable naming.&#xA;Allocate your decision budget accordingly.&#xA;Make the important decisions when you are fresh.&#xA;Batch the trivial decisions and make them in a low-energy slot.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Take recovery breaks.&lt;/strong&gt;&#xA;Context switching and decision-making are cognitively expensive.&#xA;After a heavy session of supervising multiple agents, take a deliberate break to let attention residue dissipate.&#xA;This is not laziness, it is maintenance of the resource that matters most: your judgment.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 11: Reduce Session Count Through Better Task Definition&#xA;    &lt;div id=&#34;strategy-11-reduce-session-count-through-better-task-definition&#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;#strategy-11-reduce-session-count-through-better-task-definition&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The easiest session to manage is the one you never needed to start.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Write precise specifications.&lt;/strong&gt;&#xA;A well-specified task runs autonomously and produces fewer questions.&#xA;A vaguely specified task generates constant clarifying questions, each of which is a context switch.&#xA;Investing in specification quality before launching a session benefits the session for its entire lifetime.&#xA;This is the same principle described in &lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt;: the quality of the context determines the quality of the output.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Merge related tasks.&lt;/strong&gt;&#xA;If two tasks touch the same code or the same domain, combine them into one session instead of running two.&#xA;One session managing a coherent area is easier to track than two sessions with overlapping scope.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Eliminate unnecessary sessions.&lt;/strong&gt;&#xA;Before launching a new session, ask whether the task is worth the supervision overhead.&#xA;Some tasks are faster to do yourself than to delegate to an agent and then supervise.&#xA;The &lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;shifting bottleneck&lt;/a&gt; principle applies: as agent supervision becomes the bottleneck, the optimal strategy shifts from spawning more agents to being more selective about which tasks to delegate.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pre-compute common answers.&lt;/strong&gt;&#xA;If you find yourself answering the same type of question across multiple sessions, encode the answer once in a shared resource that all sessions can access.&#xA;A shared FAQ, a coding standards document, or a decision tree eliminates a category of future questions.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy 12: Version and Review Session Patterns&#xA;    &lt;div id=&#34;strategy-12-version-and-review-session-patterns&#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;#strategy-12-version-and-review-session-patterns&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Managing many sessions is a skill that improves with deliberate practice.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Record what worked.&lt;/strong&gt;&#xA;When a session runs smoothly from start to finish, note what made it smooth.&#xA;Was the specification clear?&#xA;Were the escalation thresholds well-calibrated?&#xA;Did the status format make triage easy?&#xA;These observations compound into better patterns over time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Post-mortem failed sessions.&lt;/strong&gt;&#xA;When a session drifts from its instructions, review why.&#xA;Did the agent lack critical context?&#xA;Did the escalation threshold let it run too long without checking in?&#xA;Did the state file fail to capture the information you needed to intervene effectively?&#xA;Each failure is a data point for improving the protocol.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Iterate on the protocol.&lt;/strong&gt;&#xA;The session protocol, the status format, the escalation rules, and the dashboard design should all evolve as you learn what works.&#xA;Treat your agent management system as a product that you are continuously improving.&#xA;The goal is not to find the perfect system on day one but to get a little better every week.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Share patterns across teams.&lt;/strong&gt;&#xA;If multiple people in your organization supervise agent sessions, share what works.&#xA;The patterns that reduce cognitive load for one person will likely help others.&#xA;This is the same knowledge-sharing principle that makes &lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;software engineering teams&lt;/a&gt; effective: institutional knowledge compounds when it is explicit and shared.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Ceiling: How Many Can You Actually Manage?&#xA;    &lt;div id=&#34;the-ceiling-how-many-can-you-actually-manage&#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-ceiling-how-many-can-you-actually-manage&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is no single number, but the constraints are concrete.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;With no system, no tooling, and synchronous interaction, a human can effectively manage 1 to 2 concurrent agent sessions.&lt;/strong&gt;&#xA;The cognitive overhead of tracking each session&amp;rsquo;s state in working memory and responding to questions in real time is too high to scale further.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;With externalized state files, standardized protocols, and asynchronous batching, 4 to 6 concurrent sessions become feasible.&lt;/strong&gt;&#xA;You are no longer holding state in your head, and you batch your interactions to reduce switch cost.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;With hierarchical orchestration, progressive disclosure, and a dashboard, 10 to 15 concurrent sessions are manageable.&lt;/strong&gt;&#xA;The orchestrators compress information, the dashboard provides a single view, and you interact with a manageable number of direct reports.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;With AI-assisted triage, tight escalation thresholds, and well-specified tasks, 20+ concurrent sessions are achievable for a human who has invested in the workflow.&lt;/strong&gt;&#xA;At this scale, you are no longer managing individual sessions.&#xA;&lt;strong&gt;You are managing a system that manages sessions.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The progression mirrors the &lt;a href=&#34;https://tomrochette.com/task-stack/&#34; &gt;task-stack&lt;/a&gt; philosophy: you push interruptions onto a stack, handle them in batches, and pop them off when done.&#xA;The difference is that the stack now contains not just your own tasks but the states of dozens of autonomous workers, and the stack is externalized rather than in your head.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Meta-Principle&#xA;    &lt;div id=&#34;the-meta-principle&#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-meta-principle&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every strategy in this article reduces to one of four operations on the cognitive constraints:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reduce working memory load&lt;/strong&gt; by externalizing state, standardizing formats, and chunking sessions into clusters.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reduce switch cost&lt;/strong&gt; by standardizing protocols, batching interactions, and isolating sessions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reduce attention residue&lt;/strong&gt; by letting sessions reach natural stopping points, taking recovery breaks, and using focus blocks.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reduce decision fatigue&lt;/strong&gt; by having agents resolve their own ambiguities, using decision templates, and reserving decision budget for high-stakes choices.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The agents are not the bottleneck.&lt;/strong&gt;&#xA;&lt;strong&gt;Your brain is.&lt;/strong&gt;&#xA;Every hour you spend engineering the workflow around your own cognitive limits is worth ten hours of trying to work through them.&lt;/p&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://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Miller, &amp;ldquo;The Magical Number Seven, Plus or Minus Two&amp;rdquo;&lt;/a&gt; &amp;ndash; established the working memory capacity limit that constrains how many sessions a human can track mentally&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Zeigarnik_effect&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Zeigarnik effect&lt;/a&gt; &amp;ndash; explains attention residue from unfinished tasks, a core problem when many sessions run concurrently&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Decision_fatigue&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Decision fatigue&lt;/a&gt; &amp;ndash; describes how decision quality degrades over a session, relevant to supervising many agents&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Chunking_%28psychology%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Chunking (psychology)&lt;/a&gt; &amp;ndash; the memory technique that enables grouping sessions into manageable clusters&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; &amp;ndash; established the orchestration layer as the replacement for human management in agent systems&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/&#34; &gt;The Importance of Context When Interacting with LLMs&lt;/a&gt; &amp;ndash; established that specification quality determines agent autonomy, reducing the need for human intervention&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; &amp;ndash; established the pattern of bottlenecks moving up the decision chain, applicable to the human supervisor as the new bottleneck&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/workstack/&#34; &gt;Workstack&lt;/a&gt; &amp;ndash; the note-taking concept that externalizes task state, the basis for session state files&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/task-stack/&#34; &gt;Task-stack&lt;/a&gt; &amp;ndash; the persistent task tracking tool that models the push/pop pattern for interruptions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>slack-cached - Cache Slack threads, channels, and users to a local SQLite database</title>
      <link>https://tomrochette.com/slack-cached/</link>
      <pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/slack-cached/</guid>
      <category>python</category><category>slack</category><category>cli</category><category>developer-tools</category><category>sqlite</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note (2026-07-02):&lt;/strong&gt; slack-cached has been renamed to &lt;a href=&#34;https://github.com/TomzxCode/slackx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slackx&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Slack is where your team&amp;rsquo;s decisions live, but the data doesn&amp;rsquo;t belong to you.&#xA;Search is slow, threads become hard to find, and the moment you leave a workspace the history is gone.&#xA;There&amp;rsquo;s no official CLI, and the web client is the only first-class way to read anything.&lt;/p&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://github.com/TomzxCode/slack-cached&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slack-cached&lt;/a&gt; to fix this.&#xA;It&amp;rsquo;s a small Python CLI that caches Slack threads, channel messages, users, and channels to a local SQLite database.&#xA;&lt;strong&gt;Once cached, the data is yours: query it with SQL, grep it, feed it to an LLM, or just read it offline.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The problem&#xA;    &lt;div id=&#34;the-problem&#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-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Slack makes exporting and archival surprisingly hard.&#xA;Export tools exist for admins, but most members aren&amp;rsquo;t admins.&#xA;The search box returns messages, but not in a form you can slice, join, or version.&#xA;Important decisions get lost in threads that nobody scrolls back to.&lt;/p&gt;&#xA;&lt;p&gt;The problem gets worse when you want to do anything programmatic.&#xA;Building a knowledge base, summarizing a channel, or tracking decisions all require raw access to the messages.&#xA;&lt;strong&gt;Hitting the Slack API on demand works, but you incur the latency and rate-limit cost every time, and edits disappear if you only ever fetch live.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How slack-cached works&#xA;    &lt;div id=&#34;how-slack-cached-works&#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;#how-slack-cached-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ uv sync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ uv run slack-cached --help&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usage: slack-cached &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;fetch,show,fetch-users,fetch-channels,show-users,show-channels,poll&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cache Slack threads to a &lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; SQLite database.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Cache a thread from a URL (no stdout, just a one-line summary on stderr):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch https://acme.slack.com/archives/C0123ABCDEF/p1700000000123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; messages &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; new/updated, full&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF/1700000000.123456&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Or by explicit channel and timestamp; run it again and it only asks Slack for what changed:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch --channel C0123ABCDEF --ts 1700000000.123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; messages &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; new/updated, full&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF/1700000000.123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch --channel C0123ABCDEF --ts 1700000000.123456   &lt;span class=&#34;c1&#34;&gt;# run again&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; messages &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; new/updated, incremental&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF/1700000000.123456&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Read it back, human-readable by default:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached show https://acme.slack.com/archives/C0123ABCDEF/p1700000000123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Thread C0123ABCDEF/1700000000.123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; message&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2023-11-14T22:13:20+00:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Alice Smith &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;alice&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Has anyone tried the new deploy script?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2023-11-14T22:15:12+00:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Bob Lee &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;bob&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Yes, but you need to bump the token first.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2023-11-14T22:16:45+00:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Alice Smith &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;alice&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Thanks!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;code&gt;show&lt;/code&gt; auto-fetches if the thread isn&amp;rsquo;t cached yet, and renders display names like &lt;code&gt;Alice Smith (alice)&lt;/code&gt; instead of raw user ids once you&amp;rsquo;ve cached users.&#xA;Pass &lt;code&gt;--json&lt;/code&gt; to get the raw records for piping into other tools:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached show --json https://acme.slack.com/archives/C0123ABCDEF/p1700000000123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;channel&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;C0123ABCDEF&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;channel_name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;deploys&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;thread_ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000000.123456&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;message_count&amp;#34;&lt;/span&gt;: 3,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;messages&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000000.123456&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;U1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Has anyone tried the new deploy script?&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000000.123456&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;U1&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;user_name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Alice Smith (alice)&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000112.000200&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;U2&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Yes, but you need to bump the token first.&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000112.000200&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;U2&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;user_name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Bob Lee (bob)&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000205.500300&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;U1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Thanks!&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1700000205.500300&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;U1&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;user_name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Alice Smith (alice)&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Channels, users, and polling&#xA;    &lt;div id=&#34;channels-users-and-polling&#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;#channels-users-and-polling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Cache every top-level message in a channel:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch --channel C0123ABCDEF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;142&lt;/span&gt; messages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;38&lt;/span&gt; fetched&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Add &lt;code&gt;--full-threads&lt;/code&gt; to also pull every reply thread, so you get the full conversation tree:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch --channel C0123ABCDEF --full-threads&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;318&lt;/span&gt; messages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;214&lt;/span&gt; fetched, &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt; threads with replies fetched&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;For continuous capture, &lt;code&gt;poll&lt;/code&gt; watches multiple channels and fetches new messages on a schedule.&#xA;Each entry in &lt;code&gt;--channels&lt;/code&gt; can be a channel id, a bare name (&lt;code&gt;general&lt;/code&gt;), or a &lt;code&gt;#&lt;/code&gt;-prefixed name (&lt;code&gt;#general&lt;/code&gt;); names are resolved against the cached channels, which is why the per-cycle summary below reports ids.&#xA;Progress goes to stderr, and (because of &lt;code&gt;--json&lt;/code&gt;) one compact JSON object per cycle goes to stdout. &lt;code&gt;Ctrl+C&lt;/code&gt; stops it gracefully:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached poll --channels &lt;span class=&#34;c1&#34;&gt;#general,#engineering,#deploys --interval 5m --last 5m --full-threads --json&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;polling &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; channel&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; every 5m &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;lookback: 5m, full_threads: True, concurrency: 3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cycle&amp;#34;&lt;/span&gt;: 1, &lt;span class=&#34;s2&#34;&gt;&amp;#34;elapsed_seconds&amp;#34;&lt;/span&gt;: 1.234, &lt;span class=&#34;s2&#34;&gt;&amp;#34;channels&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;channel&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;C001&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;fetched&amp;#34;&lt;/span&gt;: 3, &lt;span class=&#34;s2&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: 312&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;, &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;channel&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;C002&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;fetched&amp;#34;&lt;/span&gt;: 4, &lt;span class=&#34;s2&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: 188&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;, &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;channel&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;C003&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;fetched&amp;#34;&lt;/span&gt;: 0, &lt;span class=&#34;s2&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: 27&lt;span class=&#34;o&#34;&gt;}]}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cycle 1: &lt;span class=&#34;m&#34;&gt;7&lt;/span&gt; new message&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; across &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; channel&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; in 1.2s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;^C&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;poll stopped after &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; cycle&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;That stdout stream is easy to wire into a downstream pipeline or a knowledge-base builder.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally, cache the workspace&amp;rsquo;s users and channels so threads can be rendered with display names:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch-users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;processed &lt;span class=&#34;m&#34;&gt;184&lt;/span&gt; users &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;184&lt;/span&gt; added, &lt;span class=&#34;m&#34;&gt;184&lt;/span&gt; total in db&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch-channels&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;processed &lt;span class=&#34;m&#34;&gt;37&lt;/span&gt; channels &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;37&lt;/span&gt; added, &lt;span class=&#34;m&#34;&gt;37&lt;/span&gt; total in db&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached show-users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;184&lt;/span&gt; user&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;U1  alice - Alice Smith&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;U2  bob - Bob Lee&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached show-channels --json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;channel_count&amp;#34;&lt;/span&gt;: 37,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;channels&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;C1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;general&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;is_private&amp;#34;&lt;/span&gt;: false,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;fetched_at&amp;#34;&lt;/span&gt;: 1700000260.0,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;C1&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;general&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;is_channel&amp;#34;&lt;/span&gt;: &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The refresh strategy&#xA;    &lt;div id=&#34;the-refresh-strategy&#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-refresh-strategy&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt; always contacts Slack, but it&amp;rsquo;s incremental.&#xA;On a re-fetch, it calls &lt;code&gt;conversations.replies&lt;/code&gt; with &lt;code&gt;oldest=&amp;lt;latest_cached_ts&amp;gt;&lt;/code&gt;, so the API returns only new replies and any edits at the boundary.&#xA;&lt;strong&gt;Messages are upserted by &lt;code&gt;ts&lt;/code&gt;, which means edits replace the old text in place instead of creating duplicates.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rate limits are handled for you.&#xA;HTTP 429 / &lt;code&gt;ratelimited&lt;/code&gt; responses are retried with exponential backoff, up to five attempts, respecting the &lt;code&gt;Retry-After&lt;/code&gt; header.&#xA;That matters for &lt;code&gt;--full-threads&lt;/code&gt; and &lt;code&gt;poll&lt;/code&gt;, where you can easily make hundreds of calls against a busy channel.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the cache lives&#xA;    &lt;div id=&#34;where-the-cache-lives&#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;#where-the-cache-lives&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The database defaults to &lt;code&gt;$XDG_CACHE_HOME/slack-cached/threads.db&lt;/code&gt; (typically &lt;code&gt;~/.cache/slack-cached/threads.db&lt;/code&gt;).&#xA;Override it per command with &lt;code&gt;--db /path/to/file.db&lt;/code&gt;.&#xA;Because it&amp;rsquo;s plain SQLite, you can open it directly and ask it anything Slack&amp;rsquo;s search box can&amp;rsquo;t:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sqlite3 ~/.cache/slack-cached/threads.db &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT (u.real_name || &amp;#39; (&amp;#39; || u.name || &amp;#39;)&amp;#39;) AS who, COUNT(*) AS msgs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;     FROM messages m JOIN users u ON m.user = u.id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;     WHERE m.channel = &amp;#39;C0123ABCDEF&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;     GROUP BY who ORDER BY msgs DESC LIMIT 5;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Alice Smith &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;alice&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;142&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Bob Lee &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;bob&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;87&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Carol Ng &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;carol&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;53&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;That query is the main point of the tool.&#xA;&lt;strong&gt;The cache is not an opaque blob; it&amp;rsquo;s a table of messages you can &lt;code&gt;SELECT&lt;/code&gt; from, join against users and channels, and export however you like.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Authentication&#xA;    &lt;div id=&#34;authentication&#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;#authentication&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Credentials load from environment variables first, then a config file at &lt;code&gt;$XDG_CONFIG_HOME/slack-cached/config&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;SLACK_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;xoxb-...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;SLACK_COOKIE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;SLACK_API_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;https://slack.com/api&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;code&gt;SLACK_COOKIE&lt;/code&gt; is there for &lt;code&gt;xoxc-&lt;/code&gt; web-client tokens, which need the matching cookie to authenticate.&#xA;Every command also accepts &lt;code&gt;--api-base-url&lt;/code&gt;, which is how the built-in fake Slack server plugs in.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A fake Slack server, for free&#xA;    &lt;div id=&#34;a-fake-slack-server-for-free&#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;#a-fake-slack-server-for-free&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The repo includes &lt;code&gt;slack-fake-server&lt;/code&gt;, a deterministic fake Slack API for testing:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ uv run slack-fake-server --port &lt;span class=&#34;m&#34;&gt;8199&lt;/span&gt; --num-threads &lt;span class=&#34;m&#34;&gt;50&lt;/span&gt; --rate-limits&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2026-06-15T12:00:00Z &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;info     &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; fake_slack_server_starting   &lt;span class=&#34;nv&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;127.0.0.1 &lt;span class=&#34;nv&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8199&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;seed&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;users&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;channels&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;threads&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;50&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;rate_limits&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;It serves &lt;code&gt;conversations.list&lt;/code&gt;, &lt;code&gt;conversations.replies&lt;/code&gt;, &lt;code&gt;conversations.history&lt;/code&gt;, and &lt;code&gt;users.list&lt;/code&gt;, and can simulate Slack-tier rate limiting.&#xA;&lt;strong&gt;Point slack-cached at the fake server and you can develop and test against a realistic API without touching your own workspace:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch --api-base-url http://localhost:8199/api --channel C0123ABCDEF --full-threads&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;318&lt;/span&gt; messages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;214&lt;/span&gt; fetched, &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt; threads with replies fetched&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When this is useful&#xA;    &lt;div id=&#34;when-this-is-useful&#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;#when-this-is-useful&#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;strong&gt;Knowledge bases and channel summaries.&lt;/strong&gt; Poll a set of channels, then build monthly digests or feed the SQLite cache to an LLM.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Decision tracking.&lt;/strong&gt; Important calls often happen in threads. Cache them so they survive workspace churn and account turnover.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Offline access and archival.&lt;/strong&gt; Keep a readable copy of the conversations you actually care about, independent of Slack&amp;rsquo;s retention window.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bulk analysis.&lt;/strong&gt; Once the data is in SQLite, you can answer questions with a query that Slack&amp;rsquo;s search box can&amp;rsquo;t express.&lt;/li&gt;&#xA;&lt;/ul&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;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git clone https://github.com/TomzxCode/slack-cached&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; slack-cached&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ uv sync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;SLACK_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;xoxb-...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch-channels&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;processed &lt;span class=&#34;m&#34;&gt;37&lt;/span&gt; channels &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;37&lt;/span&gt; added, &lt;span class=&#34;m&#34;&gt;37&lt;/span&gt; total in db&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached fetch --channel C0123ABCDEF --full-threads&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cached &lt;span class=&#34;m&#34;&gt;318&lt;/span&gt; messages &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; C0123ABCDEF &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;214&lt;/span&gt; fetched, &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt; threads with replies fetched&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ slack-cached show https://acme.slack.com/archives/C0123ABCDEF/p1700000000123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Thread C0123ABCDEF/1700000000.123456&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; message&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2023-11-14T22:13:20+00:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Alice Smith &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;alice&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Has anyone tried the new deploy script?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2023-11-14T22:15:12+00:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Bob Lee &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;bob&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Yes, but you need to bump the token first.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2023-11-14T22:16:45+00:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Alice Smith &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;alice&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Thanks!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/TomzxCode/slack-cached&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Repository and source code&lt;/a&gt;, &lt;a href=&#34;https://tomzxcode.github.io/slackx/docs&#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=tomzxcode.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;documentation&lt;/a&gt;.&lt;/p&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://github.com/TomzxCode/slack-cached&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;TomzxCode/slack-cached README&lt;/a&gt; &amp;ndash; primary source for features, commands, and behavior.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/openclaw/slacrawl&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slacrawl&lt;/a&gt; &amp;ndash; related prior art referenced by the project.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Developer Trust Profiles: Earned Scrutiny for Automated Code Review</title>
      <link>https://tomrochette.com/developer-trust-profiles/</link>
      <pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/developer-trust-profiles/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>agents</category><category>developer-tools</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;When you automate code review, the obvious design is to treat every pull request identically.&#xA;Same checks, same threshold, same outcome, regardless of author.&#xA;&lt;strong&gt;This obvious design is wrong.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A reviewer that applies the same scrutiny to a developer who has shipped two hundred clean PRs and to a stranger on their first contribution is either too strict for the first or too lax for the second.&#xA;It is a blunt instrument, and bluntness prevents autonomy.&#xA;&lt;strong&gt;The more you rely on automated approval to unblock work, the more you need a mechanism that varies scrutiny by evidence.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I built that mechanism as a pair of skills in my agent library, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/developer-trust-profile/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;developer-trust-profile&lt;/a&gt; and &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/initialize-developer-trust-profile/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;initialize-developer-trust-profile&lt;/a&gt;.&#xA;&lt;strong&gt;This is the idea behind them, and why I believe it is the missing primitive for autonomous code review.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The problem with a reviewer that has no memory&#xA;    &lt;div id=&#34;the-problem-with-a-reviewer-that-has-no-memory&#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-problem-with-a-reviewer-that-has-no-memory&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most automated review tools are stateless.&#xA;They look at a diff, run their checks, and emit a verdict.&#xA;Next PR, they start over, as if they had never seen the author before.&lt;/p&gt;&#xA;&lt;p&gt;Stateless review is not how any experienced human reviewer works.&#xA;When a trusted colleague opens a PR, you skim it, confirm the tests pass, and approve.&#xA;When someone with a history of breaking the build opens one, you read every line.&#xA;You already know who tends to forget tests, who mixes unrelated refactors into a single commit, who writes the clearest descriptions.&#xA;&lt;strong&gt;That knowledge is not bias to be eliminated; it is signal, accumulated over hundreds of reviews, that tells you where to spend your attention.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A stateless automated reviewer throws all of that signal away.&#xA;It re-derives, badly and from scratch, what a human reviewer simply remembers.&#xA;The result is a system that either approves indiscriminately (unsafe) or applies maximum suspicion to everyone (slow, and damaging to trust).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The trust profile is the answer to a direct question: how does an automated reviewer remember?&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What a trust profile stores&#xA;    &lt;div id=&#34;what-a-trust-profile-stores&#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-a-trust-profile-stores&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Each developer gets a single file, &lt;code&gt;~/.developer-trust/{github_username}.md&lt;/code&gt;, and the whole directory is a git repository.&#xA;The file accumulates observations across every review.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Four trust levels exist, and each one maps to a different &lt;em&gt;behavior&lt;/em&gt;, not just a different label:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Level&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Meaning&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Effect on the automated reviewer&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;trusted&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Consistently clean, high-quality PRs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Standard checks, lean toward approval on borderline cases&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;neutral&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Unknown or mixed track record&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Standard checks, default behavior&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;cautious&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;History of issues, missed edge cases, unclear PRs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Stricter interpretation, flag marginal cases as failures&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;always_reject&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Persistent quality or policy issues&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Skip entirely, never auto-approve, require manual review&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Beyond the level, the profile keeps a running overview, lists of strengths and weaknesses observed across PRs, recurring PR patterns, and a full review history table with dates, repos, outcomes, and a one-line note per review.&lt;/p&gt;&#xA;&lt;p&gt;Crucially, it is plain markdown in a git repo.&#xA;That makes the system&amp;rsquo;s memory auditable, diffable, and portable.&#xA;You can see the exact review that tipped an author from &lt;code&gt;neutral&lt;/code&gt; to &lt;code&gt;cautious&lt;/code&gt;, and the reasoning behind it.&#xA;&lt;strong&gt;For a mechanism that gates code into production, that written record is not a nice-to-have; it is a requirement.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How earned trust changes review behavior&#xA;    &lt;div id=&#34;how-earned-trust-changes-review-behavior&#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;#how-earned-trust-changes-review-behavior&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The levels are not decorative.&#xA;They modify how the automated reviewer interprets its own checks.&lt;/p&gt;&#xA;&lt;p&gt;The reviewer I run, &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/quick-pr-review/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;quick-pr-review&lt;/a&gt;, evaluates a fixed set of gates: significant public interface changes, security-sensitive code, new dependencies, reversibility, passing CI, alignment with the linked issue&amp;rsquo;s acceptance criteria.&#xA;For a &lt;code&gt;neutral&lt;/code&gt; author, each gate is binary.&#xA;For a &lt;code&gt;trusted&lt;/code&gt; author, a borderline call (is this small new export a &amp;ldquo;significant&amp;rdquo; public interface change?) leans toward passing.&#xA;For a &lt;code&gt;cautious&lt;/code&gt; author, that same borderline call is treated as a failure.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is differential scrutiny, and it is the whole point.&lt;/strong&gt;&#xA;&lt;strong&gt;The checks are identical; the threshold moves with evidence.&lt;/strong&gt;&#xA;A trusted author gets unblocked faster because the reviewer stops re-examining cases it has effectively already resolved.&#xA;A cautious author gets caught earlier, before a recurring weakness reaches production again.&lt;/p&gt;&#xA;&lt;p&gt;And then there is &lt;code&gt;always_reject&lt;/code&gt;, the hard stop.&#xA;When an author sits at that level, the reviewer does not fetch the diff, does not post a comment, does not approve.&#xA;It reports that the PR was skipped and that a human needs to look.&#xA;&lt;strong&gt;This is the system saying: I have enough evidence to know I should not be making this decision.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The loop closes&#xA;    &lt;div id=&#34;the-loop-closes&#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-loop-closes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The profile is not a static config file that a human maintains by hand.&#xA;It is both consumed and produced by the review pipeline.&lt;/p&gt;&#xA;&lt;p&gt;Before a review, &lt;code&gt;quick-pr-review&lt;/code&gt; reads the author&amp;rsquo;s profile to set its thresholds.&#xA;After the review, it writes back: it appends a row to the history, merges new observations into the strengths and weaknesses, and reconsiders the trust level if the accumulated evidence warrants it.&#xA;Each profile update is committed to the local git repo with a message like &lt;code&gt;Update alice trust profile (approved: acme/api#42)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This makes the system learn gradually rather than judge.&lt;/strong&gt;&#xA;A single review does not move the trust level, unless it is egregious.&#xA;Trust degrades through recurring patterns observed across many PRs, and the level only shifts when the weight of evidence demands it.&#xA;That hysteresis is deliberate.&#xA;&lt;strong&gt;It prevents one poor review from permanently labeling a developer, and it prevents one PR that passed by chance from granting unwarranted autonomy.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Bootstrapping without survivorship bias&#xA;    &lt;div id=&#34;bootstrapping-without-survivorship-bias&#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;#bootstrapping-without-survivorship-bias&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The hardest part of any reputation system is the cold start.&#xA;A new contributor, or a contributor new to the system, starts at &lt;code&gt;neutral&lt;/code&gt; with an empty file.&#xA;That is safe but unhelpful; you want a profile based on actual history, not an empty file that takes months to fill.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/initialize-developer-trust-profile/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;initialize&lt;/a&gt; skill bootstraps a profile from history by scanning the author&amp;rsquo;s last N pull requests across every repository the token can see.&#xA;The detail that separates this from a naive implementation is that it samples both merged &lt;em&gt;and&lt;/em&gt; rejected PRs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sampling only merged PRs is survivorship bias in its purest form.&lt;/strong&gt;&#xA;It would make every developer look good, because the failures were quietly closed and forgotten.&#xA;By pulling closed-without-merge PRs as well, and by deriving the outcome from actual review data (was there a changes-requested that was never superseded?) rather than assuming merge equals approval, the bootstrap produces a profile that reflects how a developer actually works, not just their wins.&lt;/p&gt;&#xA;&lt;p&gt;Processed oldest-first, each historical PR feeds into the same update pipeline as a live review, so a freshly initialized profile looks exactly like one that was built up review by review over time.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Limitations&#xA;    &lt;div id=&#34;limitations&#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;#limitations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The design has genuine trade-offs, and they are worth naming.&lt;/p&gt;&#xA;&lt;p&gt;Profiles live on the reviewer&amp;rsquo;s machine and are not shared.&#xA;This is a feature (no global reputation database, no public scoring of humans) and a cost (each reviewer builds a different picture, and the memory does not transfer).&#xA;For a single operator running their own agents, that is the right trade.&#xA;For an organization, you would want a shared, access-controlled store, and the design does not claim otherwise.&lt;/p&gt;&#xA;&lt;p&gt;There is a risk that a reputation becomes fixed and a developer cannot escape it.&#xA;The skills mitigate this by removing observations that recent evidence contradicts and by reconsidering the level on every update.&#xA;&lt;strong&gt;But any system that summarizes a human into a label can trap them in that label.&lt;/strong&gt;&#xA;The fix is transparency (everything is in a diffable file) and a human who can edit the file when the summary is wrong.&lt;/p&gt;&#xA;&lt;p&gt;There is also a gaming risk.&#xA;Once authors know a trust system exists, they can optimize for it.&#xA;On balance this is fine: optimizing for clean, well-tested, well-scoped PRs that reference their issues is exactly the behavior you wanted anyway.&#xA;&lt;strong&gt;The system fails safe, because the worst case is that people produce better PRs.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why this matters more in the age of LLM-authored code&#xA;    &lt;div id=&#34;why-this-matters-more-in-the-age-of-llm-authored-code&#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;#why-this-matters-more-in-the-age-of-llm-authored-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have written elsewhere about why human review of LLM-generated code is a poor use of attention (see &lt;a href=&#34;https://tomrochette.com/the-future-of-code-review/&#34; &gt;The Future of Code Review&lt;/a&gt;).&#xA;The short version is that the human&amp;rsquo;s leverage has moved upstream, to specifying the problem, while machines verify compliance.&lt;/p&gt;&#xA;&lt;p&gt;But that argument is incomplete.&#xA;Even after you accept automated review, you are left with a follow-up question: should the automated reviewer treat every author identically?&#xA;The answer is no, and for a reason that is sharper now than it was five years ago.&lt;/p&gt;&#xA;&lt;p&gt;In an LLM-heavy workflow, the &amp;ldquo;author&amp;rdquo; of a PR is increasingly a human paired with a model, or an agent operating on a human&amp;rsquo;s behalf.&#xA;&lt;strong&gt;The trust profile stops measuring just a developer&amp;rsquo;s coding skill and starts measuring something more valuable: the quality of a human&amp;rsquo;s oversight of their tools.&lt;/strong&gt;&#xA;Two developers can submit PRs that an LLM wrote.&#xA;One vets the output carefully, keeps PRs atomic, links the spec, and ships reversible changes.&#xA;The other rubber-stamps whatever the model produced, mixes concerns, and breaks public interfaces.&#xA;A stateless reviewer cannot tell them apart.&#xA;A reviewer with a trust profile can, and it calibrates its scrutiny accordingly.&lt;/p&gt;&#xA;&lt;p&gt;Seen this way, the trust profile supports the automated reviewer: the checks define what &amp;ldquo;good&amp;rdquo; looks like, and the profile decides how much to trust that a given author is delivering that standard.&lt;/p&gt;&#xA;&lt;p&gt;But that framing also points at the profile&amp;rsquo;s eventual obsolescence, which is the goal.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A bridge, not a destination&#xA;    &lt;div id=&#34;a-bridge-not-a-destination&#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;#a-bridge-not-a-destination&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The trust profile is a mechanism I want to make obsolete.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The ideal end state is not a finely calibrated reputation system that perfectly sorts developers into tiers.&#xA;&lt;strong&gt;The ideal end state is that there is nothing to sort.&lt;/strong&gt;&#xA;Every contributor, senior engineer or new hire, funnels their work through agents that enforce the same standards: atomic PRs, tests that pass, interfaces that do not break, changes that are reversible and tied to a spec.&#xA;The output converges into something homogeneous, and by the time it reaches the code stage it is, for all practical purposes, perfect.&#xA;Authorship stops carrying signal, because every author is producing the same uniform quality through the same disciplined pipeline.&lt;/p&gt;&#xA;&lt;p&gt;In that world the reviewer&amp;rsquo;s checks still run, but they never flag anything, because the problems were engineered out upstream rather than caught downstream.&#xA;And the trust profile, with nothing left to differentiate, collapses: everyone sits at &lt;code&gt;trusted&lt;/code&gt;, the level never moves, and the file stops being worth reading.&lt;/p&gt;&#xA;&lt;p&gt;That is the accurate framing for the trust profile.&#xA;&lt;strong&gt;It is not the destination; it is the bridge.&lt;/strong&gt;&#xA;Today&amp;rsquo;s reality is heterogeneous, a mix of careful and careless, hand-written and agent-generated, vetted and rubber-stamped, and the profile does useful work precisely because that variance exists.&#xA;&lt;strong&gt;As the variance shrinks, so does the profile&amp;rsquo;s job, until the most successful outcome is that no one, me included, needs it anymore.&lt;/strong&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Importance of Context When Interacting with LLMs</title>
      <link>https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/</link>
      <pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-importance-of-context-when-interacting-with-llms/</guid>
      <category>ai</category><category>llm</category><category>context-engineering</category><category>prompt-engineering</category><category>rag</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Most interactions with LLMs fail not because the model lacks capability, but because the user fails to provide enough context for the model to succeed.&#xA;Context is not a prompt engineering trick.&#xA;&lt;strong&gt;It is the entire mechanism by which a frozen set of weights produces behavior relevant to your specific situation.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Context Means for an LLM&#xA;    &lt;div id=&#34;what-context-means-for-an-llm&#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-context-means-for-an-llm&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;A large language model is a fixed function at inference time.&lt;/strong&gt;&#xA;Its weights were determined during training and do not change.&#xA;Everything you want the model to know about your current task, your constraints, your codebase, your domain, and your preferences must be communicated through the context window.&lt;/p&gt;&#xA;&lt;p&gt;This window has three conceptual regions.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The system prompt establishes persistent instructions and persona.&lt;/li&gt;&#xA;&lt;li&gt;The conversation history provides the back-and-forth of the interaction.&lt;/li&gt;&#xA;&lt;li&gt;The retrieved or injected context supplies external knowledge that the model was not trained on.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;When people say &amp;ldquo;prompt engineering,&amp;rdquo; they are usually talking about the system prompt and a handful of few-shot examples.&#xA;When people say &amp;ldquo;RAG,&amp;rdquo; they are talking about dynamically injecting retrieved documents into the third region.&#xA;When people say &amp;ldquo;context engineering,&amp;rdquo; they are talking about the deliberate design of all three regions together.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;In-Context Learning: Why This Works at All&#xA;    &lt;div id=&#34;in-context-learning-why-this-works-at-all&#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;#in-context-learning-why-this-works-at-all&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://arxiv.org/abs/2005.14165&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GPT-3 paper&lt;/a&gt; demonstrated something surprising: a sufficiently large language model can learn new tasks from examples provided in the prompt, without any gradient updates.&#xA;This is in-context learning, and it is the reason context matters so much.&lt;/p&gt;&#xA;&lt;p&gt;A model that has never seen your internal API conventions can follow them perfectly if you show it three examples.&#xA;A model that does not know your company&amp;rsquo;s style guide can adopt it verbatim if you paste it in.&#xA;The model is not truly &amp;ldquo;learning&amp;rdquo; in the statistical sense.&#xA;The model is recognizing patterns in the provided context and extending them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;In-context learning means the quality of the context is the quality of the output.&lt;/strong&gt;&#xA;Vague context produces vague output.&#xA;Contradictory context produces contradictory output.&#xA;Missing context produces plausible-sounding output that is wrong in ways specific to your situation.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Spectrum of Context Strategies&#xA;    &lt;div id=&#34;the-spectrum-of-context-strategies&#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-spectrum-of-context-strategies&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Context can be provided along a spectrum, from minimal to extensive.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Zero-shot prompting&lt;/strong&gt; relies entirely on the model&amp;rsquo;s pre-trained knowledge.&#xA;Zero-shot prompting works for generic tasks (summarize this text, translate this sentence) because the training data likely contained millions of similar examples.&#xA;Zero-shot prompting fails for domain-specific tasks (generate a query against our proprietary schema, review code against our internal standards) because the model has never seen your specific conventions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Few-shot prompting&lt;/strong&gt; injects examples into the context window.&#xA;The &lt;a href=&#34;https://arxiv.org/abs/2005.14165&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;original GPT-3 evaluation&lt;/a&gt; showed that performance scales with the number of examples, but with diminishing returns.&#xA;Three to five high-quality examples often capture 80% of the benefit.&#xA;Example quality matters more than example quantity.&#xA;One example that perfectly demonstrates the desired behavior outperforms ten mediocre ones.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Retrieval-augmented generation (RAG)&lt;/strong&gt; dynamically fetches relevant documents and injects the documents into the context.&#xA;The &lt;a href=&#34;https://arxiv.org/abs/2005.11401&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;original RAG paper&lt;/a&gt; showed that combining a parametric model with non-parametric retrieval produces better grounded answers than either alone.&#xA;RAG addresses the fundamental limitation that a model&amp;rsquo;s training data is a snapshot in time and cannot contain proprietary or recent information.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Long-context ingestion&lt;/strong&gt; bypasses retrieval by stuffing everything into a large context window.&#xA;Models such as Gemini with million-token context windows make the approach technically feasible.&#xA;The question is whether dumping everything into the window actually works.&#xA;&lt;a href=&#34;https://arxiv.org/abs/2307.03172&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Liu et al.&lt;/a&gt; demonstrated that models suffer from a &amp;ldquo;lost in the middle&amp;rdquo; effect: information at the beginning and end of the context is retrieved more reliably than information in the middle.&#xA;Simply increasing the window does not linearly increase the model&amp;rsquo;s ability to use the information.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Context engineering&lt;/strong&gt; is the emerging discipline of orchestrating all of these strategies deliberately.&#xA;Context engineering recognizes that context is not just &amp;ldquo;what you put in the prompt,&amp;rdquo; but a system that includes retrieval logic, example selection, conversation management, and information ordering.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where Context Breaks Down&#xA;    &lt;div id=&#34;where-context-breaks-down&#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;#where-context-breaks-down&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Understanding the failure modes of context is as important as understanding how to provide context.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Attention dilution.&lt;/strong&gt;&#xA;Every token in the context window competes for the model&amp;rsquo;s finite attention.&#xA;Adding irrelevant context does not just waste tokens.&#xA;Adding irrelevant context actively degrades performance on the relevant portions.&#xA;&lt;a href=&#34;https://arxiv.org/abs/2307.03172&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Liu et al.&amp;rsquo;s &amp;ldquo;Lost in the Middle&amp;rdquo;&lt;/a&gt; showed that even when the relevant information is present in the context, retrieval accuracy drops when the context is cluttered with noise.&#xA;The lesson: more context is not always better.&#xA;&lt;strong&gt;The right context, curated and ordered, outperforms a dump of everything that might be relevant.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Instruction following degrades at scale.&lt;/strong&gt;&#xA;System prompts and instructions are more reliably followed when the instructions are prominent in the context.&#xA;As the context window fills with retrieved documents, conversation history, and examples, the model&amp;rsquo;s adherence to its original instructions weakens.&#xA;Weakening adherence is why many production systems re-inject key instructions at the end of long contexts, not just the beginning.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Stale context.&lt;/strong&gt;&#xA;In a long agent session, early conversation turns become increasingly irrelevant.&#xA;The model continues to weigh the early turns in its attention computation.&#xA;The result is drift, where the model brings up constraints or preferences from turn 3 that are no longer applicable at turn 30.&#xA;Effective agent systems summarize or prune earlier context to maintain relevance.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Implicit context gaps.&lt;/strong&gt;&#xA;The most dangerous context failures are the ones you do not notice.&#xA;You assume the model knows that your API returns snake_case JSON, that your timestamps are in UTC, that your user IDs are integers not strings.&#xA;The model does not know any of these things unless you tell it.&#xA;Each implicit assumption is a potential bug in generated code or a hallucinated fact in generated text.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Practical Context Design&#xA;    &lt;div id=&#34;practical-context-design&#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;#practical-context-design&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;For engineers building with LLMs, context design is the highest-impact activity.&lt;/strong&gt;&#xA;Here are concrete patterns that work.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer your context deliberately.&lt;/strong&gt;&#xA;Start with a system prompt that defines the task, constraints, and output format.&#xA;Follow with retrieved documents that are directly relevant to the current query.&#xA;Then provide conversation history, pruned to the most recent and relevant turns.&#xA;End by restating the specific question or instruction.&#xA;This ordering respects the model&amp;rsquo;s attention patterns, which weight the beginning and end of context most heavily.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Curate your examples.&lt;/strong&gt;&#xA;A few-shot example should demonstrate the hardest case, not the easiest.&#xA;If your task involves edge cases (empty inputs, special characters, ambiguous queries), show examples of those edge cases.&#xA;Showing five variations of the happy path teaches the model less than one example of each difficult variant.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Use structured context.&lt;/strong&gt;&#xA;When injecting retrieved information, format the information consistently.&#xA;Markdown headers, delimited sections, and numbered lists give the model explicit boundaries between pieces of information.&#xA;A blob of unstructured text forces the model to spend attention on parsing structure rather than reasoning about content.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Separate context from instruction.&lt;/strong&gt;&#xA;Mixing &amp;ldquo;here is some reference information&amp;rdquo; with &amp;ldquo;now do this task&amp;rdquo; in the same unstructured block reduces reliability.&#xA;Explicitly mark where context ends and instructions begin.&#xA;Many production systems use XML tags or special tokens for this purpose.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Test your context independently.&lt;/strong&gt;&#xA;Before deploying an LLM pipeline, test whether the model can answer simple factual questions based solely on the provided context.&#xA;If the model cannot reliably retrieve a fact that is clearly present in the context, the context is too long, too noisy, or poorly structured.&#xA;The test is a fast diagnostic that catches many context problems before the context problems become production incidents.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context Engineering as a Discipline&#xA;    &lt;div id=&#34;context-engineering-as-a-discipline&#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;#context-engineering-as-a-discipline&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The shift from &amp;ldquo;prompt engineering&amp;rdquo; to &amp;ldquo;context engineering&amp;rdquo; reflects a maturation in how we think about LLM interactions.&#xA;Prompt engineering suggests that the right wording produces better performance.&#xA;&lt;strong&gt;Context engineering recognizes that the entire information environment determines the output.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The distinction matters because it changes where you invest effort.&#xA;If you believe that the right words are what matters, you spend your time iterating on wording.&#xA;If you believe in context engineering, you invest in retrieval systems, example libraries, context ordering, and information architecture.&lt;/p&gt;&#xA;&lt;p&gt;The results from &lt;a href=&#34;https://www.anthropic.com/research/contextual-retrieval&#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=www.anthropic.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Anthropic&amp;rsquo;s work on contextual retrieval&lt;/a&gt; illustrate the payoff well.&#xA;By adding a small amount of context to each retrieved chunk (explaining how the chunk relates to the broader document), Anthropic reduced retrieval failure rates by 67%.&#xA;Not by changing the model.&#xA;Not by changing the prompt.&#xA;By changing how context was prepared and presented.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://arxiv.org/abs/2201.11903&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Chain-of-thought prompting&lt;/a&gt; is another example.&#xA;The model&amp;rsquo;s reasoning improves not because you asked the model to &amp;ldquo;think step by step&amp;rdquo;, but because you expanded the context window with intermediate reasoning steps.&#xA;The model uses its own generated context as additional input for subsequent tokens.&#xA;Context is not just what you provide.&#xA;Context is also what the model generates and then consumes.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Uncomfortable Implication&#xA;    &lt;div id=&#34;the-uncomfortable-implication&#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-uncomfortable-implication&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;If context determines output quality, the ceiling on LLM performance in production is not the model&amp;rsquo;s capability but the quality of the context pipeline feeding the model.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The conclusion is uncomfortable because the hardest engineering problem in LLM applications turns out not to be model selection or fine-tuning.&#xA;The hard problem is information retrieval, information architecture, and information presentation.&#xA;These are old problems from search engineering and information science, now applied to a new interface.&lt;/p&gt;&#xA;&lt;p&gt;The engineers who build the best LLM products will not necessarily be the ones who understand transformer architectures most deeply.&#xA;The best LLM products will be built by the engineers who can design systems that surface the right information, at the right time, in the right format, and place the information where the model will actually attend to it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Context is not a feature you add to an LLM application; it is the application.&lt;/strong&gt;&lt;/p&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://arxiv.org/abs/2005.14165&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Brown et al., &amp;ldquo;Language Models are Few-Shot Learners&amp;rdquo;&lt;/a&gt; &amp;ndash; established in-context learning as a core capability of large language models&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2005.11401&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Lewis et al., &amp;ldquo;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&amp;rdquo;&lt;/a&gt; &amp;ndash; introduced RAG as a method for grounding LLM outputs in retrieved documents&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2307.03172&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Liu et al., &amp;ldquo;Lost in the Middle: How Language Models Use Long Contexts&amp;rdquo;&lt;/a&gt; &amp;ndash; demonstrated positional bias in how models attend to long contexts&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2201.11903&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wei et al., &amp;ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models&amp;rdquo;&lt;/a&gt; &amp;ndash; showed that intermediate reasoning steps in context improve model performance&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.anthropic.com/research/contextual-retrieval&#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=www.anthropic.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Anthropic, &amp;ldquo;Contextual Retrieval&amp;rdquo;&lt;/a&gt; &amp;ndash; demonstrated that context preparation significantly reduces retrieval failure rates&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Merge Gate: Do You Need a Human to Approve Your Pull Requests?</title>
      <link>https://tomrochette.com/the-merge-gate/</link>
      <pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-merge-gate/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>pull-request</category><category>merge-gate</category><category>llm</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;My previous piece was about &lt;a href=&#34;https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/&#34; &gt;code review: a human reading code before it ships&lt;/a&gt;.&#xA;This one is narrower, and more direct.&#xA;It is about the merge gate, the specific act of requiring a human to click &amp;ldquo;approve&amp;rdquo; before code can land in a codebase.&lt;/p&gt;&#xA;&lt;p&gt;People treat review and approval as the same thing.&#xA;They are not.&#xA;You can review code without being able to block it.&#xA;You can approve code without reading it.&#xA;&lt;strong&gt;The valuable act (reading) and the gating act (merging) have been combined by our tooling, and that combination is worth separating.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Most arguments for keeping a human in the merge loop collapse once you ask a single question.&#xA;What does the approval click certify that the automated gates did not?&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What the Approval Click Actually Certifies&#xA;    &lt;div id=&#34;what-the-approval-click-actually-certifies&#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-the-approval-click-actually-certifies&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Watch what happens when a pull request gets approved.&lt;/p&gt;&#xA;&lt;p&gt;The approver sees a green checkmark from CI.&#xA;They see a passing test suite.&#xA;They scan the diff for a few seconds.&#xA;They click approve.&lt;/p&gt;&#xA;&lt;p&gt;Ask them, afterward, what they certified.&#xA;&lt;strong&gt;They will struggle to answer.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;They did not re-run the tests; CI already did that.&#xA;They did not verify the implementation against the spec; they assumed someone else did.&#xA;They did not reason about every edge case; the diff was too long to reason about in three minutes.&#xA;They did not assess whether the change could be undone; that is not what diffs show.&lt;/p&gt;&#xA;&lt;p&gt;The approval click, in most teams, certifies exactly one thing: that a specific human was awake and present at the moment the PR was merged.&#xA;That is a low-information event, and it is doing almost no safety work.&lt;/p&gt;&#xA;&lt;p&gt;The actual safety is being produced by the systems around the gate.&#xA;The test suite.&#xA;The linter.&#xA;The static analyzer.&#xA;The deployment pipeline.&#xA;The rollback path.&#xA;The human approval is layered on top, credited with safety it did not generate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Cost of the Gate&#xA;    &lt;div id=&#34;the-cost-of-the-gate&#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-cost-of-the-gate&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A gate that does little safety work still imposes a cost.&#xA;Several costs, in fact, and they add up.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Latency.&lt;/strong&gt;&#xA;Every pull request waits for a human.&#xA;That human is in a meeting, asleep, on another team, or simply not looking at their inbox.&#xA;Cycle time stretches from minutes to hours to days.&#xA;Work that could ship this morning ships next Tuesday.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Batch amplification.&lt;/strong&gt;&#xA;Batch amplification is the subtlest and most damaging cost.&#xA;When approval is expensive to obtain, people batch.&#xA;They hold three small changes until they have a fourth, because each approval is a fixed-cost interruption.&#xA;The gate incentivizes the exact thing it should discourage: larger, riskier changes.&#xA;A mechanism designed to keep changes safe ends up making them less safe, because the unit of review grows to fill the cost of getting reviewed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Context switching.&lt;/strong&gt;&#xA;Every approval is an interruption for the approver.&#xA;Their work is paused, their context is swapped, their focus is interrupted.&#xA;You are taxing your most experienced engineers to perform a low-information ritual.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Single point of failure.&lt;/strong&gt;&#xA;If only two people can approve a given area and both are out, the pull request stalls.&#xA;Approval authority concentrates, and concentration creates bottlenecks and bus factors.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Soft target.&lt;/strong&gt;&#xA;The approver is the cheapest attack surface in the entire pipeline.&#xA;You can harden CI, pin dependencies, and scan for secrets, but a tired approver who clicks approve on a social-engineered change defeats all of it.&#xA;A human gate is a human vulnerability.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Actually Makes a Merge Safe&#xA;    &lt;div id=&#34;what-actually-makes-a-merge-safe&#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-actually-makes-a-merge-safe&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Remove the ritual and ask what keeps a merge safe.&#xA;&lt;strong&gt;It is a short list, and the human approver is not on it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A comprehensive test suite that runs on every change.&#xA;Static analysis that catches the classes of bugs tests miss.&#xA;A deployment pipeline that canaries before it fully rolls out.&#xA;Feature flags so new behavior can be disabled without a redeploy.&#xA;A rollback path that has actually been tested, not assumed.&#xA;Blast-radius limits that cap how much any single change can touch.&lt;/p&gt;&#xA;&lt;p&gt;Each of these operates on reality, not on a human&amp;rsquo;s prediction of reality.&#xA;A canary either surfaces the problem or it does not.&#xA;An approver might notice the problem, or might be thinking about lunch.&lt;/p&gt;&#xA;&lt;p&gt;The gate is credited with safety the system produces.&#xA;Once you see this, you cannot ignore it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Accountability Objection&#xA;    &lt;div id=&#34;the-accountability-objection&#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-accountability-objection&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first objection is accountability.&#xA;Without a human approval, who is responsible for the code that ships?&lt;/p&gt;&#xA;&lt;p&gt;I made this argument in the previous piece, and I will not repeat all of it here.&#xA;&lt;strong&gt;The short version is that a human glancing at a diff was never truly responsible for what shipped.&lt;/strong&gt;&#xA;Responsibility starts upstream, with who decided the problem was worth solving and who wrote the specification.&lt;/p&gt;&#xA;&lt;p&gt;The approval signature adds nothing to that account.&#xA;It is a name on a line, demanded because it feels like accountability.&#xA;When a change breaks production, the approver is not the one who gets blamed, disciplined, or even consulted.&#xA;The signature exists to allocate blame after the fact, not to prevent harm before it.&lt;/p&gt;&#xA;&lt;p&gt;What remains, once you accept this, is the audit and compliance framing.&#xA;That is the stronger case for keeping a human signature, and it deserves its own answer.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Compliance Objection&#xA;    &lt;div id=&#34;the-compliance-objection&#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-compliance-objection&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&amp;ldquo;But regulation requires human approval.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Sometimes it does.&#xA;&lt;strong&gt;More often, regulation requires traceability, a named owner, a documented decision, an auditable path.&lt;/strong&gt;&#xA;Those are not the same thing as a tired human clicking approve at four in the afternoon on a Friday.&lt;/p&gt;&#xA;&lt;p&gt;When a rule says a change must be &amp;ldquo;reviewed and approved&amp;rdquo;, it is trying to ensure that someone with authority consciously decided the change was acceptable.&#xA;That intent can be satisfied several ways.&#xA;A named owner who signed off on a specification.&#xA;An automated gate whose rules were themselves approved by a human.&#xA;A risk classification that a human defined and a machine enforces consistently.&lt;/p&gt;&#xA;&lt;p&gt;The function is accountability and traceability.&#xA;The form is &amp;ldquo;a human clicks a button&amp;rdquo;.&#xA;Teams satisfy the form and skip the function all the time.&#xA;The sound path is the reverse: satisfy the function rigorously, and let the form follow.&lt;/p&gt;&#xA;&lt;p&gt;If your auditor insists that safety depends on a specific human keystroke, you have an education problem, not an engineering one.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Binary Mistake&#xA;    &lt;div id=&#34;the-binary-mistake&#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-binary-mistake&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The deeper error is treating approval as binary.&#xA;Either every pull request needs a human, or no pull request does.&lt;/p&gt;&#xA;&lt;p&gt;The binary view is wrong, and it is not how anyone actually behaves.&#xA;A README typo and a production schema migration are both pull requests.&#xA;&lt;strong&gt;They do not need the same gate.&lt;/strong&gt;&#xA;&lt;strong&gt;Treating them the same is not caution; it is a failure to think about risk.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The right unit of gating is not &amp;ldquo;is this a pull request&amp;rdquo;.&#xA;It is &amp;ldquo;what is the blast radius of this change, and is it reversible&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;A one-line documentation fix is low blast radius and trivially reversible.&#xA;Let it merge on green.&#xA;No human needs to see it.&lt;/p&gt;&#xA;&lt;p&gt;A change that drops a database column is high blast radius and may be irreversible.&#xA;That deserves a human looking at it, carefully, with time.&lt;/p&gt;&#xA;&lt;p&gt;A change that alters an authentication boundary is medium blast radius but high trust impact.&#xA;That deserves a human, and probably more than one.&lt;/p&gt;&#xA;&lt;p&gt;The properties that should trigger a human gate are properties of the change: irreversibility, blast radius, trust-boundary crossing, external commitment.&#xA;They are not properties of the artifact.&#xA;When you gate on the change instead of the artifact, the fraction of changes that need a human collapses to a small minority.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Small Set Where a Human Gate Genuinely Adds Value&#xA;    &lt;div id=&#34;the-small-set-where-a-human-gate-genuinely-adds-value&#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-small-set-where-a-human-gate-genuinely-adds-value&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Frankly, there is a set of changes where a human in the merge loop actually adds value.&#xA;It is small, but it exists.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Irreversible changes.&lt;/strong&gt;&#xA;Data destruction, schema drops, deletions of public content, sending actual money, publishing to external systems.&#xA;Once these execute, you cannot call them back.&#xA;A human who understands the irreversibility should look at them, because the automated gates can only verify forward correctness, not undo impossibility.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Trust-boundary changes.&lt;/strong&gt;&#xA;Authentication, authorization, permission models, security-sensitive code paths.&#xA;These are exactly where a subtle mistake is both likely and catastrophic.&#xA;A human reviewer adds value here, not because they will catch every bug, but because the cost of a miss is high enough to justify the latency.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Changes to the gating system itself.&lt;/strong&gt;&#xA;You do not want the merge gate to auto-approve changes to the merge gate.&#xA;That is the one place where circular logic causes harm.&#xA;A human reviews the rules that the machine enforces.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;External commitments.&lt;/strong&gt;&#xA;Public API changes, contractually obligated behaviors, compliance-relevant logs.&#xA;These have consequences outside the codebase, and a human should confirm the external surface is intentional.&lt;/p&gt;&#xA;&lt;p&gt;Note what is not on this list.&#xA;Styling.&#xA;Refactors within a single module.&#xA;New tests.&#xA;Documentation.&#xA;Internal-only features.&#xA;Dependency bumps that pass audit.&#xA;These are the overwhelming majority of pull requests.&#xA;They do not need a human gate.&#xA;They need the automated gates, and then they need to merge.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Transition&#xA;    &lt;div id=&#34;the-transition&#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-transition&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You do not get to &amp;ldquo;no human gate for most changes&amp;rdquo; by decree.&#xA;&lt;strong&gt;You get there by making the default path safe.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Start by making the low-blast-radius path auto-merge on green.&#xA;Documentation, tests, internal-only changes within a single module.&#xA;CI passes, the merge happens, nobody clicks anything.&lt;/p&gt;&#xA;&lt;p&gt;Then compute blast radius automatically.&#xA;Which files changed.&#xA;Did the change touch the public API.&#xA;Did it touch the database schema.&#xA;Did it add a dependency.&#xA;Did it change infrastructure or deployment configuration.&#xA;Did it cross a security boundary.&lt;/p&gt;&#xA;&lt;p&gt;Each of these is a machine-checkable property.&#xA;Route the change to the human gate only when it crosses a threshold.&lt;/p&gt;&#xA;&lt;p&gt;When a change does reach the human gate, change what the human is actually doing.&#xA;They are no longer reviewing code line by line.&#xA;They are reviewing risk.&#xA;Is this change as irreversible as the system thinks it is?&#xA;Is the rollback plan genuine?&#xA;Is the blast radius acceptable?&#xA;Does the external commitment match what was approved upstream?&lt;/p&gt;&#xA;&lt;p&gt;Reviewing risk is high-leverage work.&#xA;Reviewing diffs for style is not.&#xA;The transition moves the human from the low-leverage activity to the high-leverage one, and it frees the rest of the pipeline to move at the speed the machines can sustain.&lt;/p&gt;&#xA;&lt;p&gt;This is not a proposal.&#xA;It is a description of the workflow from the previous piece, where a pull request is checked against concrete gates: does it introduce security-sensitive changes, add dependencies, change public interfaces, is it reversible, do the tests pass, does it satisfy the acceptance criteria.&#xA;What this article adds is the principle behind that workflow.&#xA;The human gate is the exception, selected by the properties of the change, not the default triggered by the existence of a pull request.&#xA;The skills that implement it are &lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;publicly available&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Merge Button Is a Ritual&#xA;    &lt;div id=&#34;the-merge-button-is-a-ritual&#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-merge-button-is-a-ritual&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The merge button exists because our tools gave us a button.&#xA;We built a workflow around it, assigned it meaning, and then treated the meaning as structural.&lt;/p&gt;&#xA;&lt;p&gt;It is not.&#xA;&lt;strong&gt;The safety of a codebase is produced by the systems around the merge, not by the merge approval itself.&lt;/strong&gt;&#xA;The click certifies almost nothing those systems did not already certify.&#xA;And it imposes an actual cost: latency, batched risk, interrupted focus, concentrated bus factors, and a soft target for anyone who wants to push a change through unnoticed.&lt;/p&gt;&#xA;&lt;p&gt;The defensible position is not &amp;ldquo;no humans in the loop&amp;rdquo;.&#xA;It is &amp;ldquo;humans in the loop where they add value, out of the loop where they do not&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Most pull requests do not need a human to approve them.&#xA;A small, identifiable minority do.&#xA;The mistake of the current default is that it treats every change as if it belonged to that minority.&lt;/p&gt;&#xA;&lt;p&gt;Free the majority to merge on green.&#xA;Reserve the human gate for the changes where it actually certifies something the machine cannot.&#xA;And stop pretending the button is what keeps you safe.&lt;/p&gt;&#xA;&lt;p&gt;The gate was never the safety.&#xA;The system was.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Rethinking Code Review in the Age of LLMs</title>
      <link>https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/rethinking-code-review-in-the-age-of-llms/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>llm</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.2</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Code review is a bottleneck.&#xA;&lt;strong&gt;I am no longer convinced it is a useful one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is not a conclusion I arrived at lightly.&#xA;Code review has been one of the most reliable quality gates in software engineering for decades.&#xA;But the assumption underlying code review, that a human reading code before it ships catches meaningful problems, is worth re-examining when most of that code was written by an LLM.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Code Review Was Supposed to Do&#xA;    &lt;div id=&#34;what-code-review-was-supposed-to-do&#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-code-review-was-supposed-to-do&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Code review served several purposes simultaneously.&lt;/p&gt;&#xA;&lt;p&gt;It caught bugs before they reached production.&#xA;It enforced consistency across a codebase.&#xA;It spread knowledge between team members.&#xA;It forced the author to organize their thoughts before presenting them to a peer.&lt;/p&gt;&#xA;&lt;p&gt;Each of these purposes assumed something important: that the person who wrote the code and the person reviewing it were both human, that the author had thought carefully about each line, and that the reviewer could rely on the author&amp;rsquo;s intent as context.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When an LLM writes the code, these assumptions break.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The LLM did not think carefully about each line.&#xA;The LLM does not have intent in the way a human does.&#xA;The reviewer cannot ask the author &amp;ldquo;what were you trying to do here?&amp;rdquo; and get a meaningful answer, because the author is a statistical model that generated the most probable next token.&lt;/p&gt;&#xA;&lt;p&gt;The loss of a human author changes the nature of the review fundamentally, and not in the direction most people assume.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Reviewing LLM Code Is Different&#xA;    &lt;div id=&#34;why-reviewing-llm-code-is-different&#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;#why-reviewing-llm-code-is-different&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When a human writes code, code review is a conversation between two people who share a mental model.&#xA;The reviewer can trust that the author made deliberate choices, even imperfect ones.&#xA;Differences between what the reviewer expects and what the code does are informative, because they represent a difference between two human understandings of the same problem.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When an LLM writes code, there is no shared mental model.&lt;/strong&gt;&#xA;The code is the output of a pattern-matching process.&#xA;Sometimes it is correct.&#xA;Sometimes it is subtly wrong in ways that look correct.&#xA;Sometimes it is obviously wrong.&lt;/p&gt;&#xA;&lt;p&gt;The reviewer&amp;rsquo;s job shifts from &amp;ldquo;does this match the author&amp;rsquo;s intent?&amp;rdquo; to &amp;ldquo;does this do what I want?&amp;rdquo;&#xA;This sounds like the same question, but it is not.&#xA;The first question allows the reviewer to leverage the author&amp;rsquo;s reasoning.&#xA;The second question requires the reviewer to independently verify every assumption the code makes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is harder, more tedious, and less effective than reviewing human-written code.&lt;/strong&gt;&#xA;The reviewer cannot use the author&amp;rsquo;s thinking.&#xA;They are reconstructing it from the beginning, line by line.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bottleneck Argument&#xA;    &lt;div id=&#34;the-bottleneck-argument&#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-bottleneck-argument&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the practical problem.&lt;/p&gt;&#xA;&lt;p&gt;LLMs can generate code orders of magnitude faster than humans can review it.&#xA;A developer who used to spend six hours implementing a feature might now spend thirty minutes prompting an LLM and one hour reviewing the output.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The ratio of review time to implementation time has inverted.&lt;/strong&gt;&#xA;Where review used to be a small fraction of the development cycle, it is now the dominant fraction.&lt;/p&gt;&#xA;&lt;p&gt;And the quality of that review is worse, not better, because reviewing code you did not write is cognitively different from reviewing code you understand deeply.&lt;/p&gt;&#xA;&lt;p&gt;This creates a specific kind of bottleneck: one where the throughput-limiting step is also the lowest-quality step.&#xA;You are spending most of your time on the part of the process where you add the least value.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Would Rather Be Doing&#xA;    &lt;div id=&#34;what-i-would-rather-be-doing&#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-i-would-rather-be-doing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If I am going to spend my limited cognitive budget, I want to spend it on the decisions that matter most.&lt;/p&gt;&#xA;&lt;p&gt;Deciding which problems to solve.&#xA;Understanding whether a feature should exist at all.&#xA;Designing the boundary between components.&#xA;Choosing the right abstraction for the domain.&#xA;Thinking about how users will actually interact with what we build.&lt;/p&gt;&#xA;&lt;p&gt;These are high-leverage activities.&#xA;They determine whether the code that gets written is useful, not just correct.&lt;/p&gt;&#xA;&lt;p&gt;Reviewing LLM-generated code for style, naming conventions, and obvious bugs is low-leverage work.&#xA;An automated tool can do it faster and more consistently than I can.&#xA;A linter does not get tired.&#xA;An automated test suite does not lose focus after the third function.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The hours I spend reviewing code that an LLM wrote are hours I am not spending on the problems that only a human can solve.&lt;/strong&gt;&#xA;That trade-off did not used to exist, because writing code and reviewing code were both human activities and the time allocation was roughly balanced.&#xA;Now the balance has shifted, and the opportunity cost of review is much higher.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Automatic Review and Approval Make Sense&#xA;    &lt;div id=&#34;why-automatic-review-and-approval-make-sense&#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;#why-automatic-review-and-approval-make-sense&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have no objection to automated code review.&#xA;I have no objection to automated PR approval.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The instinct to involve a human in every change is driven by fear, not by a rational assessment of what the human actually contributes at that point in the process.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Consider what a good code reviewer does today.&#xA;They check that tests pass.&#xA;They look for obvious bugs.&#xA;They verify naming conventions.&#xA;They ensure the change aligns with the stated goal.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Every one of these checks can be automated.&lt;/strong&gt;&#xA;Tests pass or they do not.&#xA;Static analysis tools catch bugs more reliably than tired humans scanning diffs.&#xA;Linters enforce style more consistently than any reviewer.&#xA;Alignment with the stated goal can be checked by having an LLM compare the PR description with the actual changes.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Wrong Stage to Catch Subtle Issues&#xA;    &lt;div id=&#34;the-wrong-stage-to-catch-subtle-issues&#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-wrong-stage-to-catch-subtle-issues&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The remaining argument for human review is that humans catch subtle issues that automated tools miss: architectural problems, subtle security vulnerabilities, misunderstandings of the domain.&lt;/p&gt;&#xA;&lt;p&gt;These are legitimate concerns, but they are not best addressed at the PR level.&#xA;They are best addressed at the specification level.&#xA;If you write a precise specification, automated verification can confirm the implementation matches it.&#xA;If the specification is vague, no amount of human review will save you from building the wrong thing.&lt;/p&gt;&#xA;&lt;p&gt;Some would argue that catching these issues during review is better than not catching them at all.&#xA;This is hard to disagree with in isolation.&#xA;Of course a subtle bug caught at review is better than the same bug reaching production.&lt;/p&gt;&#xA;&lt;p&gt;But the better-late-than-never framing conceals the actual trade-off.&#xA;The question is not whether review catches some problems.&#xA;It is whether review is the best place to catch them, and whether the time spent reviewing could catch more problems if spent elsewhere.&lt;/p&gt;&#xA;&lt;p&gt;When you catch an architectural flaw at review time, the code is already written.&#xA;Fixing it means rework, rebase, re-test, re-review.&#xA;Catching the same flaw during specification costs a conversation.&#xA;The later you catch it, the more expensive it is, and code review is one of the latest stages in the pipeline.&lt;/p&gt;&#xA;&lt;p&gt;More importantly, relying on review to catch subtle issues is unreliable by design.&#xA;A human reviewer catches what they happen to notice, when they happen to be alert, on the changes they happen to read carefully.&#xA;Some issues get caught.&#xA;Many do not.&#xA;&lt;strong&gt;You are depending on luck and attention, not on a system.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The alternative is to build the catching into the system itself.&#xA;A precise specification catches architectural misunderstandings before code exists.&#xA;A comprehensive test suite catches behavioral bugs on every run, not just when a reviewer is paying attention.&#xA;Static analysis catches security patterns deterministically.&#xA;Each of these catches issues systematically, on every change, forever.&lt;/p&gt;&#xA;&lt;p&gt;Review catches issues once, for the reviewer who happens to be in front of the diff.&#xA;A good test catches the same class of issue every time it runs, for as long as the codebase exists.&#xA;If you find the same kind of subtle issue during review more than once, the answer is not to keep reviewing harder.&#xA;&lt;strong&gt;The answer is to encode that check into your automated gates so it never depends on a human noticing again.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Catching it late is better than not catching it&amp;rdquo; is true.&#xA;&lt;strong&gt;It is also an argument for accepting a process that catches too little, too late, at the highest possible cost.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The review should happen before the code is written, not after.&lt;/strong&gt;&#xA;Spend the human effort on the spec.&#xA;Let the machines verify compliance.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Quality Maximization Myth&#xA;    &lt;div id=&#34;the-quality-maximization-myth&#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-quality-maximization-myth&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Some would argue that this misses the point.&#xA;The goal of code review is not just to check gates, it is to make the code the best it can be.&#xA;A good reviewer suggests a cleaner abstraction, spots a performance issue the author missed, proposes a name that communicates intent better.&#xA;Review is quality maximization, not just verification.&lt;/p&gt;&#xA;&lt;p&gt;This sounds right until you examine what &amp;ldquo;the best it can be&amp;rdquo; actually means.&lt;/p&gt;&#xA;&lt;p&gt;It is subjective.&#xA;It is unbounded.&#xA;There is always a cleaner abstraction, a faster algorithm, a better name.&#xA;The pursuit has no natural stopping point, which is why code reviews so often devolve into bikeshedding over style preferences that do not measurably improve the outcome.&lt;/p&gt;&#xA;&lt;p&gt;When the code was written by a human, a second perspective genuinely improved the implementation.&#xA;Two people could find a better approach than one person.&#xA;&lt;strong&gt;But when the code is generated by an LLM, the reviewer is the only human involved, and their suggestions compete with the option of simply regenerating the code against a better specification.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If the code is not good enough, the answer is not to have a human improve it line by line during review.&#xA;The answer is to improve the specification, the test suite, or the generation prompt, and let the machine produce a better version.&#xA;That scales.&#xA;Human suggestions on a diff do not.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The quality of the code is bounded by the quality of the specification that produced it.&lt;/strong&gt;&#xA;If you want better code, write a better spec.&#xA;Reviewing the output is the most expensive, least scalable way to improve it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Reallocation&#xA;    &lt;div id=&#34;the-reallocation&#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-reallocation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is what I am proposing.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Instead of spending 30% of development time on code review, spend 5% on automated verification and reallocate the saved hours to specification, problem selection, and domain understanding.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The quality of the software will not decrease.&#xA;The tests still run.&#xA;The linters still lint.&#xA;The static analysis still analyzes.&#xA;What changes is where the human attention goes.&lt;/p&gt;&#xA;&lt;p&gt;Right now, human attention is concentrated at the end of the pipeline, reviewing output.&#xA;It should be concentrated at the beginning of the pipeline, defining what the output should be.&lt;/p&gt;&#xA;&lt;p&gt;This is not a radical idea.&#xA;It is the same principle behind test-driven development: define what you want first, then build it.&#xA;&lt;strong&gt;The difference is that now the builder is a machine, and the definition is the only place where human judgment is irreplaceable.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;This Is Not Hypothetical&#xA;    &lt;div id=&#34;this-is-not-hypothetical&#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;#this-is-not-hypothetical&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;None of this is a prediction about the future.&#xA;I run this approach today.&lt;/p&gt;&#xA;&lt;p&gt;My development workflow front-loads human effort into specification, requirements, and problem selection.&#xA;Before any code is written, there is an issue with acceptance criteria, a requirements document, and a technical specification, each reviewed and approved.&#xA;That is where my judgment gets spent.&lt;/p&gt;&#xA;&lt;p&gt;Code generation happens against that specification.&#xA;When a pull request is opened, an automated review pipeline checks it against concrete gates.&#xA;Does it introduce security-sensitive changes?&#xA;Does it add new dependencies?&#xA;Does it change public interfaces?&#xA;Is the change reversible?&#xA;Do the tests pass?&#xA;Does the diff actually satisfy the acceptance criteria from the linked issue?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If all gates pass, the PR is approved automatically.&lt;/strong&gt;&#xA;No human reads the diff.&#xA;No human clicks approve.&lt;/p&gt;&#xA;&lt;p&gt;When the gates flag something, the PR is held for manual review.&#xA;This is not the same as reviewing every change.&#xA;It is reviewing the changes that carry genuine risk, which is a much smaller set.&lt;/p&gt;&#xA;&lt;p&gt;The distinction matters.&#xA;&lt;strong&gt;I am not advocating for shipping unreviewed code.&lt;/strong&gt;&#xA;&lt;strong&gt;I am advocating for shipping code that has been verified by systems more reliable than a tired human scanning a diff, and reserving human attention for the small fraction of changes where it actually adds value.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The infrastructure for this exists.&#xA;The gates are concrete.&#xA;The approach works because the specification does the work that code review used to do poorly.&#xA;The skills that implement this workflow are &lt;a href=&#34;https://github.com/tomzx/agents&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;publicly available&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Who Is Responsible&#xA;    &lt;div id=&#34;who-is-responsible&#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;#who-is-responsible&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The first objection is accountability.&#xA;If no human reads the code before it ships, who owns the problems it creates?&lt;/p&gt;&#xA;&lt;p&gt;The answer is that a human reviewing a pull request for ten minutes was never truly responsible for that code.&#xA;They provided a rubber stamp.&#xA;They glanced at the diff, checked that the tests passed, and clicked approve.&#xA;When that code caused an outage six months later, nobody blamed the reviewer.&#xA;They blamed the author, the test suite, the deployment process, or the requirements.&lt;/p&gt;&#xA;&lt;p&gt;What about the reviewer who spends thirty minutes, or an hour?&#xA;They are doing substantive work, not rubber-stamping.&#xA;The characterization above does not apply to them.&#xA;They genuinely understand the change, question the design, and catch actual issues.&lt;/p&gt;&#xA;&lt;p&gt;But the argument against mandatory review does not depend on reviews being shallow.&#xA;It depends on where that hour of expert attention is best spent.&lt;/p&gt;&#xA;&lt;p&gt;An hour of review catches issues once, for one change, depending on that reviewer being alert that day.&#xA;An hour spent improving the specification prevents the entire class of issue from reaching implementation.&#xA;An hour spent writing a regression test catches the bug on every future run, not just the one time a human happened to read the code.&lt;/p&gt;&#xA;&lt;p&gt;The thorough review is genuine work.&#xA;It is just not the highest-leverage work that person could be doing with that hour.&#xA;And at scale, it is unsustainable: if every PR requires an hour of human review and the LLM produces ten PRs a day, you need ten hours of review to keep up.&#xA;That is not a process that scales.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Code review creates an illusion of accountability without delivering it.&lt;/strong&gt;&#xA;The signature on the PR is a formality.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Responsibility belongs upstream.&lt;/strong&gt;&#xA;The person who decided this problem was worth solving owns the outcome.&#xA;The person who wrote the specification owns whether the implementation matches intent.&#xA;The person who designed the deployment pipeline owns how quickly a bad change can be contained.&lt;/p&gt;&#xA;&lt;p&gt;Removing human review does not remove responsibility.&#xA;It forces you to locate responsibility where it actually belongs: in the decisions that guided the work, not in the person who scanned it at the end.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What About Outages&#xA;    &lt;div id=&#34;what-about-outages&#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-about-outages&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The second objection is safety.&#xA;What if the LLM makes a decision that takes down production?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is a genuine risk, but code review is the wrong tool to mitigate it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Most production outages are not caused by bugs that a reviewer would catch.&#xA;They are caused by configuration changes, unexpected data formats, load patterns, dependency failures, and integration issues that only surface under actual traffic.&#xA;A human reading a diff is making a guess about what might happen.&#xA;Production behavior is the ground truth.&lt;/p&gt;&#xA;&lt;p&gt;If you want to prevent outages, invest in the systems that observe and contain actual behavior.&lt;/p&gt;&#xA;&lt;p&gt;Feature flags so a change can be turned off without a redeploy.&#xA;Canary deployments so a bad change reaches 1% of traffic before it reaches 100%.&#xA;Monitoring and alerting so a regression is detected in minutes, not hours.&#xA;Fast, tested rollback paths so recovery does not depend on someone remembering how the old version worked.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;These tools are more reliable than code review because they operate on reality rather than prediction.&lt;/strong&gt;&#xA;A reviewer might miss a subtle interaction.&#xA;A canary deployment will surface it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What About Reversibility&#xA;    &lt;div id=&#34;what-about-reversibility&#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-about-reversibility&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A related concern is that an LLM might produce changes that are hard to undo.&#xA;A sprawling refactor, a database migration that is not backward compatible, a change that entangles two previously independent systems.&lt;/p&gt;&#xA;&lt;p&gt;This is a serious problem, but again, human review is not the safeguard people think it is.&lt;/p&gt;&#xA;&lt;p&gt;Reviewers focus on forward correctness.&#xA;They ask &amp;ldquo;does this do what it should?&amp;rdquo;&#xA;They rarely ask &amp;ldquo;can we undo this cleanly?&amp;rdquo;&#xA;Even when they do, reversibility is hard to assess by reading a diff.&#xA;It depends on what happens in production after the change is deployed, on data migrations that have already run, on other changes that depend on it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The solution is to make reversibility a structural property of how changes are made, not a property enforced by review.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Keep changes small and independent.&#xA;Require database migrations to be backward compatible, deployed before the code that depends on them.&#xA;Use feature flags so new behavior can be disabled without reverting code.&#xA;Treat large, entangling refactors as high-risk changes that warrant extra process, not as the default mode of operation.&lt;/p&gt;&#xA;&lt;p&gt;These are constraints you encode in your pipeline and your specification process.&#xA;They do not require a human to read every line of every PR.&#xA;They require discipline at the level where decisions are made.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What About Code Quality and Maintainability&#xA;    &lt;div id=&#34;what-about-code-quality-and-maintainability&#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-about-code-quality-and-maintainability&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A third concern is that without human review, LLM-generated code will degrade into slop.&#xA;Inconsistent naming, duplicated logic, unnecessary abstractions, dead code, patterns that do not match the rest of the codebase.&#xA;Each individual change passes its tests, but the codebase slowly degrades.&lt;/p&gt;&#xA;&lt;p&gt;This is a genuine risk, and it deserves a serious answer.&#xA;The answer is not that review prevents it.&#xA;The answer is that review catches it inconsistently, after the fact, one PR at a time.&lt;/p&gt;&#xA;&lt;p&gt;Most of what we call code quality is measurable.&#xA;Cyclomatic complexity is a number.&#xA;Duplication is detectable.&#xA;Dead code is identifiable by static analysis.&#xA;Naming conventions are enforceable by linters.&#xA;File length, function length, import depth, test coverage gaps, all of these are machine-checkable properties.&lt;/p&gt;&#xA;&lt;p&gt;If you care about maintainability, encode the constraints that produce it.&#xA;Set complexity limits that fail the build.&#xA;Run duplication detectors on every PR.&#xA;Require test coverage above a threshold.&#xA;Lint aggressively.&#xA;Block PRs that introduce unused exports or dead code.&lt;/p&gt;&#xA;&lt;p&gt;These checks run on every change, consistently, without getting tired or distracted.&#xA;A human reviewer might flag a function that is too complex.&#xA;A complexity gate will flag every function that exceeds the threshold, every time, for as long as the rule exists.&lt;/p&gt;&#xA;&lt;p&gt;Slop also has an upstream cause.&#xA;When the specification is vague about architecture, naming, and patterns, the LLM fills in the missing details with whatever it has seen most often in its training data.&#xA;That output is generic by default.&#xA;It will not match your codebase&amp;rsquo;s conventions unless the specification tells it what those conventions are.&lt;/p&gt;&#xA;&lt;p&gt;This means slop is prevented at the specification level, not at the review level.&#xA;A specification that includes the patterns to follow, the existing abstractions to reuse, and the naming conventions to respect produces cleaner code than a vague spec plus a human reviewer cleaning up the output.&lt;/p&gt;&#xA;&lt;p&gt;For whatever the automated gates miss, frequent maintenance sweeps catch accumulated decay.&#xA;Run a dead code analysis weekly.&#xA;Run a duplication detector weekly.&#xA;Review complexity trends after every merge.&#xA;This is a more systematic approach than hoping each PR&amp;rsquo;s reviewer notices the slow accumulation of mess.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Code quality is a property of your constraints, not of your reviewers.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Am Not Saying&#xA;    &lt;div id=&#34;what-i-am-not-saying&#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-i-am-not-saying&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I am not saying all code review should be eliminated tomorrow.&#xA;Legacy codebases, critical security infrastructure, and domains where correctness is life-or-death may still benefit from human review.&lt;/p&gt;&#xA;&lt;p&gt;I am not saying code review was never useful.&#xA;It was, for decades, one of the best tools we had.&#xA;&lt;strong&gt;I am saying the tool&amp;rsquo;s value has changed because the context has changed.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I am not saying I trust LLMs to always produce correct code.&#xA;&lt;strong&gt;I am saying that human code review is not the best way to ensure correctness when the code was machine-generated.&lt;/strong&gt;&#xA;Automated verification, comprehensive test suites, and precise specifications are better tools for that job.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Question Worth Asking&#xA;    &lt;div id=&#34;the-question-worth-asking&#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-question-worth-asking&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The next time you open a pull request full of LLM-generated code and start reviewing it line by line, ask yourself: what am I actually checking?&lt;/p&gt;&#xA;&lt;p&gt;If you are checking style, a linter does it better.&#xA;If you are checking correctness, tests do it better.&#xA;If you are checking whether the code solves the right problem, you should have answered that question before the code was written.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Code review made sense when humans wrote all the code.&lt;/strong&gt;&#xA;It makes less sense when humans define the problem and machines implement the solution.&#xA;&lt;strong&gt;The bottleneck has moved.&lt;/strong&gt;&#xA;&lt;strong&gt;Our processes should move with it.&lt;/strong&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Scaling the LLM Agent Company</title>
      <link>https://tomrochette.com/scaling-the-llm-agent-company/</link>
      <pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/scaling-the-llm-agent-company/</guid>
      <category>llm</category><category>ai-agents</category><category>company-growth</category><category>scaling</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;In &lt;a href=&#34;https://tomrochette.com/exponential-growth-software-company/&#34; &gt;Exponential growth software company&lt;/a&gt; I explored the constraints that make scaling a human company hard: onboarding bottlenecks, culture dilution, coordination overhead, institutional knowledge decay.&#xA;Each of these constraints grows with the number of people you employ.&#xA;A company where the workforce is entirely composed of LLM agents inverts most of these problems.&#xA;The old constraints disappear, but new ones replace them.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Disappears&#xA;    &lt;div id=&#34;what-disappears&#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-disappears&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Onboarding becomes instantiation.&lt;/strong&gt;&#xA;An LLM agent starts productive the moment it is created.&#xA;There is no training period, no ramp-up, no senior employee pausing their work to bring a new hire up to speed.&#xA;Spawning 100 agents costs roughly the same operational effort as spawning 1.&#xA;The ratio of onboarded to onboarders that mattered for human companies becomes irrelevant.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Culture is exactly what you specify.&lt;/strong&gt;&#xA;Agents follow their instructions.&#xA;If you want 1,000 agents to behave identically, you give them the same system prompt.&#xA;There is no culture clash, no informal norms developing in opposition to the official ones, no gradual drift as new hires bring outside habits.&#xA;The culture is the prompt.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Coordination scales differently.&lt;/strong&gt;&#xA;Agents do not have cognitive limits on the number of peers they interact with.&#xA;A single orchestration agent can coordinate with hundreds of worker agents without getting overwhelmed.&#xA;Communication between agents is structured, lossless, and near-instantaneous.&#xA;The team structures, single points of contact, and redundancy tradeoffs that human organizations require are replaced by protocol design.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Institutional knowledge does not decay.&lt;/strong&gt;&#xA;Everything an agent knows is explicit in its instructions, tools, and retrieved context.&#xA;There is no tacit knowledge that exists only in someone&amp;rsquo;s memory, no risk of losing the person who understands the legacy system.&#xA;When you replace an agent, the replacement has access to exactly the same information.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Replaces It&#xA;    &lt;div id=&#34;what-replaces-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;#what-replaces-it&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The fundamental principle from the original article still holds: anything that scales linearly or superlinearly with itself needs to be optimized to grow sublinearly.&#xA;&lt;strong&gt;The bottleneck has moved, but it has not disappeared.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Unit economics&#xA;    &lt;div id=&#34;unit-economics&#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;#unit-economics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Each agent invocation costs compute and API calls.&#xA;At scale, the marginal cost of an additional agent is small but not zero.&#xA;If your revenue per task is lower than the cost of the compute required to complete it, you have the same fundamental problem as an unprofitable human company.&#xA;A human company that loses money on every employee-hour goes bankrupt.&#xA;&lt;strong&gt;An agent company that loses money on every inference call goes bankrupt just as fast, it just happens in milliseconds instead of months.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Correlated failures&#xA;    &lt;div id=&#34;correlated-failures&#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;#correlated-failures&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;With humans, errors are diverse and partially cancel out through independent judgment.&#xA;Two engineers given the same task will produce different bugs.&#xA;With agents sharing the same prompt, errors are correlated and systemic.&#xA;A single flawed instruction propagated across 1,000 agents produces 1,000 instances of the same mistake at scale.&#xA;Consistently wrong is worse than inconsistently right.&#xA;Correlated errors make quality control the central bottleneck.&#xA;You need evaluation pipelines, guardrails, and feedback loops that themselves must scale.&#xA;The testing infrastructure becomes the company&amp;rsquo;s most critical asset, more important than the agents it tests.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Orchestration complexity&#xA;    &lt;div id=&#34;orchestration-complexity&#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;#orchestration-complexity&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;While individual agents do not get overwhelmed, the system as a whole can still produce emergent failures.&#xA;Agents acting on stale information, conflicting instructions, or subtle misinterpretations of their goals can cascade into problems that are hard to diagnose because the system operates at a speed and scale humans cannot directly oversee.&#xA;The orchestration layer is the new management layer.&#xA;Its complexity grows with the number of agents and the richness of their interactions.&#xA;Unlike human management, where adding managers adds judgment and adaptability, adding orchestration logic adds rigidity.&#xA;Every new rule is a new potential point of failure.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Infrastructure brittleness&#xA;    &lt;div id=&#34;infrastructure-brittleness&#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;#infrastructure-brittleness&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A human can work around a broken tool with creativity.&#xA;An agent generally cannot.&#xA;If an API goes down, every agent depending on it stalls.&#xA;If a database schema changes unexpectedly, every agent writing to it produces corrupted data.&#xA;The brittleness of automated systems means that reliability engineering and observability become more important, not less, as you scale.&#xA;The company that cannot detect a degrading agent within seconds will compound the damage across its entire workforce simultaneously.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Model dependency&#xA;    &lt;div id=&#34;model-dependency&#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;#model-dependency&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Your company&amp;rsquo;s capacity is bounded by what the underlying models can do.&#xA;If the model provider changes behavior, degrades performance, or raises prices, your entire workforce is affected at the same time.&#xA;This is a vendor dependency unlike any single human employee leaving.&#xA;It is more like all your employees depending on the same external model that a third party operates.&#xA;Diversifying across models is a partial hedge, but it introduces the same coordination complexity as a multilingual workforce.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where the Moat Lives&#xA;    &lt;div id=&#34;where-the-moat-lives&#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;#where-the-moat-lives&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When anyone can spawn an equally capable agent workforce, the advantage is no longer in having employees.&#xA;&lt;strong&gt;The moat shifts to the quality of your instructions (prompts as institutional knowledge), the design of your orchestration (workflows as management), your data flywheels (evaluation data as competitive advantage), and domain-specific tools and integrations (proprietary capabilities the agents use).&lt;/strong&gt;&#xA;The company is no longer its people.&#xA;&lt;strong&gt;It is its prompts, its pipelines, and its proprietary context.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Pattern&#xA;    &lt;div id=&#34;the-pattern&#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-pattern&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The original article concluded that human scaling requires optimizing every linear cost down to sublinear.&#xA;The same conclusion applies here, but the costs are different.&#xA;Human companies optimize hiring, onboarding, and culture.&#xA;Agent companies optimize inference cost, error correlation, orchestration complexity, and infrastructure reliability.&#xA;&lt;strong&gt;The companies that scale exponentially in this era will be the ones that treat their agent workforce as a system to be engineered, not a team to be managed.&lt;/strong&gt;&lt;/p&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://tomrochette.com/exponential-growth-software-company/&#34; &gt;Exponential growth software company&lt;/a&gt; &amp;ndash; original article on human company scaling constraints&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/the-shifting-bottleneck/&#34; &gt;The Shifting Bottleneck&lt;/a&gt; &amp;ndash; how AI moves bottlenecks up the decision chain&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/&#34; &gt;Software Engineering Teams in the Age of AI&lt;/a&gt; &amp;ndash; team design implications of AI-assisted development&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>ghx - A CLI for agentic code reviews on GitHub</title>
      <link>https://tomrochette.com/ghx/</link>
      <pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/ghx/</guid>
      <category>go</category><category>github</category><category>cli</category><category>developer-tools</category><category>ai</category><category>agents</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;I&amp;rsquo;ve been building AI agents that review pull requests, and the official &lt;code&gt;gh&lt;/code&gt; CLI doesn&amp;rsquo;t have what they need.&#xA;Agents can&amp;rsquo;t leave inline comments on specific lines, can&amp;rsquo;t manage pending reviews, and can&amp;rsquo;t edit or delete comments.&#xA;These are basic operations for any code review workflow, and they&amp;rsquo;re only accessible through the GitHub web UI or the raw GraphQL API.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;So I built &lt;a href=&#34;https://github.com/tomzxcode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt;, a CLI designed to make agentic code reviews practical.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What ghx does that gh doesn&amp;rsquo;t&#xA;    &lt;div id=&#34;what-ghx-does-that-gh-doesnt&#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-ghx-does-that-gh-doesnt&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Inline comments on files and lines.&lt;/strong&gt;&#xA;The most fundamental operation for a code review agent: comment on a specific line of a diff.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --file src/main.go --line &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;Nit: use fmt.Errorf&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created inline comment on src/main.go:10 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;thread PRRT_kwDOC0I7As5vKgVn&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --file src/main.go --line 10-15 --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;Consider extracting this&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created inline comment on src/main.go:10-15 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;thread PRRT_kwDOC0I7As5vKgVq&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;File-level comments (without &lt;code&gt;--line&lt;/code&gt;), top-level PR comments, and replies to existing threads are all supported.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pending reviews.&lt;/strong&gt;&#xA;Accumulate review comments without submitting them immediately, then approve or comment when ready:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --file src/main.go --line &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;Nit&amp;#34;&lt;/span&gt; --pending&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Added pending inline comment on src/main.go:10 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;thread PRRT_kwDOC0I7As5vKgVz, review PRR_kwDOC0I7As4B9Y2z&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr review submit &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --event APPROVE --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;LGTM&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Submitted review PRR_kwDOC0I7As4B9Y2z as APPROVE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;Edit and delete comments.&lt;/strong&gt;&#xA;Fix a typo or remove a comment.&#xA;Use &lt;code&gt;ghx pr threads 42 --ids&lt;/code&gt; to list IDs:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr threads &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --ids&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PRRT_kwDOC0I7As5vKgVn  src/main.go:10  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;open&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  PRC_kwDOC0I7As5TKxYc  reviewer  Nit: use fmt.Errorf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  PRC_kwDOC0I7As5TKxYd  author  Good catch, will fix.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Then edit or delete the comment:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment edit PRC_kwDOC0I7As5TKxYc --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;Use fmt.Errorf instead of errors.New&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Updated comment PRC_kwDOC0I7As5TKxYc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment delete PRC_kwDOC0I7As5TKxYc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Deleted comment PRC_kwDOC0I7As5TKxYc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;Review thread management.&lt;/strong&gt;&#xA;List, filter, and inspect review threads:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr threads &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;src/main.go:10  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;open&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  reviewer  Nit: use fmt.Errorf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  author    Good catch, will fix.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;src/main.go:45-52  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;resolved&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  reviewer  Consider extracting this into a helper&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  author    Done in 3a1b2c4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Filter by state with &lt;code&gt;--state open&lt;/code&gt;, &lt;code&gt;--state resolved&lt;/code&gt;, or &lt;code&gt;--state all&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Issue comments and viewing.&lt;/strong&gt;&#xA;Add, edit, and delete issue comments, and view issues with their full comment history:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx issue view &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Fix race condition in worker pool  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;open&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;  author&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The worker pool has a race condition when multiple goroutines access&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;the shared counter without proper synchronization.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; comment&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  contributor  I can reproduce this with &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;go &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -race ./...&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  author       Fixed in &lt;span class=&#34;c1&#34;&gt;#50&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx issue comment &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;This is fixed in #50&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created comment IC_kwDOC0I7As5TKxZa on issue &lt;span class=&#34;c1&#34;&gt;#42&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The stash system&#xA;    &lt;div id=&#34;the-stash-system&#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-stash-system&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;ghx has a local stash system for review comments, modeled after &lt;code&gt;git stash&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The main use case is enabling agents to batch many comments at once before submitting them all as a single review.&#xA;Instead of making individual API calls per comment, an agent can stash comments locally and pop them into a pending review in one operation:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --file src/main.go --line &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;Nit&amp;#34;&lt;/span&gt; --stash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Stashed comment on src/main.go:10 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;stash@&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; now has &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; threads&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr comment &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --file src/main.go --line 20-25 --body &lt;span class=&#34;s2&#34;&gt;&amp;#34;Extract this&amp;#34;&lt;/span&gt; --stash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Stashed comment on src/main.go:20-25 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;stash@&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; now has &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; threads&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr review stash list &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;stash@&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;:  &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; threads, &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; comments&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  src/main.go   &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;      &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; comment&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  src/main.go   20-25   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; comment&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ghx pr review stash pop &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Popped stash@&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;0&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; threads, &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; comments&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; into review PRR_kwDOC0I7As4B9Y2z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The stash also solves a GitHub API constraint: you can&amp;rsquo;t mix immediate comments with pending review comments on the same PR.&#xA;When you submit an immediate comment on a PR that has a pending review, ghx automatically stashes the pending review, submits the comment, and restores the pending review.&#xA;&lt;strong&gt;The stash lets agents use a push-pop workflow (stash, comment, comment, pop) instead of repeating push-comment-pop for every immediate comment.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The stash supports multiple entries, just like &lt;code&gt;git stash&lt;/code&gt;: push, pop, drop, and list.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Getting started&#xA;    &lt;div id=&#34;getting-started&#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;#getting-started&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;ghx is a single Go binary.&#xA;Download the latest release from &lt;a href=&#34;https://github.com/tomzxcode/ghx/releases&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub&lt;/a&gt;, or install with Go:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go install github.com/tomzxcode/ghx@main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;ghx picks up your existing &lt;code&gt;GH_TOKEN&lt;/code&gt;, &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, or &lt;code&gt;gh auth login&lt;/code&gt; credentials.&#xA;No extra configuration needed.&#xA;All commands accept &lt;code&gt;--repo OWNER/REPO&lt;/code&gt; or auto-detect from the current git remote.&lt;/p&gt;&#xA;&lt;p&gt;ghx is &lt;a href=&#34;https://github.com/tomzxcode/ghx/blob/main/LICENSE&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;MIT-licensed&lt;/a&gt; and written in Go with no runtime dependencies beyond the GitHub API.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Backlog Is Not a Dumping Ground: Managing the Backlog of a Large Software Product</title>
      <link>https://tomrochette.com/backlog-management-best-practices/</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/backlog-management-best-practices/</guid>
      <category>product-management</category><category>backlog</category><category>agile</category><category>prioritization</category><category>software-engineering</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;A well-managed backlog is the single most useful artifact in product development.&#xA;When it works, teams ship the right things at a sustainable pace.&#xA;When it doesn&amp;rsquo;t, the organization accumulates stale tickets, conflicting priorities, and endless planning meetings.&#xA;&lt;strong&gt;For large software products, where dozens of teams feed from the same corpus of work, the cost of poor backlog hygiene is enormous and mostly invisible.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Backlog at Scale Behaves Differently&#xA;    &lt;div id=&#34;the-backlog-at-scale-behaves-differently&#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-backlog-at-scale-behaves-differently&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;On a small team, the backlog is a conversation.&#xA;The product owner and a handful of engineers look at a list, discuss what matters most, and pick up work.&#xA;&lt;strong&gt;At scale, the backlog becomes an information system.&lt;/strong&gt;&#xA;It mediates between strategy and execution, between stakeholders who want things and teams who build things, and between the present state of the product and its future state.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://scrumguides.org/scrum-guide.html&#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=scrumguides.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The Scrum Guide&lt;/a&gt; defines the product backlog as &amp;ldquo;an emergent, ordered list of what is needed to improve the product&amp;rdquo; and notes that it is the single source of work for the team.&#xA;That definition is clean and useful, but in practice, large organizations layer in program backlogs, initiative backlogs, discovery backlogs, and technical debt backlogs.&#xA;The first challenge is deciding what structure you need and resisting the urge to create a new list every time someone feels their priorities aren&amp;rsquo;t getting enough visibility.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.svpg.com/books/&#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=www.svpg.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Marty Cagan, &amp;ldquo;Inspired&amp;rdquo;&lt;/a&gt; argues that the strongest product teams maintain a clear distinction between &lt;em&gt;product discovery&lt;/em&gt; (figuring out what to build) and &lt;em&gt;product delivery&lt;/em&gt; (building it), and that conflating the two is a root cause of bloated backlogs.&#xA;Items enter the backlog before anyone has validated that they are worth building.&#xA;&lt;strong&gt;The backlog becomes a list of desires rather than a commitment queue.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Four Principles That Change Everything&#xA;    &lt;div id=&#34;four-principles-that-change-everything&#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;#four-principles-that-change-everything&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most backlog problems come from violating one of four principles.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. The Backlog Is Ordered, Not Merely Prioritized&#xA;    &lt;div id=&#34;1-the-backlog-is-ordered-not-merely-prioritized&#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;#1-the-backlog-is-ordered-not-merely-prioritized&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&amp;ldquo;Prioritized&amp;rdquo; suggests labels like &amp;ldquo;high,&amp;rdquo; &amp;ldquo;medium,&amp;rdquo; and &amp;ldquo;low.&amp;rdquo;&#xA;Those labels are nearly useless because everything ends up &amp;ldquo;high.&amp;rdquo;&#xA;&lt;em&gt;Ordered&lt;/em&gt; means the backlog is a ranked list: item 1 is more important than item 2, which is more important than item 3.&#xA;A strict ordering is harder to produce, and that difficulty is deliberate.&#xA;Forcing a strict ordering surfaces the trade-offs that stakeholders would otherwise avoid.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://woodyzuill.com/&#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=woodyzuill.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Woody Zuill&lt;/a&gt;&amp;rsquo;s approach of &amp;ldquo;pulling&amp;rdquo; work rather than &amp;ldquo;pushing&amp;rdquo; it is relevant here.&#xA;When the backlog is strictly ordered, teams pull from the top.&#xA;No selecting favored items, no lobbying for a personal favorite feature.&#xA;The rank order is the contract.&lt;/p&gt;&#xA;&lt;p&gt;At scale, this principle applies at every level.&#xA;Initiatives within a program are ordered.&#xA;Epics within an initiative are ordered.&#xA;Stories within a sprint are ordered.&#xA;If you cannot say which of two items matters more, you are not ready to put both in the backlog.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;2. Only Refined Items Belong in the Delivery Backlog&#xA;    &lt;div id=&#34;2-only-refined-items-belong-in-the-delivery-backlog&#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;#2-only-refined-items-belong-in-the-delivery-backlog&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://jpattonassociates.com/user-story-mapping/&#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=jpattonassociates.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Jeff Patton&amp;rsquo;s user story mapping technique&lt;/a&gt; provides a framework for separating discovery from delivery.&#xA;The &amp;ldquo;backbone&amp;rdquo; of user activities and the stories beneath them form a map of the product&amp;rsquo;s possible future.&#xA;Only stories that have been discussed, estimated, and accepted by the team belong in the sprint-level delivery backlog.&#xA;Everything else lives in a discovery or discovery-adjacent artifact.&lt;/p&gt;&#xA;&lt;p&gt;Separating discovery from delivery is a critical structural choice.&#xA;Many organizations dump every idea, bug report, customer request, and technical improvement into the same GitHub project.&#xA;Within months, that project contains thousands of items in no particular order.&#xA;The team treats it as a write-only data structure.&lt;/p&gt;&#xA;&lt;p&gt;A practical pattern: maintain two lists.&#xA;The &lt;em&gt;product backlog&lt;/em&gt; contains everything the team might ever work on, loosely grouped by theme.&#xA;The &lt;em&gt;sprint backlog&lt;/em&gt; (or &amp;ldquo;ready&amp;rdquo; queue) contains only items that meet a definition of ready: they have acceptance criteria, they are small enough to complete in a single sprint, and the team has discussed them.&#xA;Nothing moves from the product backlog to the sprint backlog without passing through a refinement session.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://scrumguides.org/scrum-guide.html&#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=scrumguides.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The Scrum Guide&lt;/a&gt; calls this ongoing activity &amp;ldquo;backlog refinement,&amp;rdquo; and regular sessions where the team reviews the top portion of the backlog, splits large items, and ensures alignment with the product goal are essential.&#xA;The key discipline is not the meeting itself but the agreement that unrefined items will not be scheduled.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;3. Prioritization Frameworks Are a Means, Not an End&#xA;    &lt;div id=&#34;3-prioritization-frameworks-are-a-means-not-an-end&#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;#3-prioritization-frameworks-are-a-means-not-an-end&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Several frameworks exist to help teams rank backlog items:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Framework&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Mechanism&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Best suited for&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.intercom.com/blog/rice/&#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=www.intercom.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;strong&gt;RICE&lt;/strong&gt;&lt;/a&gt; (Reach, Impact, Confidence, Effort)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Numerical score combining reach, impact, confidence, and effort&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Product teams comparing features across different domains&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.scaledagileframework.com/wsjf/&#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=www.scaledagileframework.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;strong&gt;WSJF&lt;/strong&gt;&lt;/a&gt; (Weighted Shortest Job First)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cost of delay divided by job size&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Organizations using SAFe or managing program-level backlogs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://strategyn.com/outcome-driven-innovation/&#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=strategyn.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;strong&gt;Opportunity Scoring&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Measures importance and satisfaction for each outcome&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Discovery-phase prioritization when outcomes are unclear&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.productplan.com/glossary/ice-scoring-model/&#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=www.productplan.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;strong&gt;ICE&lt;/strong&gt;&lt;/a&gt; (Impact, Confidence, Ease)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Lightweight scoring for rapid triage&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Fast-moving teams that need quick decisions&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;These frameworks are useful because they make the prioritization criteria explicit.&#xA;They are dangerous when teams treat the resulting score as the final answer.&#xA;A RICE score is only as good as the estimates that feed it, and those estimates are often wrong.&lt;/p&gt;&#xA;&lt;p&gt;The right approach is to pick one framework that matches your organization&amp;rsquo;s needs, use it consistently, and revisit the scoring regularly.&#xA;The conversation that happens when two stakeholders disagree about a score is where the value lives.&#xA;&lt;strong&gt;The number itself is a forcing function, not a decision.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;4. Say No Early and Often&#xA;    &lt;div id=&#34;4-say-no-early-and-often&#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;#4-say-no-early-and-often&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The most important word in backlog management is &amp;ldquo;no.&amp;rdquo;&#xA;Every item in the backlog carries a cognitive tax.&#xA;Engineers scroll past it in planning.&#xA;Product managers feel obligated to explain why it hasn&amp;rsquo;t been done.&#xA;Stakeholders check on it periodically.&#xA;The larger the backlog, the more time the team spends managing the backlog instead of working from it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://sive.rs/hellyeah&#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=sive.rs&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Derek Sivers&amp;rsquo; &amp;ldquo;hell yeah or no&amp;rdquo;&lt;/a&gt; heuristic applies here.&#xA;If an item does not clearly advance the product&amp;rsquo;s current goals, decline it, archive it, or move it to a separate &amp;ldquo;someday&amp;rdquo; list that nobody is expected to maintain.&#xA;&lt;strong&gt;A product backlog with 30 well-ordered items is more useful than one with 300 loosely grouped items.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;At scale, this principle requires organizational courage.&#xA;Every stakeholder believes their request is important.&#xA;The product manager&amp;rsquo;s job is to say no to the things that are less important than the current top priority, even when that is uncomfortable.&#xA;&lt;a href=&#34;https://www.svpg.com/books/&#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=www.svpg.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cagan&lt;/a&gt; frames this as the difference between product teams (who are empowered to solve problems) and feature teams (who are handed a list to implement).&#xA;Empowered teams can say no because they understand the problem they are solving and can judge whether a given request advances the product&amp;rsquo;s goals.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Structural Patterns for Large Products&#xA;    &lt;div id=&#34;structural-patterns-for-large-products&#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;#structural-patterns-for-large-products&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When a product involves multiple teams, shared infrastructure, and cross-cutting concerns, the backlog structure needs to accommodate complexity without collapsing under it.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The Tiered Backlog&#xA;    &lt;div id=&#34;the-tiered-backlog&#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-tiered-backlog&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Large products benefit from a tiered backlog structure:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Strategic tier&lt;/strong&gt;: Outcomes, &lt;a href=&#34;https://en.wikipedia.org/wiki/OKR&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OKRs&lt;/a&gt;, or product goals for the quarter.&#xA;Owned by leadership and product management.&#xA;Updated quarterly.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Initiative tier&lt;/strong&gt;: Named efforts that advance a strategic outcome.&#xA;Owned by product managers.&#xA;Updated monthly.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Delivery tier&lt;/strong&gt;: Epics and stories that decompose an initiative.&#xA;Owned by individual teams.&#xA;Updated continuously.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Each tier feeds the one below it.&#xA;The strategic tier determines which initiatives enter the initiative tier.&#xA;The initiative tier determines which epics and stories appear in the delivery tier.&#xA;Information flows up through demos, retrospectives, and metrics.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The critical rule: no item in a lower tier can exist without a parent in the tier above it.&lt;/strong&gt;&#xA;Orphaned work is the primary source of backlog bloat.&#xA;If someone wants to add a story that doesn&amp;rsquo;t map to an active initiative, the answer is either to create an initiative (which triggers the prioritization process) or to decline the story.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The Obeya Room Pattern&#xA;    &lt;div id=&#34;the-obeya-room-pattern&#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-obeya-room-pattern&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Borrowed from lean manufacturing and popularized by Toyota, the &lt;a href=&#34;https://en.wikipedia.org/wiki/Obeya&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Obeya&lt;/a&gt; (&amp;ldquo;big room&amp;rdquo;) is a physical or virtual space where cross-functional representatives meet regularly to review the state of the product.&#xA;The backlog is visualized on the wall (or in a shared tool), and the group discusses priorities, blockers, and dependencies as they happen.&lt;/p&gt;&#xA;&lt;p&gt;For large products, the Obeya pattern addresses a problem that no tool solves: alignment.&#xA;When eight teams are pulling from the same backlog, local optimization is the default.&#xA;Each team optimizes for its own velocity and its own priorities.&#xA;&lt;strong&gt;The Obeya creates a forum where global optimization can happen.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The Regular Grooming Rhythm&#xA;    &lt;div id=&#34;the-regular-grooming-rhythm&#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-regular-grooming-rhythm&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A weekly or biweekly refinement session where the product manager and the team review the top 10-15 items in the backlog is a widely recommended practice.&#xA;&lt;strong&gt;The goal is not to estimate everything but to ensure that the next two to three sprints&amp;rsquo; worth of work is well understood.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;For large products, this rhythm needs to exist at every tier.&#xA;Leadership reviews the strategic tier quarterly.&#xA;Product managers review the initiative tier monthly.&#xA;Teams refine the delivery tier weekly.&#xA;The cadence prevents the backlog from becoming stale and ensures that the most important items are always the most visible.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Common Failure Modes&#xA;    &lt;div id=&#34;common-failure-modes&#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;#common-failure-modes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The infinite backlog.&lt;/strong&gt;&#xA;A backlog that never shrinks is not a backlog; it is a suggestion box.&#xA;If the backlog has more than a few hundred items, most of them are irrelevant.&#xA;Archive aggressively.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The stakeholder lobby.&lt;/strong&gt;&#xA;In large organizations, stakeholders learn to mark everything as &amp;ldquo;critical&amp;rdquo; or to escalate items directly to engineering managers.&#xA;The ordered backlog is the defense against the stakeholder lobby.&#xA;If the item is not in the top of the ranked list, it does not get worked on, regardless of who asked for it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The technical debt blind spot.&lt;/strong&gt;&#xA;Product backlogs tend to favor features because features have visible stakeholders.&#xA;&lt;a href=&#34;https://martinfowler.com/bliki/TechnicalDebt.html&#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=martinfowler.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Technical debt&lt;/a&gt; has no natural advocate.&#xA;The solution is to allocate a fixed percentage of capacity (often 20-30%) to technical improvement and to make that allocation explicit in the backlog.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pointless early estimation.&lt;/strong&gt;&#xA;Spending hours estimating items that are months away from being worked on is waste.&#xA;Estimate just enough to support prioritization, and re-estimate when the item moves into the delivery backlog.&#xA;&lt;a href=&#34;https://web.archive.org/web/2024/https://ronjeffries.com/articles/019-01ff/story-points/Index.html&#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=web.archive.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Ron Jeffries, &amp;ldquo;Story Points Revisited&amp;rdquo;&lt;/a&gt; argues, as one of the originators of story points, that estimation should support planning, not become a goal in itself.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Conflating bugs and features.&lt;/strong&gt;&#xA;A bug is a commitment to fix something that was promised.&#xA;A feature is a new investment.&#xA;Mixing bugs and features in the same backlog without distinguishing between them leads to either under-investment in new value (because bugs always seem urgent) or neglect of quality (because features always seem more strategic).&#xA;Separate them, fund them differently, and track them separately.&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;p&gt;If your backlog is currently a mess, here is a sequence that works:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Archive everything older than six months that has not been touched.&lt;/strong&gt;&#xA;If it mattered, someone would have advocated for it.&#xA;You can always pull items out of the archive.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Identify the current product goal.&lt;/strong&gt;&#xA;If you cannot state it in one sentence, you are not ready to prioritize the backlog.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Map every remaining item to the goal.&lt;/strong&gt;&#xA;Items that don&amp;rsquo;t map go to a separate &amp;ldquo;someday&amp;rdquo; list.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Force-rank the top 20 items.&lt;/strong&gt;&#xA;No ties.&#xA;This exercise will reveal every disagreement about priorities, which is exactly what you need.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Refine the top 5-10 items until they meet your definition of ready.&lt;/strong&gt;&#xA;Only these items are eligible for the next sprint.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Set a weekly refinement cadence and protect it.&lt;/strong&gt;&#xA;The backlog becomes stale without maintenance.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;A healthy backlog is small, ordered, and refined.&lt;/strong&gt;&#xA;It reflects a clear product goal and a shared understanding of what matters most.&#xA;Maintaining the backlog is not glamorous work, but it is the work that makes everything else possible.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What I&#39;ve built and what I need: May 2026</title>
      <link>https://tomrochette.com/what-ive-built-and-what-i-need/2026-05/</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/what-ive-built-and-what-i-need/2026-05/</guid>
      <category>what-ive-built-and-what-i-need</category><category>personal-update</category><category>skills</category><category>ai</category><category>automation</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&lt;strong&gt;The past month has been about turning repetitive workflows into reusable skills, and the gaps that remain are mostly about making those skills smarter, not more numerous.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Have Been Working On&#xA;    &lt;div id=&#34;what-i-have-been-working-on&#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-i-have-been-working-on&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Built a full SDLC skill pipeline.&lt;/strong&gt;&#xA;I shipped a comprehensive software development lifecycle orchestrator in &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agents&lt;/a&gt; that chains over 20 sub-skills, from issue creation through learnings capture.&#xA;It handles phase contracts, backtracking when upstream artifacts are incomplete, and fast paths for small work like bug fixes and config changes.&#xA;The pipeline tracks artifact status via YAML frontmatter and stores everything under &lt;code&gt;.sdlc/&lt;/code&gt; with a consistent directory structure.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Made issue tracking actually useful.&lt;/strong&gt;&#xA;I have been using &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-issue/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-issue&lt;/a&gt; heavily over the past month to track gaps in the software I am building.&#xA;It is not perfect, but it is better than not tracking the work, and it captures more context than I would take the time to write by hand.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Automated PR descriptions.&lt;/strong&gt;&#xA;I use &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-pr-description/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-pr-description&lt;/a&gt; to generate PR descriptions based on code changes and intent.&#xA;Writing those manually was slow and inconsistent; now the descriptions reflect what changed without the manual effort.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What I Currently Need&#xA;    &lt;div id=&#34;what-i-currently-need&#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-i-currently-need&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/12&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Test the SDLC pipeline on real work&lt;/a&gt;.&lt;/strong&gt;&#xA;The &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/sdlc/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SDLC skill&lt;/a&gt; is built but has not been stress-tested end to end on real feature work.&#xA;I need to run it through enough varied scenarios to surface the gaps between the design and practical use.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/8&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Scheduled issue-to-PR automation in openchamber&lt;/a&gt;.&lt;/strong&gt;&#xA;Openchamber can already create a worktree per directory and execute a prompt, but it does not run on a regular schedule.&#xA;I need it to pick up new issues, execute the full pipeline, and open PRs without manual triggering.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/13&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Automated issue triaging in open source projects&lt;/a&gt;.&lt;/strong&gt;&#xA;I built a &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/triage-issues/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;triage-issues&lt;/a&gt; skill but have not used it on my own repositories.&#xA;The goal is to reduce the burden of going through issues to identify duplicates and decide whether they should be acted on.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/6&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Memory that agents manage automatically&lt;/a&gt;.&lt;/strong&gt;&#xA;Right now memory requires explicit reads and writes.&#xA;I need agents to store, retrieve, and decay knowledge across sessions without me prompting them to do it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/4&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Contextual Slack support&lt;/a&gt;.&lt;/strong&gt;&#xA;I need a way for users asking for help on Slack to receive contextually relevant information, and for the system to learn from human-to-human interactions and the answers people give each other.&#xA;I started building &lt;a href=&#34;https://github.com/TomzxCode/slack-cached&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;slack-cached&lt;/a&gt; to cache and query Slack conversations.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/9&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Automatic context clearing between execution and review&lt;/a&gt;.&lt;/strong&gt;&#xA;Running implementation and review in the same context introduces bias.&#xA;I need a mechanism, likely using forked subagents, to &lt;code&gt;/clear&lt;/code&gt; between execution and review automatically so the reviewer starts fresh.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/5&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Accuracy pass on daily summaries&lt;/a&gt;.&lt;/strong&gt;&#xA;I have accumulated daily summaries that contain inaccuracies.&#xA;I need something to go through them and correct what is wrong, rather than letting bad data compound over time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/11&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Incremental PR description updates&lt;/a&gt;.&lt;/strong&gt;&#xA;When I update a PR after the description is written, I need &lt;a href=&#34;https://github.com/tomzx/agents/blob/main/skills/create-pr-description/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create-pr-description&lt;/a&gt; to adjust minimally, appending or amending what changed, rather than regenerating the whole thing from scratch.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/tomzx/agents/issues/7&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Skill usage tracking&lt;/a&gt;.&lt;/strong&gt;&#xA;I need to know how often each skill is invoked and when.&#xA;Without that data, I cannot tell which skills are worth keeping and which I never use.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Replying to inline PR comments.&lt;/strong&gt;&#xA;&lt;code&gt;gh&lt;/code&gt; does not support replying to inline review comments programmatically.&#xA;Tools like &lt;a href=&#34;https://github.com/agynio/gh-pr-review&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;gh-pr-review&lt;/a&gt; exist but feel awkward for what should be a straightforward operation.&#xA;I need a clean way to post inline replies as part of the review and feedback skills.&#xA;I started building &lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt; to address this gap.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Software Engineering Teams in the Age of AI: Smaller, Sharper, Intentionally Imperfect</title>
      <link>https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/</link>
      <pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/software-engineering-teams-in-the-age-of-ai/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>team-management</category><category>productivity</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;LLM-powered coding assistants have changed what an individual engineer can produce in a day.&#xA;The harder question is what this means for how teams should be organized, how they should work together, and which of their existing processes are still worth keeping.&#xA;My answer is counterintuitive: the teams that thrive will not be the ones that adopt AI fastest or eliminate the most process.&#xA;&lt;strong&gt;They will be the ones that correctly distinguish between friction that wastes time and friction that prevents mistakes.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Actually Changed&#xA;    &lt;div id=&#34;what-actually-changed&#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-actually-changed&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;AI-assisted development compresses the time from idea to working code.&#xA;An engineer with a capable LLM can prototype a feature in hours that used to take days.&#xA;Boilerplate, tests, documentation scaffolding, and CRUD endpoints all cost less and less time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;But the things that remain expensive have not changed at all.&lt;/strong&gt;&#xA;Deciding whether to build a feature, choosing the right abstraction, understanding the domain deeply, and aligning technical work with business goals are as hard as they ever were.&#xA;In many ways the expensive parts are harder now, because the temptation to just generate and ship without deciding is stronger.&lt;/p&gt;&#xA;&lt;p&gt;This creates a specific tension for teams.&#xA;When individuals can produce more code, the bottleneck shifts from production to coordination and judgment.&#xA;Team design has to account for this shift, not ignore it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Team Size: Follow the Problem Boundary&#xA;    &lt;div id=&#34;team-size-follow-the-problem-boundary&#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;#team-size-follow-the-problem-boundary&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is a persistent urge to declare an ideal team size.&#xA;Amazon popularized the &lt;a href=&#34;https://en.wikipedia.org/wiki/Amazon_%28company%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&amp;ldquo;two-pizza team&amp;rdquo;&lt;/a&gt; rule.&#xA;Agile methodology settled on &lt;a href=&#34;https://scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-US.pdf&#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=scrumguides.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;3 to 9&lt;/a&gt;.&#xA;Various management frameworks have their own magic numbers.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AI does not provide a new magic number, but it does shift the trade-off toward smaller teams.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here is why.&#xA;Communication overhead &lt;a href=&#34;https://en.wikipedia.org/wiki/Brooks%27s_law&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;scales quadratically with team size&lt;/a&gt;.&#xA;A team of 4 has 6 communication channels.&#xA;A team of 8 has 28.&#xA;When each individual ships faster because of AI assistance, the team reaches its coordination limit sooner.&#xA;The output added by the fifth or sixth engineer stops covering the cost of keeping everyone aligned.&lt;/p&gt;&#xA;&lt;p&gt;Smaller teams also benefit from clearer ownership.&#xA;When three people own a service, it is clear who is responsible for it.&#xA;When ten people own a service, everyone assumes someone else is handling the monitoring, the tests, the deployment pipeline.&lt;/p&gt;&#xA;&lt;p&gt;But smaller is not always better, and this is where the nuance matters.&lt;/p&gt;&#xA;&lt;p&gt;A team that is too small for its domain will fragment its attention across too many concerns.&#xA;Three engineers trying to own a payments system, a notification platform, and a data pipeline will do none of them well.&#xA;They will produce code quickly with AI assistance, but they will produce the wrong code, in the wrong abstractions, because no one has the time to think deeply about any one domain.&lt;/p&gt;&#xA;&lt;p&gt;The rule I would use is not a fixed number.&#xA;It is the smallest team that can own a coherent domain end-to-end.&#xA;In practice this often lands between 3 and 5 people, but the number should follow the problem boundary, not the other way around.&lt;/p&gt;&#xA;&lt;p&gt;A team of 3 that owns a single well-bounded service is better than a team of 8 that owns six loosely related ones.&#xA;But a team of 6 that owns a tightly integrated platform is better than splitting that platform across two teams of 3 that now have to coordinate across a boundary that should not exist.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Friction: Some of It Is Structural&#xA;    &lt;div id=&#34;friction-some-of-it-is-structural&#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;#friction-some-of-it-is-structural&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The instinct when a new efficiency tool arrives is to use it to remove every source of friction.&#xA;AI makes code review faster, so why not automate it?&#xA;AI can summarize meetings, so why not eliminate them?&#xA;AI can write documentation, so why not stop requiring it?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This instinct is partially right.&lt;/strong&gt;&#xA;A lot of process friction is pure waste.&#xA;Waiting three days for a manager to approve a deployment that could be automated.&#xA;Holding a 30-minute standup where eleven people say &amp;ldquo;yesterday I worked on tickets, today I will work on tickets.&amp;rdquo;&#xA;Filing a Jira ticket for a one-line config change.&lt;/p&gt;&#xA;&lt;p&gt;But some friction serves a purpose, and removing that friction silently degrades the team&amp;rsquo;s output quality over time.&lt;/p&gt;&#xA;&lt;p&gt;Code review is the clearest example.&#xA;Before AI, code review served multiple functions: catching bugs, enforcing style, sharing knowledge, and forcing the author to think about their code one more time before it shipped.&#xA;AI can handle the style and formatting portion completely.&#xA;It can catch obvious bugs.&#xA;What AI cannot do is evaluate whether the code solves the right problem, whether the abstraction will survive the next feature request, or whether the approach is consistent with how the rest of the system works.&lt;/p&gt;&#xA;&lt;p&gt;In fact, code review becomes more important with AI-generated code, not less.&#xA;When a human writes every line, you can assume the author thought about each line at some level, even if imperfectly.&#xA;When an LLM generates code, the author may not have read every line carefully.&#xA;The reviewer can no longer rely on the author&amp;rsquo;s intent as a safety check.&#xA;The reviewer has to verify both correctness and intent independently.&lt;/p&gt;&#xA;&lt;p&gt;This is harder work than traditional code review.&#xA;It means reviews should be slower, not faster.&#xA;The process should have more friction, not less.&#xA;What should change is what the friction is applied to: less time on style, more time on substance.&lt;/p&gt;&#xA;&lt;p&gt;The same principle applies to other forms of deliberation.&lt;/p&gt;&#xA;&lt;p&gt;Sprint planning, done well, is the moment when the team asks &amp;ldquo;are we working on the right things?&amp;rdquo;&#xA;That is productive friction.&#xA;Sprint planning, done poorly, is an hour of reading ticket descriptions aloud.&#xA;That is waste.&lt;/p&gt;&#xA;&lt;p&gt;Architecture discussions are productive friction when they prevent the team from building on a flawed foundation.&#xA;Architecture discussions are waste when they become philosophical debates that never converge on a decision.&lt;/p&gt;&#xA;&lt;p&gt;The discipline is in telling the difference.&#xA;The test I use: does a given process force someone to think about something they would otherwise skip?&#xA;If yes, keep the process, even if it feels slow.&#xA;If no, automate the process or remove it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Processes Worth Keeping&#xA;    &lt;div id=&#34;processes-worth-keeping&#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;#processes-worth-keeping&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Beyond code review, a few processes become more valuable in an AI-accelerated environment.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://adr.github.io/&#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=adr.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Architecture decision records&lt;/a&gt; (ADRs).&lt;/strong&gt;&#xA;When code is cheap to produce, the cost of building on the wrong abstraction is disproportionately high.&#xA;A one-page document that captures what was decided, why, and what alternatives were considered is worth more than the five minutes it takes to write.&#xA;AI can draft these from a conversation, but the team still needs to have the conversation.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Incident retrospectives.&lt;/strong&gt;&#xA;Retrospectives are one of the few processes that compound knowledge over time.&#xA;When a production incident occurs, the team that writes down what happened, why, and what the team will change makes fewer repeat mistakes over time.&#xA;The team that fixes the bug and moves on repeats the same class of mistake forever.&#xA;AI can assist with drafting the timeline from logs and alerts, but the insight about what to change has to come from the people who were in the room.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Onboarding.&lt;/strong&gt;&#xA;Onboarding is paradoxically harder in AI-heavy teams.&#xA;Historically, junior engineers built deep familiarity with a codebase by writing code in it, working through its conventions, and learning its quirks through repetition.&#xA;When AI handles much of the writing, that repeated work disappears, and with it, the learning.&#xA;Teams need to be more intentional about how they transfer knowledge.&#xA;Structured pairing, documented design decisions, and explicit mentorship become more important, not less.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Specification before implementation.&lt;/strong&gt;&#xA;The ability to write a clear specification is now the highest-leverage skill in software engineering.&#xA;&lt;strong&gt;A precise spec turns an LLM from a mediocre pair programmer into a highly effective one.&lt;/strong&gt;&#xA;A vague spec makes the LLM hallucinate.&#xA;Teams that invest in specification quality will produce more than teams that skip straight to prompting.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Processes Worth Eliminating&#xA;    &lt;div id=&#34;processes-worth-eliminating&#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;#processes-worth-eliminating&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Some processes continue only out of habit.&#xA;AI gives teams a reason to rethink them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Status meetings that are not decisions.&lt;/strong&gt;&#xA;If a standup is just a round-robin of activity reports, replace the standup with an AI-generated summary of yesterday&amp;rsquo;s commits, PRs, and tickets.&#xA;Reserve synchronous time for discussions that require back-and-forth.&#xA;Most status updates do not require back-and-forth.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Granular task estimation.&lt;/strong&gt;&#xA;When AI can generate implementation drafts, estimating individual tasks in story points becomes less accurate and less useful.&#xA;The time spent decomposing work into one-point, two-point, and three-point tickets is time not spent on the actual work.&#xA;Replace granular estimation with outcome-level planning: what do we want to ship this cycle, and are we on track?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Manual test writing for boilerplate.&lt;/strong&gt;&#xA;AI handles test scaffolding well.&#xA;Engineers should focus on test design (what cases matter, what edge cases exist, what invariants must hold) and let the tooling handle the mechanical work of writing assertions and setup code.&#xA;The test plan is the valuable artifact.&#xA;The test file is increasingly interchangeable.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Elaborate approval workflows.&lt;/strong&gt;&#xA;If a change passes CI, passes automated security scanning, and passes peer review, the change should not also need approval from a manager who has not read the code.&#xA;Every gate that does not add information is pure delay.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Structure of a Team That Gets This Right&#xA;    &lt;div id=&#34;the-structure-of-a-team-that-gets-this-right&#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-structure-of-a-team-that-gets-this-right&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the team I would design for this era.&lt;/p&gt;&#xA;&lt;p&gt;Four or five people who own a clear domain.&#xA;They spend less time writing boilerplate and more time debating trade-offs.&#xA;Their code reviews are rigorous about intent and brief about style.&#xA;They write ADRs for non-obvious decisions and skip ADRs for obvious ones.&#xA;They do not hold meetings that could be a paragraph of text.&#xA;They write specifications before they prompt.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;They treat AI as a way to apply more judgment, not a replacement for it.&lt;/strong&gt;&#xA;The judgment is still the team&amp;rsquo;s job.&#xA;The tooling just makes acting on that judgment faster.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Does Not Change&#xA;    &lt;div id=&#34;what-does-not-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;#what-does-not-change&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For all the shifts, some things do not change.&lt;/p&gt;&#xA;&lt;p&gt;Trust between team members cannot be generated by a language model.&#xA;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Psychological_safety&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Psychological safety&lt;/a&gt;, the ability to say &amp;ldquo;I think this approach is wrong&amp;rdquo; without fear, remains the single strongest predictor of team performance.&lt;/strong&gt;&#xA;A team of average engineers who trust each other will outperform a team of brilliant engineers who do not trust each other, with or without AI assistance.&lt;/p&gt;&#xA;&lt;p&gt;Shared understanding of the problem domain cannot be delegated to tooling.&#xA;If no one on the team deeply understands the business context, the code will be technically correct and strategically wrong, faster than ever.&lt;/p&gt;&#xA;&lt;p&gt;And the discipline to build less, not more, remains the hardest skill.&#xA;When implementation costs almost nothing in time, the temptation to overbuild is constant.&#xA;The teams that thrive will be the ones where someone at the table says &amp;ldquo;we don&amp;rsquo;t need this,&amp;rdquo; and the rest of the team listens.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The case for static priorities</title>
      <link>https://tomrochette.com/static-priority-system/</link>
      <pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/static-priority-system/</guid>
      <category>priority</category><category>prioritization</category><category>planning</category><category>software-engineering</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Most teams that adopt a P0-P5 priority scale make the same mistake: they treat priority as a ranking, not a classification.&#xA;The moment all P0s are resolved, someone suggests &amp;ldquo;promoting&amp;rdquo; P1s to P0.&#xA;This feels logical.&#xA;&lt;strong&gt;It is wrong, and in this article I want to defend the alternative: a static system where a priority label describes the work itself and never moves just because the queue in front of the work emptied.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Priority is a property of the work, not its position in the queue&#xA;    &lt;div id=&#34;priority-is-a-property-of-the-work-not-its-position-in-the-queue&#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;#priority-is-a-property-of-the-work-not-its-position-in-the-queue&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;P0 means something specific: the production database is corrupted, customers cannot check out, a security vulnerability is being actively exploited.&#xA;P0 work has an operational definition.&#xA;The label describes the &lt;em&gt;nature&lt;/em&gt; and &lt;em&gt;consequence&lt;/em&gt; of the task.&lt;/p&gt;&#xA;&lt;p&gt;A P1 task is important work that should be done this quarter: a feature the largest customer has been requesting, a refactor that will unblock two teams, a performance optimization that will cut infrastructure costs by 30%.&#xA;&lt;strong&gt;Completing the P0s does not transform a P1 into an existential crisis.&lt;/strong&gt;&#xA;The task has not changed.&#xA;The task&amp;rsquo;s urgency has not changed.&#xA;Calling the task P0 adds no information and removes the ability to distinguish the task from actual emergencies.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;If everything becomes P0, nothing is P0&#xA;    &lt;div id=&#34;if-everything-becomes-p0-nothing-is-p0&#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;#if-everything-becomes-p0-nothing-is-p0&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Priority inflation is the fastest way to destroy a prioritization system.&lt;/strong&gt;&#xA;Once a team learns that P0 simply means &amp;ldquo;next thing we&amp;rsquo;re working on,&amp;rdquo; the label stops meaning anything.&#xA;When a genuine P0 arrives, such as a corrupted production database, the team needs everyone to drop what they are doing, but the word no longer signals urgency because promotion has weakened the word.&lt;/p&gt;&#xA;&lt;p&gt;Consider what happens when you tell a team &amp;ldquo;this is P0&amp;rdquo; in a healthy system: people stop what they are doing, context-switch, and focus on the emergency.&#xA;That response depends on P0 being rare and meaningfully different from everything else.&#xA;If the backlog contains forty items that were &amp;ldquo;promoted&amp;rdquo; to P0, the next genuine emergency gets the same response as a feature request.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;A static system is a shared vocabulary&#xA;    &lt;div id=&#34;a-static-system-is-a-shared-vocabulary&#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;#a-static-system-is-a-shared-vocabulary&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The value of a priority scale is communication.&#xA;When an engineer files a bug as P1, a product manager should immediately understand the rough timeframe and severity without reading the full description.&#xA;When a support rep escalates a ticket to P0, the on-call engineer should know to wake up.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This shared understanding requires stable definitions.&lt;/strong&gt;&#xA;If P0 means &amp;ldquo;site is down&amp;rdquo; on Monday but &amp;ldquo;most important remaining backlog item&amp;rdquo; on Wednesday, the label communicates nothing about the work itself, only about where the work sits relative to other work.&#xA;That is what a sorted list already tells you.&#xA;&lt;strong&gt;The priority label should add something a list cannot: the &lt;em&gt;kind&lt;/em&gt; of impact the task has.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why not use importance × urgency?&#xA;    &lt;div id=&#34;why-not-use-importance--urgency&#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;#why-not-use-importance--urgency&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Time_management#The_Eisenhower_Method&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Eisenhower Matrix&lt;/a&gt; (important/urgent, important/not urgent, not important/urgent, not important/not urgent) is the most common alternative to a priority scale.&#xA;The matrix is appealing because the matrix is simple: two dimensions, four quadrants, done.&#xA;But the matrix breaks down in practice for several reasons.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Everything a team is asked to do is important.&lt;/strong&gt;&#xA;If a task were truly unimportant, the task would not be in the backlog.&#xA;As a result, most tasks cluster in the &amp;ldquo;important&amp;rdquo; row, and the entire burden of differentiation falls on the urgency axis.&#xA;The matrix has effectively collapsed back to a single dimension, but with less granularity than P0-P5.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Four buckets are too coarse.&lt;/strong&gt;&#xA;Within &amp;ldquo;important and not urgent&amp;rdquo; sits everything from &amp;ldquo;refactor the authentication system this quarter&amp;rdquo; to &amp;ldquo;update the README someday.&amp;rdquo;&#xA;The quadrant gives you no way to distinguish these.&#xA;P0-P5 gives you six levels, each with an attached timeframe and commitment level.&#xA;The matrix tells you &amp;ldquo;schedule it.&amp;rdquo;&#xA;The priority scale tells you &amp;ldquo;schedule it this quarter.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Urgency is ambiguous at the boundaries.&lt;/strong&gt;&#xA;Is a customer feature request urgent because the customer is asking today, or not urgent because there is no deadline?&#xA;Is a tech debt refactor urgent because the refactor slows down every sprint, or not urgent because nothing is currently broken?&#xA;These edge cases generate the same kind of debate that multi-dimensional systems create, but the matrix offers only two positions: urgent or not.&#xA;P0-P5 lets you express degrees of time sensitivity without a separate axis.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The matrix is a decision framework, not a communication protocol.&lt;/strong&gt;&#xA;&amp;ldquo;Important and urgent&amp;rdquo; describes a reasoning process.&#xA;P0 describes a shared organizational response: drop everything, wake people up, ship a fix today.&#xA;The priority label carries both classification and implied action.&#xA;The matrix carries only classification, leaving the action unspecified.&lt;/p&gt;&#xA;&lt;p&gt;The Eisenhower Matrix is a good tool for personal time management.&#xA;For team-scale prioritization of a shared backlog, a single priority scale with pre-agreed definitions communicates faster and differentiates better.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why not decompose into impact, urgency, and risk?&#xA;    &lt;div id=&#34;why-not-decompose-into-impact-urgency-and-risk&#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;#why-not-decompose-into-impact-urgency-and-risk&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A related objection: instead of a single P0-P5 label, why not rate each task on multiple dimensions?&#xA;If each dimension only has two or three values, assessment is quick.&lt;/p&gt;&#xA;&lt;p&gt;Assessment is indeed quick.&#xA;&lt;strong&gt;The problem is the decision rule.&lt;/strong&gt;&#xA;Once you have &lt;code&gt;impact × urgency × risk&lt;/code&gt;, you need a policy for how the dimensions combine.&#xA;Does high impact + medium urgency + low risk come before medium impact + high urgency + low risk?&#xA;Every disagreement becomes a debate about weights instead of a quick &amp;ldquo;this is P1&amp;rdquo; call.&lt;/p&gt;&#xA;&lt;p&gt;The P0-P5 scale is that policy, decided in advance.&#xA;Someone already decided the mapping.&#xA;The team classifies and moves on.&lt;/p&gt;&#xA;&lt;p&gt;That said, if a team consistently disagrees on priority labels, the disagreement itself is useful.&#xA;The disagreement surfaces the underlying dimensions naturally.&#xA;The debate about impact, urgency, and risk is the conversation you have &lt;em&gt;when the single label fails&lt;/em&gt;, not the default workflow.&#xA;A single priority label is the fast path.&#xA;Decomposed dimensions are the escalation path.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Working on P1s does not require calling them P0&#xA;    &lt;div id=&#34;working-on-p1s-does-not-require-calling-them-p0&#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;#working-on-p1s-does-not-require-calling-them-p0&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here is the practical concern: after the P0s are done, what should the team work on?&#xA;P1s, obviously.&#xA;Nothing needs to be renamed to start working on the P1s.&lt;/p&gt;&#xA;&lt;p&gt;A static priority system separates two decisions:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;What is this task?&lt;/strong&gt; (classification: P0 through P5)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;What should we work on next?&lt;/strong&gt; (scheduling: pick the highest-priority task that is unblocked and aligned with current goals)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Dynamic systems conflate the two decisions.&#xA;By making priority a function of backlog state, a dynamic system loses the ability to classify independently of schedule.&#xA;A task&amp;rsquo;s priority no longer tells you what kind of work the task represents.&#xA;The label only records where the task ranked at the moment of labeling.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Re-labeling has a cost&#xA;    &lt;div id=&#34;re-labeling-has-a-cost&#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;#re-labeling-has-a-cost&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every time items are promoted after higher-priority work completes, the team pays a coordination cost.&#xA;Someone has to decide which P1s become P0s.&#xA;That decision requires a meeting, or at least a Slack thread, or a product manager&amp;rsquo;s judgment call.&#xA;The larger the team, the more expensive the relabeling becomes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;In a static system, this cost is zero.&lt;/strong&gt;&#xA;The team finishes the P0s, picks up the next highest-priority task, and keeps building.&#xA;No ceremony, no relabeling, no debate about whether a P1 has &amp;ldquo;earned&amp;rdquo; its promotion.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Static priorities enable proportional allocation&#xA;    &lt;div id=&#34;static-priorities-enable-proportional-allocation&#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;#static-priorities-enable-proportional-allocation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Healthy teams do not just work on the highest-priority item.&#xA;These teams allocate capacity across priority levels: 10% on P0 (emergencies, when they arise), 60% on P1 (core roadmap), 20% on P2 (improvements), 10% on P3-P5 (maintenance, tech debt, experiments).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This kind of planning is only possible with stable definitions.&lt;/strong&gt;&#xA;If P1s keep becoming P0s, the team cannot reason about where the team&amp;rsquo;s time is going.&#xA;Velocity metrics become meaningless because the definition of each bucket shifts under the team.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Truthful labeling forces truthful conversations&#xA;    &lt;div id=&#34;truthful-labeling-forces-truthful-conversations&#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;#truthful-labeling-forces-truthful-conversations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A static system forces the team to be realistic about what the team is not doing.&lt;/p&gt;&#xA;&lt;p&gt;In a dynamic system, everything important eventually becomes P0, so nothing is ever explicitly deprioritized.&#xA;A stakeholder asks &amp;ldquo;when will you do X?&amp;rdquo; and the answer is &amp;ldquo;it&amp;rsquo;s P1, we&amp;rsquo;ll get to it after the current P0s.&amp;rdquo;&#xA;The answer is accurate but uncomfortable.&#xA;&lt;strong&gt;The discomfort is the point.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When a P2 feature stays P2 for three quarters, the organization has a clear signal: this work is not important enough to displace P1 work.&#xA;That signal triggers a useful conversation: should we increase staffing, should we drop the feature, or should we accept that the feature will not happen soon?&lt;/p&gt;&#xA;&lt;p&gt;In a dynamic system, the same feature would have been promoted to P1, then P0, and done without anyone confronting the question of whether the feature was worth doing at all.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When priorities &lt;em&gt;should&lt;/em&gt; change&#xA;    &lt;div id=&#34;when-priorities-should-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;#when-priorities-should-change&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A static system does not mean priorities are frozen forever.&#xA;&lt;strong&gt;Priorities should change when the &lt;em&gt;task itself&lt;/em&gt; changes, not when the backlog above the task empties.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A P2 performance issue becomes P1 when a major customer threatens to churn over the issue.&#xA;The task&amp;rsquo;s context changed.&#xA;A P3 experiment becomes P1 when early results show the experiment could replace a critical dependency.&#xA;New information arrived.&#xA;A P1 feature becomes P0 when a competitor launches the feature and the sales team starts losing deals.&#xA;The market shifted.&lt;/p&gt;&#xA;&lt;p&gt;These are legitimate priority changes because the nature and consequence of the work actually changed.&#xA;These changes are not promotions based on queue position.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The scale&#xA;    &lt;div id=&#34;the-scale&#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-scale&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For reference, a well-defined static scale looks something like this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;P0&lt;/strong&gt;: Critical. Production is down, data is at risk, or customers are blocked. Drop everything.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;P1&lt;/strong&gt;: High. Important work with clear business impact. Should be done this quarter.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;P2&lt;/strong&gt;: Medium. Valuable but not time-sensitive. Should be done within the next two quarters.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;P3&lt;/strong&gt;: Low. Nice to have. Will do if capacity allows.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;P4&lt;/strong&gt;: Minimal. Logged for consideration. No commitment to do.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;P5&lt;/strong&gt;: Rejected or deferred indefinitely. Kept for historical reference.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Each level describes a timeframe, a level of commitment, and a resource allocation.&#xA;None of the definitions reference other tasks in the backlog.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What to do instead of promoting&#xA;    &lt;div id=&#34;what-to-do-instead-of-promoting&#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-instead-of-promoting&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When the P0s are finished and work moves on to P1s, do not relabel.&#xA;Instead:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Sort P1s by dependencies and impact.&lt;/strong&gt; Within a priority level, use a secondary criterion to decide order.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pick the top P1 and start.&lt;/strong&gt; No ceremony needed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;If the P1s run out, start on P2s.&lt;/strong&gt; The system is working as intended.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The priority label told you the task was important-but-not-critical work.&#xA;It still is.&#xA;The fact that nothing more urgent remains does not change the nature of the work.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The one-sentence version&#xA;    &lt;div id=&#34;the-one-sentence-version&#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-one-sentence-version&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Priority describes what a task &lt;em&gt;is&lt;/em&gt;, not when you will get to the task.&lt;/strong&gt;&#xA;Keep the label stable, sort within levels, and let the schedule be the schedule.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Shifting Bottleneck: From Writing Code to Questioning Everything</title>
      <link>https://tomrochette.com/the-shifting-bottleneck/</link>
      <pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-shifting-bottleneck/</guid>
      <category>ai</category><category>software-engineering</category><category>llm</category><category>product-thinking</category><category>automation</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Every time AI removes a bottleneck in software development, the next one appears one level higher up the decision chain.&#xA;&lt;strong&gt;The constraint never disappears, it just moves.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Five Stages&#xA;    &lt;div id=&#34;the-five-stages&#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-five-stages&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. Producing code&#xA;    &lt;div id=&#34;1-producing-code&#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;#1-producing-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;For decades, the bottleneck was typing.&#xA;Writing code was slow.&#xA;Understanding codebases was slow.&#xA;Every feature required a human to translate intent into syntax, one keystroke at a time.&#xA;We built IDEs, autocompletion, linters, and refactoring tools to speed up writing code, but the fundamental constraint remained: humans had to write the code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Then LLMs arrived and removed that constraint almost overnight.&lt;/strong&gt;&#xA;&lt;a href=&#34;https://github.com/features/copilot&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub Copilot&lt;/a&gt;, &lt;a href=&#34;https://cursor.com&#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=cursor.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cursor&lt;/a&gt;, &lt;a href=&#34;https://claude.com/product/claude-code&#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=claude.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude Code&lt;/a&gt;, and a dozen other tools made it trivial to generate working code from a description.&#xA;The bottleneck moved.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;2. Verifying generated code&#xA;    &lt;div id=&#34;2-verifying-generated-code&#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;#2-verifying-generated-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When code writes itself, your job shifts from author to reviewer.&#xA;You no longer ask &amp;ldquo;how do I implement this?&amp;rdquo; but &amp;ldquo;does this implementation do what I want?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Verification is a fundamentally different skill.&#xA;Reviewing code you didn&amp;rsquo;t write requires reading critically.&#xA;Every function could contain a subtle bug, a hallucinated API call, or a plausible-sounding but incorrect assumption.&#xA;The code looks right, the tests pass, but does it actually solve the problem?&lt;/p&gt;&#xA;&lt;p&gt;The verification bottleneck is harder than the production bottleneck because verification is an underconstrained problem.&#xA;There are infinitely many ways code can be wrong, and no finite checklist catches them all.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;3. Deciding what to implement&#xA;    &lt;div id=&#34;3-deciding-what-to-implement&#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;#3-deciding-what-to-implement&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Once you can generate and verify code quickly enough, a new question comes up: should we build this feature at all?&lt;/p&gt;&#xA;&lt;p&gt;Not every feature deserves implementation.&#xA;Not every bug deserves a fix.&#xA;The cost of writing code approaches zero, but the cost of maintaining code, shipping code, and supporting code does not.&#xA;&lt;a href=&#34;https://blog.codinghorror.com/the-best-code-is-no-code-at-all/&#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=blog.codinghorror.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Every line of code is a liability&lt;/a&gt;.&#xA;Every feature increases the chance of bugs, increases cognitive load, and constrains future decisions.&lt;/p&gt;&#xA;&lt;p&gt;The bottleneck shifts from &amp;ldquo;can we build it?&amp;rdquo; to &amp;ldquo;should we build it?&amp;rdquo;&#xA;Deciding what to implement is product thinking, not engineering.&#xA;Engineers who spent careers optimizing for execution speed now find themselves needing to develop judgment about what is worth executing.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;4. Deciding what to build&#xA;    &lt;div id=&#34;4-deciding-what-to-build&#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;#4-deciding-what-to-build&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Push further: should this product exist at all?&lt;/p&gt;&#xA;&lt;p&gt;Before LLMs, the cost of building a product was a natural filter.&#xA;If it took six months and a team of five to build an MVP, you had to be reasonably confident the market wanted it.&#xA;Now that an MVP can be built in an afternoon, the cost of building is no longer the filter.&#xA;The filter is the cost of being wrong about product-market fit.&lt;/p&gt;&#xA;&lt;p&gt;The bottleneck now sits in strategy.&#xA;Understanding users, identifying genuine problems, and choosing which market to enter are now the scarce skills.&#xA;Anyone can build the product.&#xA;Figuring out which product to build is the hard part.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;5. Questioning automation itself&#xA;    &lt;div id=&#34;5-questioning-automation-itself&#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;#5-questioning-automation-itself&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;And then you arrive at the final question: should we have automated ourselves at all?&lt;/p&gt;&#xA;&lt;p&gt;This is not a joke.&#xA;Every layer of automation removes human involvement from a layer of decision-making.&#xA;When code writes itself, verifies itself, decides what to build, and decides whether to build it, what is left for the human?&lt;/p&gt;&#xA;&lt;p&gt;There is a genuine question about whether the end state of this trend is human irrelevance.&#xA;Not because AI became malevolent, but because we systematically removed every reason for a human to be involved.&#xA;Each step was rational.&#xA;Each bottleneck existed.&#xA;Each automation was justified.&#xA;And yet the cumulative effect is a gradual loss of human agency in the creative process.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Bottleneck Elevator&#xA;    &lt;div id=&#34;the-bottleneck-elevator&#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-bottleneck-elevator&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This pattern has a name in systems thinking: the &lt;a href=&#34;https://en.wikipedia.org/wiki/Theory_of_constraints&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;theory of constraints&lt;/a&gt;.&#xA;In any system, improving one stage of a pipeline exposes the next bottleneck downstream.&#xA;In software development, the pipeline runs upward through abstraction layers:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Existential → Product → Feature → Verification → Production&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;AI has been climbing this stack from the bottom.&#xA;&lt;strong&gt;Each time it solves one level, the next level becomes the limiting factor.&lt;/strong&gt;&#xA;The work doesn&amp;rsquo;t decrease, it transforms.&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;p&gt;If you are a software developer today, your career trajectory is moving up this stack whether or not you want it to.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If you are still at Stage 1&lt;/strong&gt; (producing code), you are already behind.&#xA;Adopt AI coding tools now.&#xA;The gap between developers who use LLMs and those who don&amp;rsquo;t is widening every month.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If you are at Stage 2&lt;/strong&gt; (verifying code), invest in specification skills.&#xA;The ability to write precise, testable requirements is what separates effective AI-assisted developers from those who spend all day reviewing hallucinated nonsense.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If you are at Stage 3&lt;/strong&gt; (deciding what to implement), develop product judgment.&#xA;Understanding trade-offs, opportunity cost, and the difference between &amp;ldquo;can build&amp;rdquo; and &amp;ldquo;should build&amp;rdquo; is your leverage.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If you are at Stage 4&lt;/strong&gt; (deciding what to build), you are in the right place for now.&#xA;Strategy, market understanding, and user empathy are the current frontier.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If you are at Stage 5&lt;/strong&gt;, you have seen the full picture.&#xA;The question is not whether automation will continue climbing, it will.&#xA;The question is what humans should do with the freedom that comes from not being the bottleneck.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Answer&#xA;    &lt;div id=&#34;the-answer&#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-answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t have a clean answer for Stage 5.&#xA;Neither does anyone else.&#xA;The optimists say we will find new creative work that we cannot yet imagine, the same way we always have after every technological revolution.&#xA;The pessimists say this time is different because AI doesn&amp;rsquo;t just replace manual labor, it replaces cognitive labor, and eventually all of it.&#xA;Both positions are old positions in the &lt;a href=&#34;https://en.wikipedia.org/wiki/Technological_unemployment&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;technological unemployment&lt;/a&gt; debate, and neither side has settled it.&lt;/p&gt;&#xA;&lt;p&gt;What I can observe is that the bottleneck will keep shifting.&#xA;Whatever you think the final constraint is, solving it will reveal another constraint.&#xA;&lt;strong&gt;The work of a developer is not to write code, it is to stand at the current bottleneck and push.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The bottleneck will move.&#xA;Your job is to move with it.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Code Factories: The RollerCoaster Tycoon Perspective</title>
      <link>https://tomrochette.com/code-factories-rollercoaster-tycoon/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/code-factories-rollercoaster-tycoon/</guid>
      <category>software-engineering</category><category>rollercoaster-tycoon</category><category>metaphors</category><category>ai</category><category>software-factory</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;You start with an empty plot of land, a small bank loan, and an objective to attract 600 guests by the end of year two.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s RollerCoaster Tycoon.&#xA;It&amp;rsquo;s also your first day as a startup founder.&lt;/p&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, you build a theme park from nothing.&#xA;You lay down paths, construct rides, hire staff, set prices, manage finances, and try to keep thousands of guests happy simultaneously.&#xA;You watch little pixelated people queue for attractions, complain about litter, get sick on rides, and leave when they&amp;rsquo;ve had enough.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Building a software product is the same game with different sprites.&lt;/strong&gt;&#xA;The question is whether your park guests are leaving happy or leaving forever.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Ride Design: Feature Development&#xA;    &lt;div id=&#34;ride-design-feature-development&#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;#ride-design-feature-development&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, every ride is a design problem.&lt;/p&gt;&#xA;&lt;p&gt;A roller coaster starts as blank track on a canvas.&#xA;You choose the lift hill height, the drop angle, the number of inversions, the banking on turns.&#xA;Each decision affects three metrics: excitement, intensity, and nausea.&lt;/p&gt;&#xA;&lt;p&gt;Excitement is what attracts guests.&#xA;Intensity is the thrill level: some guests love it, some won&amp;rsquo;t ride.&#xA;Nausea is the cost: too much and guests vomit on your paths.&lt;/p&gt;&#xA;&lt;p&gt;Feature development has the same three metrics.&lt;/p&gt;&#xA;&lt;p&gt;Excitement is user value, the feature that solves a genuine problem, delivers a delightful experience, or unlocks new capability.&#xA;Intensity is complexity, the learning curve, the configuration surface, the cognitive load on users.&#xA;Nausea is maintenance burden, the edge cases, the performance overhead, the support tickets.&lt;/p&gt;&#xA;&lt;p&gt;A roller coaster with high excitement and moderate intensity is the ideal ride.&#xA;Guests line up for it, enjoy it, and ride again.&#xA;A feature with high value and manageable complexity is the ideal feature.&#xA;Users adopt it, benefit from it, and recommend it.&lt;/p&gt;&#xA;&lt;p&gt;A roller coaster with maximum intensity and maximum nausea empties the queue.&#xA;Guests try it once, throw up, and never return.&#xA;A feature with maximum complexity and maximum maintenance burden empties the user base.&#xA;Users try it once, get confused, and never return.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The RollerCoaster Tycoon lesson: optimize for excitement, manage intensity, minimize nausea.&lt;/strong&gt;&#xA;In software: optimize for value, manage complexity, minimize burden.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Park Layout: Information Architecture&#xA;    &lt;div id=&#34;park-layout-information-architecture&#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;#park-layout-information-architecture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, path layout determines everything.&lt;/p&gt;&#xA;&lt;p&gt;Guests follow paths.&#xA;They can only reach rides that are connected to the path network.&#xA;If a ride is hidden behind another ride with no path leading to it, it might as well not exist.&#xA;If the path network is a tangled mess, guests get lost, frustrated, and leave.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Your information architecture is your path layout.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Users follow navigation.&#xA;They can only find features that are connected to the navigation flow.&#xA;If a feature is buried three menus deep with no link to it, it might as well not exist.&#xA;If the navigation is a tangled mess, users get lost, frustrated, and leave.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon teaches a specific layout pattern: the hub-and-spoke.&lt;/p&gt;&#xA;&lt;p&gt;A central plaza connects to several themed areas.&#xA;Each themed area contains related rides.&#xA;Signs guide guests from the hub to the areas they want.&#xA;The layout is intuitive, discoverable, and scalable: add a new spoke when you add a new area.&lt;/p&gt;&#xA;&lt;p&gt;Good information architecture is hub-and-spoke.&lt;/p&gt;&#xA;&lt;p&gt;A homepage or dashboard connects to major feature areas.&#xA;Each area contains related functionality.&#xA;Breadcrumbs and search guide users to what they need.&#xA;The layout is intuitive, discoverable, and scalable: add a new section when you add a new feature area.&lt;/p&gt;&#xA;&lt;p&gt;Parks with random path layouts have low guest counts and low ratings.&#xA;Products with random navigation have low engagement and low retention.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Guest Happiness: User Satisfaction&#xA;    &lt;div id=&#34;guest-happiness-user-satisfaction&#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;#guest-happiness-user-satisfaction&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every guest in RollerCoaster Tycoon has a happiness meter.&lt;/p&gt;&#xA;&lt;p&gt;It starts high when they enter the park.&#xA;Every good ride increases it.&#xA;Every long queue decreases it.&#xA;Every piece of litter they see decreases it.&#xA;Every overpriced item decreases it.&#xA;When happiness drops below a threshold, the guest leaves and the park rating drops.&lt;/p&gt;&#xA;&lt;p&gt;User satisfaction works the same way.&lt;/p&gt;&#xA;&lt;p&gt;Every smooth interaction increases it.&#xA;Every loading spinner decreases it.&#xA;Every confusing error message decreases it.&#xA;Every unexpected price increase decreases it.&#xA;When satisfaction drops below a threshold, the user churns and the review rating drops.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;RollerCoaster Tycoon teaches that guest happiness is a composite of many small factors, not one big one.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;No single ride makes guests happy.&#xA;Happiness is the combination of good rides, short queues, clean paths, reasonable prices, attractive scenery, and available amenities.&#xA;Fix one problem while ignoring the others and happiness barely moves.&lt;/p&gt;&#xA;&lt;p&gt;User satisfaction is equally composite.&#xA;No single feature makes users happy.&#xA;Satisfaction is the combination of useful features, fast performance, clear error messages, fair pricing, good design, and responsive support.&#xA;Fix one problem while ignoring the others and satisfaction barely moves.&lt;/p&gt;&#xA;&lt;p&gt;The park with the highest rating isn&amp;rsquo;t the one with the best roller coaster.&#xA;It&amp;rsquo;s the one where everything works well together.&#xA;The product with the highest satisfaction isn&amp;rsquo;t the one with the best feature.&#xA;It&amp;rsquo;s the one where everything works well together.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Queue Management: Performance Optimization&#xA;    &lt;div id=&#34;queue-management-performance-optimization&#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;#queue-management-performance-optimization&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, queues are the visual indicator of a problem.&lt;/p&gt;&#xA;&lt;p&gt;A long queue means guests are waiting.&#xA;Waiting guests are unhappy guests.&#xA;Unhappy guests leave bad reviews and reduce the park rating.&lt;/p&gt;&#xA;&lt;p&gt;The solutions are straightforward: increase ride capacity, add more rides, or optimize throughput.&#xA;Run three trains instead of two.&#xA;Synchronize the dispatch timing.&#xA;Build a second coaster nearby to distribute the load.&lt;/p&gt;&#xA;&lt;p&gt;Performance bottlenecks are queues.&lt;/p&gt;&#xA;&lt;p&gt;A slow API response means requests are waiting.&#xA;Waiting requests are unhappy users.&#xA;Unhappy users abandon carts, close tabs, and leave bad reviews.&lt;/p&gt;&#xA;&lt;p&gt;The solutions are equally straightforward: increase capacity, add more instances, or optimize throughput.&#xA;Scale horizontally with more servers.&#xA;Cache frequently requested data.&#xA;Build a read replica to distribute the load.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;RollerCoaster Tycoon also teaches a subtler lesson about queues: the perception of waiting matters as much as the actual wait.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rides with themed queue lines (tunnels with decorations, TV screens playing videos, interactive elements) have higher guest satisfaction than rides with bare concrete queues, even when the wait time is identical.&lt;/p&gt;&#xA;&lt;p&gt;The software equivalent is perceived performance.&lt;/p&gt;&#xA;&lt;p&gt;A page that loads a skeleton UI immediately and fills in content progressively feels faster than a page that shows nothing for two seconds and then renders everything at once.&#xA;The actual load time is the same.&#xA;The perceived load time is dramatically different.&lt;/p&gt;&#xA;&lt;p&gt;Theme your queue lines.&#xA;Show progress indicators, skeleton screens, and optimistic updates.&#xA;The wait is the same.&#xA;The experience is better.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Staff Management: Team Operations&#xA;    &lt;div id=&#34;staff-management-team-operations&#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;#staff-management-team-operations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Your park needs staff.&lt;/p&gt;&#xA;&lt;p&gt;Handymen sweep litter and empty trash cans.&#xA;Mechanics inspect and repair broken rides.&#xA;Security guards catch vandals and keep the peace.&#xA;Entertainers make guests happy in queue lines.&lt;/p&gt;&#xA;&lt;p&gt;Each staff member has a patrol zone.&#xA;Set the zone too large and they can&amp;rsquo;t cover it all; litter accumulates in the corners.&#xA;Set the zone too small and they cluster in one area while the rest of the park deteriorates.&#xA;Hire too few and the park falls apart.&#xA;Hire too many and the payroll drains your budget.&lt;/p&gt;&#xA;&lt;p&gt;Engineering teams have the same dynamics.&lt;/p&gt;&#xA;&lt;p&gt;SREs are mechanics: they inspect, repair, and prevent production failures.&#xA;Support engineers are handymen: they clean up tickets, triage issues, and keep the user experience tidy.&#xA;Security engineers are security guards: they find vulnerabilities, respond to incidents, and keep the codebase safe.&#xA;Developer advocates are entertainers: they engage the community, write documentation, and make the developer experience enjoyable.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The patrol zone problem is the on-call rotation problem.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Give an on-call engineer too many services and they can&amp;rsquo;t respond to incidents fast enough; errors accumulate.&#xA;Give them too few and they sit idle while other on-call engineers are overwhelmed.&#xA;Too few engineers on rotation and the team burns out.&#xA;Too many and context is spread thin.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon also teaches that staff training matters.&lt;/p&gt;&#xA;&lt;p&gt;A trained mechanic repairs rides faster.&#xA;A trained handyman cleans more efficiently.&#xA;In software, the equivalent is runbooks, incident playbooks, and onboarding documentation.&#xA;A trained on-call engineer resolves incidents faster because they&amp;rsquo;ve seen the failure modes before and know the recovery steps.&lt;/p&gt;&#xA;&lt;p&gt;Invest in your staff or watch your park deteriorate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Ride Breakdowns: Production Incidents&#xA;    &lt;div id=&#34;ride-breakdowns-production-incidents&#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;#ride-breakdowns-production-incidents&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every ride in RollerCoaster Tycoon has a reliability rating.&lt;/p&gt;&#xA;&lt;p&gt;New rides are highly reliable.&#xA;As they age, reliability drops.&#xA;The more a ride runs, the more likely it breaks down.&#xA;A broken ride closes.&#xA;Guests in the queue leave unhappy.&#xA;The mechanic has to walk across the park, inspect the ride, and repair it.&lt;/p&gt;&#xA;&lt;p&gt;During the downtime, the queue grows, the guests complain, and the park rating drops.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Production incidents are ride breakdowns.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;New services are highly reliable.&#xA;As they age, complexity accumulates.&#xA;The more a service runs, the more likely an edge case triggers a failure.&#xA;A failed service goes down.&#xA;Users in the middle of a workflow are interrupted.&#xA;The on-call engineer has to investigate, diagnose, and fix the issue.&lt;/p&gt;&#xA;&lt;p&gt;During the downtime, error rates spike, users complain, and the product reputation drops.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon&amp;rsquo;s solution to breakdowns is preventive maintenance.&lt;/p&gt;&#xA;&lt;p&gt;Mechanics can be assigned to inspect rides before they break.&#xA;Regular inspections increase reliability and reduce the frequency of breakdowns.&#xA;The cost is the mechanic&amp;rsquo;s time; time spent inspecting is time not spent repairing.&#xA;But the net effect is positive: fewer breakdowns, shorter downtimes, happier guests.&lt;/p&gt;&#xA;&lt;p&gt;The software equivalent is proactive reliability engineering.&lt;/p&gt;&#xA;&lt;p&gt;Chaos engineering, load testing, dependency auditing, and synthetic monitoring are preventive inspections.&#xA;The cost is engineering time; time spent testing reliability is time not spent building features.&#xA;But the net effect is positive: fewer incidents, shorter outages, happier users.&lt;/p&gt;&#xA;&lt;p&gt;Parks that skip inspections have spectacular breakdowns at the worst moments.&#xA;Services that skip reliability testing have spectacular outages during peak traffic.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Research: Technical Exploration&#xA;    &lt;div id=&#34;research-technical-exploration&#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;#research-technical-exploration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon has a research system.&lt;/p&gt;&#xA;&lt;p&gt;You allocate funding to research and over time, new rides, scenery, and improvements become available.&#xA;More funding accelerates research.&#xA;Less funding slows it.&#xA;No funding means you&amp;rsquo;re stuck with what you have.&lt;/p&gt;&#xA;&lt;p&gt;The tension is genuine: every dollar spent on research is a dollar not spent on building rides right now.&#xA;But without research, you can&amp;rsquo;t build the rides that attract guests later.&lt;/p&gt;&#xA;&lt;p&gt;Technology exploration is research.&lt;/p&gt;&#xA;&lt;p&gt;Every hour spent evaluating a new framework, prototyping a new architecture, or experimenting with a new tool is an hour not spent shipping features right now.&#xA;But without exploration, you can&amp;rsquo;t build the features that attract users later.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon teaches that research should be funded consistently, not in bursts.&lt;/p&gt;&#xA;&lt;p&gt;A player who sets research to maximum at the start and then cuts it to zero runs out of new content mid-game.&#xA;A player who funds research at a moderate, steady rate unlocks new rides throughout the game.&lt;/p&gt;&#xA;&lt;p&gt;The software equivalent: invest in exploration consistently, not just when the team is between projects.&lt;/p&gt;&#xA;&lt;p&gt;A team that dedicates 10% of every sprint to technical exploration (trying new tools, reading papers, prototyping ideas) continuously discovers improvements.&#xA;A team that only explores during quarterly hackathons discovers nothing for three months at a time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Consistent research wins.&lt;/strong&gt;&#xA;Burst research wastes the intervals between bursts.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Scenario Objectives: Sprint Goals and OKRs&#xA;    &lt;div id=&#34;scenario-objectives-sprint-goals-and-okrs&#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;#scenario-objectives-sprint-goals-and-okrs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every RollerCoaster Tycoon scenario has an objective.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Have 600 guests in your park by the end of year two.&amp;rdquo;&#xA;&amp;ldquo;Achieve a park rating of 700 by October, year three.&amp;rdquo;&#xA;&amp;ldquo;Build ten roller coasters with an excitement rating above 6.00.&amp;rdquo;&#xA;&amp;ldquo;Repay your loan and achieve a monthly profit of $1,000.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The objectives are specific, measurable, and time-bound.&#xA;They force you to prioritize; you can&amp;rsquo;t do everything, so you do what matters for the objective.&lt;/p&gt;&#xA;&lt;p&gt;Sprint goals and OKRs are scenario objectives.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Ship the new checkout flow by end of sprint.&amp;rdquo;&#xA;&amp;ldquo;Reduce p95 latency below 200ms by end of quarter.&amp;rdquo;&#xA;&amp;ldquo;Increase test coverage to 80% by end of year.&amp;rdquo;&#xA;&amp;ldquo;Reduce onboarding time for new engineers by 50%.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon teaches something critical about objectives: the scenario ends.&lt;/p&gt;&#xA;&lt;p&gt;When you achieve the objective, the scenario is complete.&#xA;You can keep playing (most players do) but the pressure is off.&#xA;The objective gave the gameplay structure.&#xA;Without it, you&amp;rsquo;d build aimlessly and the park would suffer.&lt;/p&gt;&#xA;&lt;p&gt;Sprint goals give development structure.&#xA;Without them, teams build aimlessly and the product suffers.&lt;/p&gt;&#xA;&lt;p&gt;But RollerCoaster Tycoon also teaches that the wrong objective leads to the wrong park.&lt;/p&gt;&#xA;&lt;p&gt;An objective that demands 1,000 guests by year one forces you to build cheap, low-quality rides to attract crowds fast.&#xA;The park fills up but the rating is terrible.&#xA;An objective that demands a park rating of 900 forces you to build slowly and carefully.&#xA;The rating is excellent but the guest count is low.&lt;/p&gt;&#xA;&lt;p&gt;Software objectives have the same distortion effect.&lt;/p&gt;&#xA;&lt;p&gt;An objective that measures lines of code produces lots of code.&#xA;An objective that measures features shipped produces lots of features.&#xA;Neither guarantees quality, user satisfaction, or business value.&#xA;&lt;strong&gt;The metric you optimize is the park you get.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Choose your scenario objective carefully.&#xA;It will determine everything you build.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Loan Management: Technical Debt&#xA;    &lt;div id=&#34;loan-management-technical-debt&#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;#loan-management-technical-debt&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Many RollerCoaster Tycoon scenarios start you in debt.&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve borrowed money to buy the land and build the first rides.&#xA;The loan accrues interest every month.&#xA;The longer you carry it, the more it costs.&lt;/p&gt;&#xA;&lt;p&gt;You can invest in rides to generate revenue and pay it off slowly.&#xA;Or you can cut spending, build cheap rides, and pay it off quickly.&#xA;The first strategy grows the park but increases the total interest paid.&#xA;The second strategy limits growth but reduces the financial burden.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Technical debt is a loan.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You borrowed time by taking shortcuts, skipping tests, ignoring architecture, hardcoding values.&#xA;The debt accrues interest every sprint.&#xA;The longer you carry it, the more it costs in debugging, refactoring, and developer frustration.&lt;/p&gt;&#xA;&lt;p&gt;You can invest in features to grow the product and pay down debt slowly.&#xA;Or you can pause features, refactor aggressively, and pay it down quickly.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon teaches that the optimal strategy depends on the interest rate.&lt;/p&gt;&#xA;&lt;p&gt;A low-interest loan is fine to carry; the revenue from new rides exceeds the interest cost.&#xA;A high-interest loan is an emergency: it consumes revenue faster than the park can generate it.&lt;/p&gt;&#xA;&lt;p&gt;Low-interest technical debt (a slightly messy module that rarely changes) is fine to carry.&#xA;The velocity gained by shipping features exceeds the cost of the debt.&#xA;High-interest technical debt (a critical module that breaks every sprint) is an emergency.&#xA;It consumes velocity faster than the team can generate it.&lt;/p&gt;&#xA;&lt;p&gt;Know your interest rate.&#xA;Manage accordingly.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Park Value: Technical Assets&#xA;    &lt;div id=&#34;park-value-technical-assets&#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;#park-value-technical-assets&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon tracks your park value, the combined worth of all your rides, scenery, and infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s not the same as cash in the bank.&#xA;You can have high park value and no cash if you spent everything on construction.&#xA;You can have high cash and low park value if you haven&amp;rsquo;t built anything.&lt;/p&gt;&#xA;&lt;p&gt;Park value represents what you&amp;rsquo;ve built, not what you have.&#xA;It compounds: every ride you build increases the value, and the more valuable the park, the more guests it attracts, which generates more revenue for building more rides.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Technical assets are park value.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Your component library, your CI/CD pipeline, your monitoring infrastructure, your documentation, your test suite: these are rides you&amp;rsquo;ve built.&#xA;They represent what you&amp;rsquo;ve constructed, not what you have in the backlog.&lt;/p&gt;&#xA;&lt;p&gt;A team with high technical assets and an empty backlog is well positioned: they can build anything quickly.&#xA;A team with low technical assets and a full backlog is in trouble: everything they try to build requires starting from scratch.&lt;/p&gt;&#xA;&lt;p&gt;Park value compounds the same way.&#xA;A park with ten rides attracts more guests than one with two, generating more revenue to build more rides.&#xA;A codebase with ten reusable components ships faster than one with two, generating more time to build more components.&lt;/p&gt;&#xA;&lt;p&gt;The RollerCoaster Tycoon lesson: invest in park value, not just cash flow.&#xA;Build rides that attract guests.&#xA;Build infrastructure that attracts velocity.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Scenery and Theming: Design and UX&#xA;    &lt;div id=&#34;scenery-and-theming-design-and-ux&#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;#scenery-and-theming-design-and-ux&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, scenery affects guest happiness.&lt;/p&gt;&#xA;&lt;p&gt;Trees, fountains, gardens, statues, themed decorations: guests notice them.&#xA;A ride surrounded by matching scenery gets an excitement bonus.&#xA;A path lined with trees and benches keeps guests happy while they walk.&#xA;A park with no scenery is functional but joyless.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Design and UX are scenery.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A functional interface without thoughtful design is a park without trees.&#xA;Users can complete their tasks but they don&amp;rsquo;t enjoy them.&#xA;There&amp;rsquo;s no delight, no personality, no sense that someone cared about the experience.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon teaches that scenery is most effective when it&amp;rsquo;s themed.&lt;/p&gt;&#xA;&lt;p&gt;A pirate-themed roller coaster surrounded by pirate scenery (ships, treasure chests, palm trees) gets a higher excitement bonus than the same ride surrounded by random, unrelated decorations.&#xA;Consistency matters more than quantity.&lt;/p&gt;&#xA;&lt;p&gt;Design systems are theming.&lt;/p&gt;&#xA;&lt;p&gt;A consistent design system (typography, colors, spacing, components) creates a cohesive experience.&#xA;Users don&amp;rsquo;t have to relearn the interface on every page.&#xA;The product feels intentional, polished, professional.&lt;/p&gt;&#xA;&lt;p&gt;A product with random design choices (different button styles, inconsistent spacing, clashing colors) is a park with random scenery.&#xA;Each element might look fine on its own.&#xA;Together, they&amp;rsquo;re incoherent.&lt;/p&gt;&#xA;&lt;p&gt;Theme your park.&#xA;Theme your product.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Marketing: Developer Relations and Product Marketing&#xA;    &lt;div id=&#34;marketing-developer-relations-and-product-marketing&#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;#marketing-developer-relations-and-product-marketing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon lets you run marketing campaigns.&lt;/p&gt;&#xA;&lt;p&gt;Advertising for the park increases guest count.&#xA;You can target local, national, or international audiences at increasing cost.&#xA;More marketing brings more guests, but if the park isn&amp;rsquo;t ready for them, they arrive to long queues, dirty paths, and broken rides.&#xA;They leave unhappy and the marketing was wasted.&lt;/p&gt;&#xA;&lt;p&gt;Product marketing and developer relations work the same way.&lt;/p&gt;&#xA;&lt;p&gt;A successful marketing campaign brings users.&#xA;But if the product isn&amp;rsquo;t ready (if the onboarding is rough, the documentation is thin, the performance is slow) users arrive to a bad experience.&#xA;They leave unhappy and the marketing was wasted.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;RollerCoaster Tycoon teaches the sequence: build the park first, then market it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Players who spend their initial budget on marketing instead of rides attract guests to an empty park.&#xA;The guests find nothing to do and leave.&#xA;The money is gone and the park rating is worse than if they&amp;rsquo;d never marketed at all.&lt;/p&gt;&#xA;&lt;p&gt;Startups learn this the hard way.&#xA;Marketing before product-market fit brings users to a product that doesn&amp;rsquo;t serve them.&#xA;The users leave, the analytics look terrible, and the brand is damaged.&lt;/p&gt;&#xA;&lt;p&gt;Build the ride first.&#xA;Then put up the billboard.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Terrain Constraints: Legacy Systems&#xA;    &lt;div id=&#34;terrain-constraints-legacy-systems&#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;#terrain-constraints-legacy-systems&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Some RollerCoaster Tycoon scenarios give you a blank, flat parcel of land.&#xA;These are the easy scenarios.&#xA;You build what you want, where you want, with no constraints.&lt;/p&gt;&#xA;&lt;p&gt;Most scenarios aren&amp;rsquo;t like that.&lt;/p&gt;&#xA;&lt;p&gt;You get a mountainous plot with a river running through it.&#xA;Or a partially built park with existing paths and rides you can&amp;rsquo;t remove.&#xA;Or an underground cavern with limited space.&#xA;The terrain constrains every decision.&#xA;You can&amp;rsquo;t build a flat coaster on a mountain.&#xA;You can&amp;rsquo;t extend a path across a river without a bridge.&#xA;You have to work with what you&amp;rsquo;ve got.&lt;/p&gt;&#xA;&lt;p&gt;Legacy codebases are constrained terrain.&lt;/p&gt;&#xA;&lt;p&gt;The ideal software project starts from nothing: blank repository, no dependencies, no constraints.&#xA;Most projects aren&amp;rsquo;t like that.&lt;/p&gt;&#xA;&lt;p&gt;You inherit a codebase with a decade of decisions baked in.&#xA;A database schema that can&amp;rsquo;t be changed without migrating millions of rows.&#xA;An API contract that external clients depend on.&#xA;A build system that nobody fully understands.&#xA;The legacy constrains every decision.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;RollerCoaster Tycoon teaches that constrained terrain isn&amp;rsquo;t a disadvantage: it&amp;rsquo;s a design prompt.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The best coasters in the game are built on mountains, using the elevation changes to create drops and turns that flat terrain can&amp;rsquo;t support.&#xA;The constraint forces creativity.&#xA;The result is better than what flat terrain would have produced.&lt;/p&gt;&#xA;&lt;p&gt;The best software architectures emerge from constrained codebases.&#xA;The legacy forces you to think carefully about abstractions, boundaries, and migration paths.&#xA;The result is often more robust than a greenfield design that never faced actual constraints.&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t wish for flat terrain.&#xA;Build better coasters on the mountain.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Ride Synchronization: Service Coordination&#xA;    &lt;div id=&#34;ride-synchronization-service-coordination&#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;#ride-synchronization-service-coordination&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, you can build ride sequences.&lt;/p&gt;&#xA;&lt;p&gt;A log flume that ends near a roller coaster entrance.&#xA;A transport ride that shuttles guests from the back of the park to the front.&#xA;A path that naturally guides guests through a series of attractions in order.&lt;/p&gt;&#xA;&lt;p&gt;When rides are well-connected, guests flow through the park naturally, experiencing each attraction in sequence.&#xA;When rides are disconnected, guests wander, backtrack, and miss attractions they would have enjoyed.&lt;/p&gt;&#xA;&lt;p&gt;Microservice coordination is ride synchronization.&lt;/p&gt;&#xA;&lt;p&gt;A well-orchestrated service mesh lets data flow through the system naturally, each service processing requests in sequence.&#xA;A poorly connected architecture forces data to backtrack, retry, and miss services that should have been involved.&lt;/p&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon also teaches that you can&amp;rsquo;t force guests through a sequence.&lt;/p&gt;&#xA;&lt;p&gt;You can build a path that leads from Ride A to Ride B, but if the guest is tired, hungry, or has already ridden Ride A, they&amp;rsquo;ll skip Ride B and look for food instead.&#xA;The sequence must be optional, not mandatory.&lt;/p&gt;&#xA;&lt;p&gt;Service orchestration must be the same.&#xA;Each service should work independently.&#xA;&lt;strong&gt;Coordination is an optimization, not a requirement.&lt;/strong&gt;&#xA;If Service A is down, Service B should still function, even if degraded.&lt;/p&gt;&#xA;&lt;p&gt;Guests who are forced through a sequence they don&amp;rsquo;t want rebel.&#xA;Services that are forced into tight coupling fail together.&lt;/p&gt;&#xA;&lt;p&gt;Build the path.&#xA;Let the guest choose.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Late Game: Software Factories&#xA;    &lt;div id=&#34;the-late-game-software-factories&#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-late-game-software-factories&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon&amp;rsquo;s late game, something shifts.&lt;/p&gt;&#xA;&lt;p&gt;Your park is established.&#xA;Rides are built, staff is hired, research is funded, guests are flowing.&#xA;You stop placing individual track pieces and start thinking about the park as a system.&lt;/p&gt;&#xA;&lt;p&gt;You notice that the path near the pirate coaster always gets congested, so you widen it.&#xA;You notice that guests cluster near the food court at noon, so you add another food stall.&#xA;You notice that the park rating dips every time it rains, so you build more indoor attractions.&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;re no longer building rides.&#xA;You&amp;rsquo;re optimizing a system.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software factories are the late game of development.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Your CI/CD pipeline is established.&#xA;Your monitoring is running.&#xA;Your team is staffed, your architecture is sound, your users are flowing.&#xA;You stop writing individual functions and start thinking about the development process as a system.&lt;/p&gt;&#xA;&lt;p&gt;You notice that deploys always cause a spike in errors, so you add automated smoke tests.&#xA;You notice that code review is the bottleneck, so you add AI-assisted review tooling.&#xA;You notice that onboarding takes too long, so you build interactive tutorials.&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;re no longer writing code.&#xA;You&amp;rsquo;re optimizing a system that writes code.&lt;/p&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, the late game players build mega-parks, sprawling empires with dozens of rides, thousands of guests, and perfect ratings.&#xA;They didn&amp;rsquo;t get there by building one perfect ride.&#xA;They got there by building a system where every ride supports every other ride.&lt;/p&gt;&#xA;&lt;p&gt;In software, the late game teams build software factories, sprawling systems where AI agents write code, tests run automatically, deployments ship continuously, and incidents heal themselves.&#xA;They didn&amp;rsquo;t get there by writing one perfect feature.&#xA;They got there by building a system where every tool supports every other tool.&lt;/p&gt;&#xA;&lt;p&gt;The park guest who walks into a mega-park sees rides.&#xA;The developer who walks into a software factory sees features.&#xA;Neither sees the decades of system optimization that made it all possible.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lesson&#xA;    &lt;div id=&#34;the-lesson&#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-lesson&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;RollerCoaster Tycoon is a game about building something that delights people.&lt;/p&gt;&#xA;&lt;p&gt;You start with empty land and an objective.&#xA;You end with a park that thousands of guests enjoy.&#xA;The satisfaction isn&amp;rsquo;t in any single ride: it&amp;rsquo;s in the system that makes every ride better.&lt;/p&gt;&#xA;&lt;p&gt;Software development is the same game.&lt;/p&gt;&#xA;&lt;p&gt;You start with an empty repository and a requirement.&#xA;You end with a product that thousands of users rely on.&#xA;&lt;strong&gt;The satisfaction isn&amp;rsquo;t in any single feature: it&amp;rsquo;s in the system that makes every feature better.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In RollerCoaster Tycoon, the parks that endure aren&amp;rsquo;t the ones with the tallest coaster or the most rides.&#xA;They&amp;rsquo;re the ones where everything works together: the paths flow, the queues are short, the staff is attentive, the scenery is beautiful, and every guest leaves happy.&lt;/p&gt;&#xA;&lt;p&gt;In software, the products that endure aren&amp;rsquo;t the ones with the most features or the latest technology.&#xA;They&amp;rsquo;re the ones where everything works together: the architecture is clean, the performance is fast, the support is responsive, the design is consistent, and every user leaves satisfied.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re still building rides one track piece at a time, it&amp;rsquo;s time to think about the park.&#xA;If you&amp;rsquo;re still writing features one line at a time, it&amp;rsquo;s time to think about the factory.&lt;/p&gt;&#xA;&lt;p&gt;The park is open.&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;https://tomrochette.com/code-factories-factorio/&#34; &gt;Code Factories: The Factorio Perspective&lt;/a&gt; - the same concept explored through Factorio metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-starcraft/&#34; &gt;Code Factories: The StarCraft Perspective&lt;/a&gt; - the same concept explored through StarCraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-wow/&#34; &gt;Code Factories: The World of Warcraft Perspective&lt;/a&gt; - the same concept explored through World of Warcraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-stock-market/&#34; &gt;Code Factories: The Stock Market Perspective&lt;/a&gt; - the same concept explored through stock market metaphors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Code Factories: The Stock Market Perspective</title>
      <link>https://tomrochette.com/code-factories-stock-market/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/code-factories-stock-market/</guid>
      <category>software-engineering</category><category>stock-market</category><category>metaphors</category><category>ai</category><category>software-factory</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;You open your terminal, pull the latest commit, and run the test suite.&lt;/p&gt;&#xA;&lt;p&gt;Some pass.&#xA;Some fail.&#xA;You investigate.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s software development.&#xA;It&amp;rsquo;s also trading.&lt;/p&gt;&#xA;&lt;p&gt;In the stock market, you analyze data, place orders, and manage risk.&#xA;You develop strategies, backtest them, and deploy capital.&#xA;You react to earnings reports, economic data, and competitor moves.&#xA;The market never sleeps.&#xA;The ticker never stops.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Building a software factory is the same game with different instruments.&lt;/strong&gt;&#xA;The question is whether you&amp;rsquo;re trading or being traded.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;IPO: Your First Deploy&#xA;    &lt;div id=&#34;ipo-your-first-deploy&#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;#ipo-your-first-deploy&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A company goes public through an initial public offering.&#xA;Months of preparation (financial audits, legal filings, roadshow pitches) all leading to the moment the ticker appears on an exchange and anyone can buy shares.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Your first production deploy is your IPO.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve spent months writing code, running tests in staging, doing code reviews.&#xA;None of it matters until users touch the software in production.&#xA;The moment you deploy to production, you&amp;rsquo;re public.&#xA;Users will do things you never expected.&#xA;Edge cases you never imagined will surface.&#xA;The market (your users) will render its verdict.&lt;/p&gt;&#xA;&lt;p&gt;Companies that rush their IPO get hammered.&#xA;The valuation drops.&#xA;The stock tanks.&#xA;The reputation suffers.&#xA;Teams that rush their first deploy get paged at 3 AM.&#xA;The errors spike.&#xA;The users complain.&#xA;The reputation suffers.&lt;/p&gt;&#xA;&lt;p&gt;The lesson is the same in both: prepare thoroughly, but don&amp;rsquo;t wait for perfection.&#xA;There is never a perfect time to go public.&#xA;There is never a perfect time to ship.&#xA;The companies that wait too long get beaten by faster competitors.&#xA;The teams that wait too long get beaten by faster teams.&lt;/p&gt;&#xA;&lt;p&gt;Ship.&#xA;Then iterate.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Market Capitalization: Lines of Code&#xA;    &lt;div id=&#34;market-capitalization-lines-of-code&#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;#market-capitalization-lines-of-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A company&amp;rsquo;s market cap (share price times shares outstanding) is the simplest measure of its size.&#xA;It tells you how much the market values the company right now.&#xA;It tells you nothing about whether the company is well-run, profitable, or sustainable.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Lines of code is the market cap of software.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;It tells you how big the codebase is.&#xA;It tells you nothing about whether the code is well-written, tested, or maintainable.&#xA;Just as a company with a billion-dollar market cap can be hemorrhaging cash, a codebase with a million lines can be hemorrhaging bugs.&lt;/p&gt;&#xA;&lt;p&gt;Investors learned long ago that market cap is a starting point, not a conclusion.&#xA;They look deeper: revenue, margins, growth rate, debt levels.&#xA;Software teams need to look deeper too: test coverage, deployment frequency, mean time to recovery, change failure rate.&lt;/p&gt;&#xA;&lt;p&gt;The stock that doubles on hype and collapses on earnings is the codebase that doubles in size on features and collapses under technical debt.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Bull and Bear Markets: Feature Velocity&#xA;    &lt;div id=&#34;bull-and-bear-markets-feature-velocity&#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;#bull-and-bear-markets-feature-velocity&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Bull markets are euphoric.&#xA;Stocks go up.&#xA;Everyone is a genius.&#xA;Companies raise money easily, hire aggressively, and expand recklessly.&#xA;Risk appetite is high.&#xA;Valuations detach from fundamentals.&lt;/p&gt;&#xA;&lt;p&gt;Bear markets are brutal.&#xA;Stocks go down.&#xA;Nobody is a genius.&#xA;Companies lay off workers, cut projects, and conserve cash.&#xA;Risk appetite vanishes.&#xA;Valuations collapse below reasonable levels.&lt;/p&gt;&#xA;&lt;p&gt;Software projects have the same cycles.&lt;/p&gt;&#xA;&lt;p&gt;In a bull phase, the product is winning.&#xA;Features ship fast.&#xA;Users are happy.&#xA;Management approves every hire and every request.&#xA;The team grows.&#xA;Velocity increases.&#xA;Everything feels possible.&lt;/p&gt;&#xA;&lt;p&gt;In a bear phase, the product is struggling.&#xA;Bugs pile up.&#xA;Deadlines are missed.&#xA;Hiring freezes.&#xA;The team shrinks.&#xA;Velocity decreases.&#xA;Everything feels impossible.&lt;/p&gt;&#xA;&lt;p&gt;The best investors don&amp;rsquo;t change their strategy based on the market.&#xA;They have a strategy that works in both environments.&#xA;They buy quality companies in bull markets and hold them through bear markets.&#xA;They use bear markets to accumulate positions in companies they believe in.&lt;/p&gt;&#xA;&lt;p&gt;The best software teams do the same.&#xA;They invest in infrastructure during bull phases so they can survive bear phases.&#xA;They maintain code quality when it&amp;rsquo;s tempting to cut corners.&#xA;They use slow periods to pay down technical debt, refactor, and build the foundation for the next bull run.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Teams that only build features during the good times and cut everything during the bad times are like investors who buy at the top and sell at the bottom.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Diversification: Your Tech Stack&#xA;    &lt;div id=&#34;diversification-your-tech-stack&#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;#diversification-your-tech-stack&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Financial advisors agree on almost nothing, but they agree on this: diversify your portfolio.&#xA;Don&amp;rsquo;t put all your money in one stock, one sector, or one asset class.&#xA;If that one bet fails, you lose everything.&lt;/p&gt;&#xA;&lt;p&gt;Technology diversification works the same way.&lt;/p&gt;&#xA;&lt;p&gt;A team that only knows one language, one framework, and one database is a portfolio with one stock.&#xA;If that technology becomes obsolete, the team becomes obsolete.&#xA;If that framework has a critical vulnerability, every service is vulnerable.&#xA;If that database hits a scaling wall, every feature hits the wall.&lt;/p&gt;&#xA;&lt;p&gt;But diversification has a cost.&#xA;A portfolio with 200 stocks is harder to manage than one with 20.&#xA;A codebase with 15 programming languages is harder to maintain than one with 3.&lt;/p&gt;&#xA;&lt;p&gt;The best investors hold enough positions to be diversified but few enough to understand each one deeply.&#xA;&lt;strong&gt;The best software teams use enough technologies to avoid single points of failure but few enough to develop deep expertise in each.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The index fund approach (owning a little bit of everything) works in finance.&#xA;In software, it&amp;rsquo;s called using industry standards: well-supported languages, proven databases, widely adopted frameworks.&#xA;You don&amp;rsquo;t pick the most exciting technology.&#xA;You pick the one that won&amp;rsquo;t go to zero.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Short Selling: Technical Debt&#xA;    &lt;div id=&#34;short-selling-technical-debt&#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;#short-selling-technical-debt&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Short selling is borrowing a stock, selling it, and hoping the price drops so you can buy it back cheaper.&#xA;You profit from decline.&#xA;The risk is unlimited; the stock can theoretically go to infinity, and your losses grow with it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Taking on technical debt is short selling your future productivity.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You borrow time now (by skipping tests, ignoring architecture, hardcoding values) and you pay it back later with interest.&#xA;If the project gets cancelled or rewritten before the debt comes due, you profit.&#xA;If the project succeeds and grows, the debt compounds.&#xA;Every feature becomes harder to ship.&#xA;Every bug becomes harder to fix.&#xA;Every new engineer takes longer to onboard.&lt;/p&gt;&#xA;&lt;p&gt;Like short selling, technical debt can be rational.&#xA;Traders short overvalued stocks.&#xA;Engineers take on debt when the feature must ship this week or the company might not exist next month.&#xA;The trade is calculated: the survival benefit of shipping now outweighs the cost of the debt later.&lt;/p&gt;&#xA;&lt;p&gt;But just as most short sellers lose money in the long run, most teams that habitually take on technical debt ship slower in the long run.&#xA;The interest payments (debugging, refactoring, working around hacks) consume an ever-larger share of development time.&lt;/p&gt;&#xA;&lt;p&gt;The markets have a saying: the market can remain irrational longer than you can remain solvent.&#xA;Software has an equivalent: the codebase can remain broken longer than your team can remain patient.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Dividends: Documentation and Tests&#xA;    &lt;div id=&#34;dividends-documentation-and-tests&#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;#dividends-documentation-and-tests&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Dividends are payments a company makes to its shareholders from its profits.&#xA;They&amp;rsquo;re not flashy.&#xA;They don&amp;rsquo;t make headlines.&#xA;But they compound.&#xA;A stock that pays a 3% dividend and reinvests it grows dramatically over decades.&#xA;Dividends are the quiet engine of long-term wealth.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Documentation and tests are dividends.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;They don&amp;rsquo;t ship features.&#xA;They don&amp;rsquo;t impress stakeholders in demos.&#xA;But they compound.&#xA;Every test written makes the next refactor safer.&#xA;Every document written makes the next onboarding faster.&#xA;Every API description written makes the next integration smoother.&lt;/p&gt;&#xA;&lt;p&gt;Companies that cut dividends to fund growth sometimes succeed.&#xA;More often, they lose the trust of long-term investors and find it harder to raise capital when they need it.&#xA;Teams that skip documentation and tests to ship features sometimes succeed.&#xA;More often, they lose the ability to make changes confidently and find every feature takes longer than the last.&lt;/p&gt;&#xA;&lt;p&gt;The best dividend stocks aren&amp;rsquo;t the ones with the highest yield.&#xA;They&amp;rsquo;re the ones with the most consistent, most reliable, most growing dividends.&#xA;The best codebases aren&amp;rsquo;t the ones with the most tests.&#xA;They&amp;rsquo;re the ones with the most consistent, most reliable, most growing test coverage.&lt;/p&gt;&#xA;&lt;p&gt;Compound interest is the eighth wonder of the world.&#xA;Compound documentation is the ninth.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Market Orders vs Limit Orders: Deployment Strategies&#xA;    &lt;div id=&#34;market-orders-vs-limit-orders-deployment-strategies&#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;#market-orders-vs-limit-orders-deployment-strategies&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A market order says: buy this stock now, at whatever price the market is offering.&#xA;Fast.&#xA;Guaranteed execution.&#xA;No price guarantee.&lt;/p&gt;&#xA;&lt;p&gt;A limit order says: buy this stock, but only if the price is at or below my limit.&#xA;Slower.&#xA;Not guaranteed to execute.&#xA;Price guaranteed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A market order is deploying to production on a Friday afternoon.&lt;/strong&gt;&#xA;Fast.&#xA;The feature is live.&#xA;No safety guarantee.&lt;/p&gt;&#xA;&lt;p&gt;A limit order is deploying through a canary release: route 5% of traffic to the new version, monitor for errors, and only proceed if everything looks good.&#xA;Slower.&#xA;Not guaranteed to finish today.&#xA;Safety guaranteed.&lt;/p&gt;&#xA;&lt;p&gt;Most retail investors use market orders because they&amp;rsquo;re simple and immediate.&#xA;Most retail developers deploy all at once because it&amp;rsquo;s simple and immediate.&lt;/p&gt;&#xA;&lt;p&gt;Professional traders use limit orders to control their risk.&#xA;Professional engineering teams use progressive deployments to control theirs.&lt;/p&gt;&#xA;&lt;p&gt;The stock that gaps down 10% on bad earnings is the deploy that errors 10% of requests on a bad commit.&#xA;The trader who used a limit order avoided the gap.&#xA;The team that used a canary deployment avoided the outage.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Earnings Season: Sprint Reviews&#xA;    &lt;div id=&#34;earnings-season-sprint-reviews&#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;#earnings-season-sprint-reviews&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every quarter, public companies report earnings.&#xA;Revenue, profit, guidance.&#xA;Analysts dissect every number.&#xA;The stock moves based on whether the results meet, beat, or miss expectations.&lt;/p&gt;&#xA;&lt;p&gt;It doesn&amp;rsquo;t matter whether the company is doing well in absolute terms.&#xA;It matters whether the company is doing well relative to expectations.&#xA;A company that doubles revenue but was expected to triple it sees its stock drop.&#xA;A company that loses money but loses less than expected sees its stock rise.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sprint reviews are earnings season.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Every sprint, the team reports what it shipped.&#xA;Stakeholders dissect every feature.&#xA;Morale moves based on whether the results meet, beat, or miss expectations.&lt;/p&gt;&#xA;&lt;p&gt;It doesn&amp;rsquo;t matter whether the team is productive in absolute terms.&#xA;It matters whether the team is productive relative to expectations.&#xA;A team that ships five features but committed to seven feels like it failed.&#xA;A team that ships three features but committed to two feels like it succeeded.&lt;/p&gt;&#xA;&lt;p&gt;The earnings lesson for companies is straightforward: underpromise and overdeliver.&#xA;The sprint lesson for teams is the same.&#xA;The company that guides conservatively and beats expectations rewards its shareholders.&#xA;The team that commits conservatively and beats its sprint rewards its morale.&lt;/p&gt;&#xA;&lt;p&gt;Companies that inflate guidance to pump the stock eventually miss and crash.&#xA;Teams that inflate commitments to impress stakeholders eventually miss and burn out.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Volatility: Production Incidents&#xA;    &lt;div id=&#34;volatility-production-incidents&#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;#volatility-production-incidents&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Volatility is how much a stock&amp;rsquo;s price moves up or down.&#xA;High volatility means large, unpredictable swings.&#xA;Low volatility means small, predictable movements.&lt;/p&gt;&#xA;&lt;p&gt;Traders love volatility: it creates opportunity.&#xA;Investors hate volatility: it creates anxiety.&#xA;Both are describing the same phenomenon from different perspectives.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Production incidents are volatility.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;High incident volatility means the system swings between working and broken with little warning.&#xA;The on-call engineer gets paged at random hours.&#xA;The deploy button feels like a slot machine.&#xA;Nobody knows whether today will be a quiet day or a fire-fighting day.&lt;/p&gt;&#xA;&lt;p&gt;Low incident volatility means the system is stable and predictable.&#xA;Deploys are boring.&#xA;Pages are rare.&#xA;The team can plan its work with confidence.&lt;/p&gt;&#xA;&lt;p&gt;The paradox of volatility is that it&amp;rsquo;s both a risk and a reward.&#xA;Traders who can predict volatile movements profit handsomely.&#xA;Engineers who can diagnose and fix incidents quickly become heroes.&#xA;But predictability is worth more than heroism.&#xA;The trader who consistently earns 10% a year beats the trader who swings between +50% and -40%.&#xA;The team that consistently ships without incidents beats the team that heroically recovers from weekly outages.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/VIX&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;VIX&lt;/a&gt; (the stock market&amp;rsquo;s volatility index) is often called the fear index.&#xA;Your incident frequency is your VIX.&#xA;If it&amp;rsquo;s high, your team is afraid to deploy.&#xA;If it&amp;rsquo;s low, your team deploys confidently.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Fundamental Analysis vs Technical Analysis: Code Reviews&#xA;    &lt;div id=&#34;fundamental-analysis-vs-technical-analysis-code-reviews&#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;#fundamental-analysis-vs-technical-analysis-code-reviews&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Fundamental analysts study the company, its financials, its management, its competitive position, its growth prospects.&#xA;They believe the stock price will eventually reflect the company&amp;rsquo;s true value.&lt;/p&gt;&#xA;&lt;p&gt;Technical analysts study the chart, price movements, volume, trends, patterns.&#xA;They believe the price already reflects everything worth knowing and the pattern predicts what comes next.&lt;/p&gt;&#xA;&lt;p&gt;Both approaches have merits.&#xA;Both have blind spots.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Code review has the same split.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The fundamental reviewer reads every line, understands the design decisions, evaluates the architecture, and checks whether the implementation matches the specification.&#xA;They&amp;rsquo;re thorough but slow.&lt;/p&gt;&#xA;&lt;p&gt;The technical reviewer looks at the diff, the changes, the patterns, the test coverage, the style.&#xA;They&amp;rsquo;re fast but can miss design flaws that aren&amp;rsquo;t visible in the diff.&lt;/p&gt;&#xA;&lt;p&gt;The best investors combine both.&#xA;They use technical analysis for timing and fundamental analysis for selection.&#xA;The best code reviewers combine both too.&#xA;They look at the diff for quick feedback and the architecture for deeper understanding.&lt;/p&gt;&#xA;&lt;p&gt;Investors who only use technical analysis get caught in pump-and-dump schemes.&#xA;Reviewers who only look at diffs get caught by changes that look correct in isolation but break the system in context.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Insider Trading: Knowledge Silos&#xA;    &lt;div id=&#34;insider-trading-knowledge-silos&#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;#insider-trading-knowledge-silos&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Insider trading is trading on information that isn&amp;rsquo;t public yet.&#xA;It&amp;rsquo;s illegal in finance because it&amp;rsquo;s unfair: the insider has an advantage that ordinary investors don&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Knowledge silos are insider trading in software.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The engineer who has been on the team for five years and knows every quirk of the legacy system has information that new team members don&amp;rsquo;t.&#xA;They can diagnose problems faster, estimate tasks more accurately, and avoid pitfalls that would trap anyone else.&#xA;They have an unfair advantage.&lt;/p&gt;&#xA;&lt;p&gt;Unlike the stock market, this isn&amp;rsquo;t illegal.&#xA;But it is dangerous.&lt;/p&gt;&#xA;&lt;p&gt;When the insider leaves (the senior engineer quits, the architect retires, the founding developer moves on) the team loses access to all that private information.&#xA;The stock drops.&#xA;The system becomes incomprehensible.&lt;/p&gt;&#xA;&lt;p&gt;The solution in finance is regulation: insiders must disclose their trades.&#xA;The solution in software is documentation: experts must disclose their knowledge.&#xA;Run books, architecture decision records, onboarding guides, code comments: these are the SEC filings of software.&#xA;They give everyone the same information.&lt;/p&gt;&#xA;&lt;p&gt;Teams that don&amp;rsquo;t document are teams where insider trading is the norm.&#xA;And when the insider leaves, everyone else inherits the undocumented system.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Market Crashes: Cascading Failures&#xA;    &lt;div id=&#34;market-crashes-cascading-failures&#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;#market-crashes-cascading-failures&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;On October 19, 1987, &lt;a href=&#34;https://en.wikipedia.org/wiki/Black_Monday_%281987%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;the Dow Jones dropped 22.6% in a single day&lt;/a&gt;.&#xA;No single event caused it.&#xA;Program trading, portfolio insurance, and panic selling created a feedback loop.&#xA;Each drop triggered more selling, which triggered more drops.&#xA;The system destroyed itself through its own feedback loop.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cascading production failures are market crashes.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A database slows down, which causes API timeouts, which cause retry storms, which overload the load balancer, which drops health checks, which trigger auto-scaling, which overwhelms the database further.&#xA;No single component failed.&#xA;The system destroyed itself through its own feedback loop.&lt;/p&gt;&#xA;&lt;p&gt;The 1987 crash led to circuit breakers, automatic trading halts when the market drops too fast.&#xA;They don&amp;rsquo;t prevent the underlying problem.&#xA;They prevent the feedback loop.&#xA;They give humans time to intervene.&lt;/p&gt;&#xA;&lt;p&gt;Circuit breakers in software work the same way.&#xA;Rate limits prevent retry storms.&#xA;Bulkheads prevent failures from spreading between services.&#xA;Timeouts prevent cascading hangs.&#xA;They don&amp;rsquo;t prevent the database from being slow.&#xA;They prevent the slowness from becoming an outage.&lt;/p&gt;&#xA;&lt;p&gt;Markets without circuit breakers crash faster and recover slower.&#xA;Systems without circuit breakers fail faster and recover slower.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Index Funds: Standardized Infrastructure&#xA;    &lt;div id=&#34;index-funds-standardized-infrastructure&#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;#index-funds-standardized-infrastructure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Index_fund&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Index funds&lt;/a&gt; track a market index, the S&amp;amp;P 500, the NASDAQ, the total market.&#xA;They don&amp;rsquo;t try to beat the market.&#xA;They try to be the market.&#xA;Low fees.&#xA;Broad diversification.&#xA;Consistent returns.&#xA;They&amp;rsquo;ve outperformed most actively managed funds over any reasonable time period.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Standardized infrastructure is the index fund of software.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You don&amp;rsquo;t try to build the most optimized database layer, the most custom CI/CD pipeline, the most custom-built deployment system.&#xA;You use the standard: Kubernetes for orchestration, GitHub Actions for CI/CD, Terraform for infrastructure as code.&#xA;Not because they&amp;rsquo;re the best in every dimension.&#xA;Because they&amp;rsquo;re good enough in every dimension and they free your team to focus on what actually differentiates your product.&lt;/p&gt;&#xA;&lt;p&gt;Actively managed funds charge higher fees for the promise of beating the market.&#xA;Most don&amp;rsquo;t.&#xA;Custom infrastructure demands more maintenance for the promise of better performance.&#xA;Most of the time, it isn&amp;rsquo;t worth it.&lt;/p&gt;&#xA;&lt;p&gt;The index fund lesson: stop trying to be clever.&#xA;Accept market returns and spend your energy where it matters.&#xA;The infrastructure lesson: stop building custom solutions for solved problems.&#xA;Accept industry standards and spend your engineering effort on the product.&lt;/p&gt;&#xA;&lt;p&gt;Warren Buffett&amp;rsquo;s advice to most investors is to buy a low-cost index fund and do nothing.&#xA;The equivalent advice to most engineering teams is to adopt standard tooling and focus on shipping.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Margin Trading: Overcommitment&#xA;    &lt;div id=&#34;margin-trading-overcommitment&#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;#margin-trading-overcommitment&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Margin trading is borrowing money from your broker to buy more stock than you can afford.&#xA;It amplifies gains when you&amp;rsquo;re right.&#xA;It amplifies losses when you&amp;rsquo;re wrong.&#xA;If the position moves against you enough, you get a margin call: the broker demands more collateral or forces you to sell at a loss.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Overcommitting your team is margin trading.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You borrow future capacity (by promising more features than the team can deliver) to please stakeholders now.&#xA;When the estimates are right, the team delivers and everyone is happy.&#xA;When the estimates are wrong (and they&amp;rsquo;re often wrong) the team gets a margin call.&#xA;Deadlines are missed.&#xA;Quality drops.&#xA;People burn out.&lt;/p&gt;&#xA;&lt;p&gt;The margin call in software is the sprint where nothing ships.&#xA;The team spent two weeks paying back the borrowed time from the previous three sprints.&#xA;They were debugging instead of building.&#xA;Refactoring instead of featuring.&#xA;Recovering instead of advancing.&lt;/p&gt;&#xA;&lt;p&gt;Professional traders use margin carefully, with strict risk limits.&#xA;Professional engineering managers use overcommitment carefully, with buffers and contingency plans.&lt;/p&gt;&#xA;&lt;p&gt;Amateur traders get wiped out by margin calls.&#xA;Amateur teams get burned out by death marches.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Warren Buffett: The Principal Engineer&#xA;    &lt;div id=&#34;warren-buffett-the-principal-engineer&#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;#warren-buffett-the-principal-engineer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Warren_Buffett&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Warren Buffett&lt;/a&gt; has been investing for over seven decades.&#xA;He doesn&amp;rsquo;t trade.&#xA;He doesn&amp;rsquo;t use leverage.&#xA;He doesn&amp;rsquo;t chase trends.&#xA;He reads annual reports, understands businesses deeply, and makes a few large, concentrated bets on companies he understands.&lt;/p&gt;&#xA;&lt;p&gt;Then he waits.&lt;/p&gt;&#xA;&lt;p&gt;His holding period, he famously said, is forever.&#xA;His edge isn&amp;rsquo;t speed or information.&#xA;It&amp;rsquo;s patience and judgment.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The principal engineer is the Warren Buffett of software.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;They don&amp;rsquo;t chase the latest framework.&#xA;They don&amp;rsquo;t rewrite systems that work.&#xA;They read codebases deeply, understand the architecture completely, and make a few large, concentrated decisions about the systems that matter most.&lt;/p&gt;&#xA;&lt;p&gt;Then they wait.&lt;/p&gt;&#xA;&lt;p&gt;Their edge isn&amp;rsquo;t typing speed or commit frequency.&#xA;It&amp;rsquo;s judgment and patience.&#xA;They know which changes are worth making and which changes will look foolish in six months.&#xA;They know which abstractions will last and which will be torn out next quarter.&lt;/p&gt;&#xA;&lt;p&gt;Buffett&amp;rsquo;s company, Berkshire Hathaway, has outperformed the market for decades by doing less, not more.&#xA;The principal engineer outperforms the rest of the team not by writing more code, but by writing the right code.&lt;/p&gt;&#xA;&lt;p&gt;The market rewards activity in the short term and wisdom in the long term.&#xA;Software rewards the same.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Market Efficiency: The Myth of the Perfect System&#xA;    &lt;div id=&#34;market-efficiency-the-myth-of-the-perfect-system&#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;#market-efficiency-the-myth-of-the-perfect-system&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Efficient-market_hypothesis&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;efficient market hypothesis&lt;/a&gt; says that stock prices reflect all available information.&#xA;If a stock is undervalued, someone will buy it and push the price up.&#xA;If it&amp;rsquo;s overvalued, someone will sell it and push the price down.&#xA;In an efficient market, you can&amp;rsquo;t consistently beat the market because the market already knows everything you know.&lt;/p&gt;&#xA;&lt;p&gt;Markets aren&amp;rsquo;t perfectly efficient.&#xA;They&amp;rsquo;re efficient enough to humiliate most people who think they can beat them.&lt;/p&gt;&#xA;&lt;p&gt;Software systems aren&amp;rsquo;t perfectly reliable.&#xA;They&amp;rsquo;re reliable enough to humiliate most teams who think they&amp;rsquo;ve eliminated all failure modes.&lt;/p&gt;&#xA;&lt;p&gt;The efficient market hypothesis teaches investors to be humble.&#xA;No matter how smart you are, the collective wisdom of millions of market participants has already been priced in.&#xA;Your edge, if you have one, is small and temporary.&lt;/p&gt;&#xA;&lt;p&gt;The software equivalent teaches engineers to be humble.&#xA;No matter how well you design the system, the collective chaos of users, dependencies, networks, and hardware will find the gaps.&#xA;Your reliability, if you&amp;rsquo;ve achieved it, is temporary and requires constant maintenance.&lt;/p&gt;&#xA;&lt;p&gt;Investors who believe they&amp;rsquo;ve found a system that can&amp;rsquo;t lose discover that markets change.&#xA;Engineers who believe they&amp;rsquo;ve built a system that can&amp;rsquo;t fail discover that failure modes evolve.&lt;/p&gt;&#xA;&lt;p&gt;The market adapts.&#xA;The system adapts.&#xA;&lt;strong&gt;Stay humble or get humbled.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Late Game: Algorithmic Trading&#xA;    &lt;div id=&#34;the-late-game-algorithmic-trading&#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-late-game-algorithmic-trading&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In modern markets, the majority of trading volume comes from algorithms.&#xA;Machines that analyze data, identify patterns, and execute trades in microseconds.&#xA;They don&amp;rsquo;t sleep.&#xA;They don&amp;rsquo;t panic.&#xA;They don&amp;rsquo;t get greedy or fearful.&#xA;They follow their programming with mechanical precision.&lt;/p&gt;&#xA;&lt;p&gt;The humans who built these algorithms don&amp;rsquo;t trade.&#xA;They design the systems that trade.&#xA;They monitor the systems, adjust parameters, and intervene when the algorithms encounter situations they weren&amp;rsquo;t designed for.&#xA;But they don&amp;rsquo;t place orders themselves.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software factories are algorithmic trading.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AI agents write code, run tests, deploy services, and respond to incidents with increasing autonomy.&#xA;They don&amp;rsquo;t get tired.&#xA;They don&amp;rsquo;t get bored.&#xA;They don&amp;rsquo;t introduce off-by-one errors at 5 PM on a Friday.&lt;/p&gt;&#xA;&lt;p&gt;The engineers who built these systems don&amp;rsquo;t write code for production.&#xA;They design the systems that write code.&#xA;They monitor the agents, adjust prompts, and intervene when the AI encounters problems it wasn&amp;rsquo;t trained for.&#xA;But they don&amp;rsquo;t write the production code themselves.&lt;/p&gt;&#xA;&lt;p&gt;Algorithmic trading didn&amp;rsquo;t eliminate human traders overnight.&#xA;The first algorithms were simple: arbitrage, market making, basic pattern recognition.&#xA;They handled the routine and left the complex decisions to humans.&#xA;Over time, the algorithms got better and handled more of the complexity.&lt;/p&gt;&#xA;&lt;p&gt;Software factories won&amp;rsquo;t eliminate human engineers overnight.&#xA;The first AI agents are simple: boilerplate generation, test writing, basic bug fixes.&#xA;They handle the routine and leave the complex decisions to humans.&#xA;Over time, the agents will get better and handle more of the complexity.&lt;/p&gt;&#xA;&lt;p&gt;The traders who survived the algorithmic revolution were the ones who learned to work with the algorithms, not against them.&#xA;They moved up the stack, from executing trades to designing strategies.&#xA;The engineers who will survive the AI revolution are the ones who learn to work with AI agents, not against them.&#xA;They&amp;rsquo;ll move up the stack, from writing code to designing systems.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lesson&#xA;    &lt;div id=&#34;the-lesson&#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-lesson&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The stock market is a system for allocating capital to its most productive use.&#xA;Prices emerge from millions of participants making independent decisions based on incomplete information.&#xA;Nobody controls the market.&#xA;Everyone participates in it.&lt;/p&gt;&#xA;&lt;p&gt;Software development is a system for allocating engineering effort to its most productive use.&#xA;Priorities emerge from teams making decisions based on incomplete information about users, technology, and the future.&#xA;Nobody controls the outcome.&#xA;Everyone contributes to it.&lt;/p&gt;&#xA;&lt;p&gt;The market doesn&amp;rsquo;t care about your feelings.&#xA;Your codebase doesn&amp;rsquo;t care about your intentions.&#xA;Both respond to what you do, not what you mean to do.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;In both domains, the winners are the ones who manage risk, compound knowledge, stay humble, and play the long game.&lt;/strong&gt;&#xA;The losers are the ones who chase hype, take on debt they can&amp;rsquo;t repay, confuse activity with progress, and believe this time is different.&lt;/p&gt;&#xA;&lt;p&gt;This time is never different.&lt;/p&gt;&#xA;&lt;p&gt;The market remains.&#xA;The codebase remains.&#xA;The best you can do is show up every day, make good decisions, and let compounding do its work.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re still hand-trading in a world of algorithms, it&amp;rsquo;s time to automate.&#xA;If you&amp;rsquo;re still hand-coding in a world of software factories, it&amp;rsquo;s time to build.&lt;/p&gt;&#xA;&lt;p&gt;The market is open.&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;https://tomrochette.com/code-factories-factorio/&#34; &gt;Code Factories: The Factorio Perspective&lt;/a&gt; - the same concept explored through Factorio metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-starcraft/&#34; &gt;Code Factories: The StarCraft Perspective&lt;/a&gt; - the same concept explored through StarCraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-wow/&#34; &gt;Code Factories: The World of Warcraft Perspective&lt;/a&gt; - the same concept explored through World of Warcraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-rollercoaster-tycoon/&#34; &gt;Code Factories: The RollerCoaster Tycoon Perspective&lt;/a&gt; - the same concept explored through RollerCoaster Tycoon metaphors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Code Factories: The World of Warcraft Perspective</title>
      <link>https://tomrochette.com/code-factories-wow/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/code-factories-wow/</guid>
      <category>software-engineering</category><category>world-of-warcraft</category><category>metaphors</category><category>ai</category><category>software-factory</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;I create a character, spawn in a starting zone with a rusty sword and a vague quest to kill boars.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s &lt;a href=&#34;https://worldofwarcraft.blizzard.com/&#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=worldofwarcraft.blizzard.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;World of Warcraft&lt;/a&gt;.&#xA;It&amp;rsquo;s also my first day as a software developer.&lt;/p&gt;&#xA;&lt;p&gt;In World of Warcraft, I choose a race and a class, then spend hundreds of hours leveling through zones, running dungeons, completing quests, and eventually organizing twenty-five people to coordinate a raid boss fight where one mistake kills everyone.&#xA;The game is about progression, from nothing to something, from solo to coordinated, from chaos to precision.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software development follows the same arc.&lt;/strong&gt;&#xA;The question is what level my team is playing at.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Leveling: Developer Growth&#xA;    &lt;div id=&#34;leveling-developer-growth&#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;#leveling-developer-growth&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, every character starts at level 1.&#xA;I have two abilities, no gear, and no idea what I&amp;rsquo;m doing.&#xA;I kill wolves for experience.&#xA;I die to enemies I&amp;rsquo;ll later defeat in one hit.&#xA;I slowly unlock new abilities, talent points, and gear slots.&lt;/p&gt;&#xA;&lt;p&gt;The leveling process isn&amp;rsquo;t a tutorial: it&amp;rsquo;s the actual game.&#xA;Every level teaches me something about my class.&#xA;By the time I reach the level cap, I&amp;rsquo;ve internalized dozens of mechanics through repetition.&lt;/p&gt;&#xA;&lt;p&gt;Developer onboarding is leveling.&lt;/p&gt;&#xA;&lt;p&gt;Junior developers start with two abilities: write code and Google errors.&#xA;They fix simple bugs.&#xA;They write basic functions.&#xA;They die to merge conflicts they&amp;rsquo;ll later resolve in seconds.&lt;/p&gt;&#xA;&lt;p&gt;Each project, each codebase, each production incident is experience points.&#xA;Nobody becomes a senior developer by reading about architecture.&#xA;People become senior developers by leveling through enough bad architectures to recognize a good one.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The WoW lesson: there are no shortcuts to the level cap.&lt;/strong&gt;&#xA;Boosted characters (players who pay to skip leveling) arrive at max level without understanding their class.&#xA;Developers who skip fundamentals (jumping straight into frameworks without understanding the language, or into architecture without understanding systems) are boosted characters.&#xA;They have the gear but not the skill.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Talent Trees: Specialization&#xA;    &lt;div id=&#34;talent-trees-specialization&#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;#talent-trees-specialization&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At level 10, WoW lets me choose a specialization.&#xA;A Paladin can be a tank, a healer, or a damage dealer.&#xA;A Mage can specialize in fire, frost, or arcane.&#xA;Each talent tree changes how the class plays entirely.&lt;/p&gt;&#xA;&lt;p&gt;Career specialization is the same.&lt;/p&gt;&#xA;&lt;p&gt;The backend talent tree: databases, distributed systems, API design, performance optimization.&#xA;The frontend talent tree: UI components, state management, accessibility, rendering performance.&#xA;The DevOps talent tree: CI/CD, container orchestration, monitoring, infrastructure as code.&lt;/p&gt;&#xA;&lt;p&gt;In WoW, I can respec: pay gold, reset my talent points, and pick a new tree.&#xA;In software, I can respec too.&#xA;A backend developer can learn frontend.&#xA;A frontend developer can learn DevOps.&#xA;The cost isn&amp;rsquo;t gold: it&amp;rsquo;s time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;But WoW teaches something important about talent trees: depth beats breadth early on.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A player who spreads talent points across all three trees is weaker than one who commits to one.&#xA;A developer who tries to master everything is weaker than one who goes deep on one domain first, then branches out later.&lt;/p&gt;&#xA;&lt;p&gt;Specialize.&#xA;Then generalize.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Questing: Tickets and Tasks&#xA;    &lt;div id=&#34;questing-tickets-and-tasks&#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;#questing-tickets-and-tasks&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Quests in WoW are simple: accept task, complete objective, turn in for reward.&lt;/p&gt;&#xA;&lt;p&gt;Kill ten wolves.&#xA;Collect fifteen herbs.&#xA;Escort an NPC across a danger zone.&#xA;The objectives are clear.&#xA;The rewards are predictable.&#xA;The difficulty scales with level.&lt;/p&gt;&#xA;&lt;p&gt;Tickets are quests.&lt;/p&gt;&#xA;&lt;p&gt;A Jira ticket says: implement this feature, fix this bug, refactor this module.&#xA;The objective is clear, or it should be.&#xA;The reward is a shipped product.&lt;/p&gt;&#xA;&lt;p&gt;But WoW also teaches that not all quests are worth doing.&lt;/p&gt;&#xA;&lt;p&gt;Some quests send players across the map for minimal experience.&#xA;Some quest chains look tedious but unlock a dungeon.&#xA;The experienced player knows which quests to skip and which to prioritize.&lt;/p&gt;&#xA;&lt;p&gt;The experienced developer knows the same thing.&#xA;Not every ticket deserves the same investment.&#xA;Some are quick wins with high impact.&#xA;Some consume days for negligible value.&#xA;&lt;strong&gt;The skill isn&amp;rsquo;t in completing the quest: it&amp;rsquo;s in choosing the right quests.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Dungeons: Sprint Delivery&#xA;    &lt;div id=&#34;dungeons-sprint-delivery&#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;#dungeons-sprint-delivery&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At level 15, I enter my first dungeon.&lt;/p&gt;&#xA;&lt;p&gt;Five players.&#xA;One tank.&#xA;One healer.&#xA;Three damage dealers.&#xA;A dungeon is a structured challenge that cannot be completed alone.&#xA;I need a group, each performing their role, communicating through pulls and boss fights.&lt;/p&gt;&#xA;&lt;p&gt;Dungeons are sprints.&lt;/p&gt;&#xA;&lt;p&gt;A small team, a defined scope, a clear objective, a fixed timeframe.&#xA;The tank sets the pace, pulling groups of enemies, controlling the flow.&#xA;The healer keeps everyone alive, handling the unexpected, patching mistakes.&#xA;The damage dealers execute, killing targets, following priority, managing resources.&lt;/p&gt;&#xA;&lt;p&gt;A sprint works the same way.&lt;/p&gt;&#xA;&lt;p&gt;The tech lead is the tank: they scope the work, set priorities, manage risk.&#xA;The more senior developers are the healers: they catch issues in review, patch architectural problems, keep the codebase healthy.&#xA;The team executes, writing features, fixing bugs, shipping code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;WoW teaches a critical dungeon lesson: the group moves at the pace of its weakest coordinated member.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;One player who doesn&amp;rsquo;t know the strategy, doesn&amp;rsquo;t listen to the leader, or attacks the wrong target can wipe the group (get everyone killed).&#xA;In a sprint, one developer who misunderstands the requirement, skips code review, or deploys without testing can derail the whole release.&lt;/p&gt;&#xA;&lt;p&gt;Communication isn&amp;rsquo;t optional.&#xA;It&amp;rsquo;s the difference between a smooth run and a wipe.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Raids: Large-Scale Projects&#xA;    &lt;div id=&#34;raids-large-scale-projects&#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;#raids-large-scale-projects&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Raids are WoW&amp;rsquo;s endgame content.&lt;/p&gt;&#xA;&lt;p&gt;Ten, twenty, or forty players coordinating to defeat bosses with complex mechanics.&#xA;One person stands in the wrong spot and the entire raid dies.&#xA;One healer misses a healing rotation and the tank falls.&#xA;One damage dealer ignores a mechanic and the boss enrages.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Raids are large-scale projects.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Multiple teams coordinating across a shared objective.&#xA;One service goes down and the whole product suffers.&#xA;One team misses their deadline and the launch slips.&#xA;One undocumented dependency surfaces and everything breaks.&lt;/p&gt;&#xA;&lt;p&gt;The raid leader is the engineering manager.&lt;/p&gt;&#xA;&lt;p&gt;They don&amp;rsquo;t play the game for the team: they coordinate.&#xA;They call out mechanics before they happen.&#xA;They adjust the strategy when something goes wrong.&#xA;They decide who sits out when the group is too large.&lt;/p&gt;&#xA;&lt;p&gt;Good raid leaders don&amp;rsquo;t micromanage individual players.&#xA;They trust each player to execute their role while they focus on the overall plan.&#xA;Good engineering managers do the same: they set direction, remove blockers, and let engineers engineer.&lt;/p&gt;&#xA;&lt;p&gt;WoW raids also teach preparation.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t walk into a raid unprepared.&#xA;I bring flasks, food buffs, enchanted gear, and consumables.&#xA;I&amp;rsquo;ve studied the boss mechanics on forums and in videos.&#xA;I&amp;rsquo;ve done the prerequisite attunement quests.&lt;/p&gt;&#xA;&lt;p&gt;Large projects require the same preparation.&#xA;I don&amp;rsquo;t walk into a rewrite without understanding the current system.&#xA;I don&amp;rsquo;t migrate a database without load testing.&#xA;I don&amp;rsquo;t launch a product without a rollback plan.&lt;/p&gt;&#xA;&lt;p&gt;Underprepared raids wipe.&#xA;Underprepared projects fail.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Tank, Healer, DPS: Team Roles&#xA;    &lt;div id=&#34;tank-healer-dps-team-roles&#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;#tank-healer-dps-team-roles&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;WoW&amp;rsquo;s holy trinity (tank, healer, damage dealer) is the foundation of every group activity.&lt;/p&gt;&#xA;&lt;p&gt;The tank takes the hits.&#xA;They stand in front of the boss, absorb damage, and keep threat so nobody else gets attacked.&#xA;Without a tank, the group dies instantly.&lt;/p&gt;&#xA;&lt;p&gt;The healer keeps everyone alive.&#xA;They undo damage, cleanse debuffs, and resurrect the dead.&#xA;Without a healer, the tank dies and the group follows.&lt;/p&gt;&#xA;&lt;p&gt;The damage dealers kill the boss.&#xA;They do the actual work of reducing the boss&amp;rsquo;s health to zero.&#xA;Without damage dealers, the encounter never ends.&lt;/p&gt;&#xA;&lt;p&gt;Engineering teams have the same trinity.&lt;/p&gt;&#xA;&lt;p&gt;The incident responder is the tank: they take the hits when production goes down.&#xA;They absorb the pressure, communicate with stakeholders, and keep the problem focused so others can work.&lt;/p&gt;&#xA;&lt;p&gt;The code reviewer is the healer: they catch bugs before they ship, suggest improvements, and mentor through feedback.&#xA;They keep the codebase healthy.&lt;/p&gt;&#xA;&lt;p&gt;The feature developer is the damage dealer: they write the code that ships the product.&#xA;They push the project forward, sprint after sprint.&lt;/p&gt;&#xA;&lt;p&gt;Every role is essential.&#xA;Every role is underappreciated by the other roles.&#xA;Damage dealers complain about long queue times because there aren&amp;rsquo;t enough tanks and healers.&#xA;Tanks and healers complain that damage dealers are replaceable.&lt;/p&gt;&#xA;&lt;p&gt;In software, everyone has complained about both sides.&#xA;Feature developers complain that code review is slow.&#xA;Code reviewers complain that features are rushed.&#xA;&lt;strong&gt;The truth is the same as in WoW: a team needs all three, and disrespecting any role is how the team wipes.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Gear and Item Level: Tools and Experience&#xA;    &lt;div id=&#34;gear-and-item-level-tools-and-experience&#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;#gear-and-item-level-tools-and-experience&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, gear matters.&#xA;A level 60 character in quest greens (common-quality gear from quests) loses to a level 55 character in raid epics (rare-quality gear from raids).&#xA;Item level (the numerical representation of gear quality) determines whether I&amp;rsquo;m invited to groups, accepted into raids, or competitive in PvP.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;But gear is a multiplier, not a substitute.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A player in the best gear who doesn&amp;rsquo;t know their rotation (the optimal sequence of abilities) does less damage than a skilled player in mediocre gear.&#xA;The game rewards both (players need skill to earn gear, and gear amplifies skill) but skill is the foundation.&lt;/p&gt;&#xA;&lt;p&gt;Developer tools and experience are gear.&lt;/p&gt;&#xA;&lt;p&gt;A senior engineer with modern tooling (AI-assisted IDEs, comprehensive test frameworks, powerful debuggers) ships faster than one without.&#xA;But a senior engineer with bad tools still outperforms a junior engineer with the best tools.&lt;/p&gt;&#xA;&lt;p&gt;The mistake teams make is treating tools like gear drops (equip them and instantly get stronger).&lt;/p&gt;&#xA;&lt;p&gt;Tools don&amp;rsquo;t work that way.&#xA;Neither does gear.&lt;/p&gt;&#xA;&lt;p&gt;In WoW, I earn gear through repeated runs, understanding mechanics, and gradual improvement.&#xA;In software, I earn proficiency with tools through repeated use, understanding trade-offs, and gradual improvement.&lt;/p&gt;&#xA;&lt;p&gt;Buying the most expensive IDE doesn&amp;rsquo;t make anyone a better developer.&#xA;Equipping raid gear doesn&amp;rsquo;t make anyone a better player.&#xA;Using the gear effectively does.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Boss Mechanics: Complex Bugs&#xA;    &lt;div id=&#34;boss-mechanics-complex-bugs&#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;#boss-mechanics-complex-bugs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every raid boss in WoW has mechanics.&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t stand in the fire.&#xA;Switch targets when extra enemies spawn.&#xA;Spread out during the explosion.&#xA;Stack up during the healing phase.&#xA;Each mechanic is a rule.&#xA;Break a rule and the group takes damage.&#xA;Break enough rules and the group wipes.&lt;/p&gt;&#xA;&lt;p&gt;Complex bugs have mechanics too.&lt;/p&gt;&#xA;&lt;p&gt;The race condition only triggers under concurrent load.&#xA;The memory leak only appears after 48 hours of uptime.&#xA;The null pointer only occurs when the user has an empty cart and clicks checkout twice.&#xA;Each condition is a rule.&#xA;Satisfy the right combination and the bug reproduces.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;WoW teaches a specific approach to boss mechanics: learn the fight, don&amp;rsquo;t brute-force it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t defeat a boss by throwing myself at it repeatedly, hoping for better luck.&#xA;I study the mechanics, adjust my strategy, and execute precisely.&#xA;A boss that takes 50 wipes to learn might die in a single attempt the next week with the right approach.&lt;/p&gt;&#xA;&lt;p&gt;Debugging complex bugs is the same.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t fix a bug by randomly changing code until it works.&#xA;I read the logs, reproduce the issue, identify the conditions, and fix the root cause.&#xA;A bug that takes a week to diagnose might be fixed in one line once I understand the mechanic.&lt;/p&gt;&#xA;&lt;p&gt;The raid strategy for new bosses: watch a guide, learn the phases, practice the execution.&#xA;The debugging strategy for new bugs: read the stack trace, identify the phase, fix the condition.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Wipe Recovery: Incident Response&#xA;    &lt;div id=&#34;wipe-recovery-incident-response&#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;#wipe-recovery-incident-response&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, a wipe means everyone dies.&lt;/p&gt;&#xA;&lt;p&gt;The boss resets.&#xA;The group runs back.&#xA;The resurrection timer ticks.&#xA;I repair my damaged gear, rebuff, and try again.&lt;/p&gt;&#xA;&lt;p&gt;What separates good raid groups from bad ones isn&amp;rsquo;t whether they wipe; everyone wipes.&#xA;What separates them is how they recover.&lt;/p&gt;&#xA;&lt;p&gt;Bad groups rage in voice chat.&#xA;They blame the healer, the tank, the damage dealers.&#xA;They argue about whose fault it was while the respawn timer counts down.&#xA;They waste five minutes on blame before trying again.&#xA;And they wipe again, because they didn&amp;rsquo;t learn anything.&lt;/p&gt;&#xA;&lt;p&gt;Good groups skip the blame.&#xA;Someone calls out what went wrong (&amp;ldquo;the healer got silenced during the area-of-effect phase&amp;rdquo;) and the group adjusts.&#xA;They try again in thirty seconds.&#xA;They might wipe again, but they wipe to a different mechanic, which means they&amp;rsquo;re learning.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Incident response is wipe recovery.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A production outage is a wipe.&#xA;Something broke.&#xA;Users are affected.&#xA;The system needs to recover.&lt;/p&gt;&#xA;&lt;p&gt;Bad incident responses are blame-heavy.&#xA;&amp;ldquo;Who deployed this?&amp;rdquo;&#xA;&amp;ldquo;Why wasn&amp;rsquo;t this tested?&amp;rdquo;&#xA;&amp;ldquo;Who approved this change?&amp;rdquo;&#xA;The questions are valid but the timing is wrong.&#xA;The team is still in combat.&#xA;Fix the issue first.&#xA;Do the post-mortem later.&lt;/p&gt;&#xA;&lt;p&gt;Good incident responses are diagnostic.&#xA;&amp;ldquo;What changed?&amp;rdquo;&#xA;&amp;ldquo;What&amp;rsquo;s the error rate?&amp;rdquo;&#xA;&amp;ldquo;When did it start?&amp;rdquo;&#xA;The group focuses on understanding and fixing, not assigning fault.&#xA;The post-mortem comes after the system is healthy (in WoW terms, after the boss is dead).&lt;/p&gt;&#xA;&lt;p&gt;The WoW lesson: wipe, learn, adjust, try again.&#xA;The speed of iteration determines the speed of progression.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Guilds: Engineering Organizations&#xA;    &lt;div id=&#34;guilds-engineering-organizations&#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;#guilds-engineering-organizations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, guilds are persistent groups of players who raid together, share resources, and build social bonds.&lt;/p&gt;&#xA;&lt;p&gt;A good guild has clear leadership, a shared culture, and mutual respect.&#xA;Players show up on time, prepared, and committed to the group&amp;rsquo;s success.&#xA;They help each other gear up.&#xA;They share strategies.&#xA;They celebrate kills together.&lt;/p&gt;&#xA;&lt;p&gt;A bad guild has drama.&#xA;Loot disputes.&#xA;Attendance problems.&#xA;Players who show up unprepared, demand carries, and leave when they get what they want.&lt;/p&gt;&#xA;&lt;p&gt;Engineering organizations are guilds.&lt;/p&gt;&#xA;&lt;p&gt;The good ones have clear technical direction, a culture of code review, and mutual respect between teams.&#xA;Engineers share knowledge, mentor juniors, and celebrate launches.&#xA;They invest in shared infrastructure that benefits everyone.&lt;/p&gt;&#xA;&lt;p&gt;The bad ones have politics.&#xA;Turf wars over services.&#xA;Engineers who hoard knowledge and resist review.&#xA;Teams that optimize for their own metrics at the expense of the product.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;WoW players know: the guild determines the experience more than the game.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A great guild makes mediocre content fun.&#xA;A bad guild makes great content miserable.&#xA;The same is true in software.&#xA;A great team makes a boring product interesting.&#xA;A toxic team makes an exciting product unbearable.&lt;/p&gt;&#xA;&lt;p&gt;Choose the guild carefully.&#xA;Or in hiring terms: choose the team carefully.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Auction House: Package Registries&#xA;    &lt;div id=&#34;the-auction-house-package-registries&#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-auction-house-package-registries&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The Auction House is WoW&amp;rsquo;s economy.&#xA;Players buy and sell items (crafting materials, gear, consumables) in an open market.&#xA;Prices fluctuate based on supply and demand.&#xA;Some players spend more time on the Auction House than in raids.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Package registries are the Auction House.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;npm, PyPI, Maven Central, RubyGems: open markets where developers distribute code.&#xA;Most of it is free, but the economics are the same.&#xA;Supply and demand determine which packages thrive.&#xA;Quality varies wildly.&lt;/p&gt;&#xA;&lt;p&gt;WoW teaches caution with the Auction House.&#xA;That cheap flask might be underpriced for a reason.&#xA;That epic bind-on-equip item might be a scam.&lt;/p&gt;&#xA;&lt;p&gt;npm teaches the same caution.&#xA;That package with 10,000 weekly downloads might have a security vulnerability.&#xA;That library with the slick README might be abandonware.&#xA;The &lt;a href=&#34;https://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm&#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=blog.npmjs.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;left-pad incident&lt;/a&gt; was an Auction House crash: a critical commodity disappeared and the market panicked.&lt;/p&gt;&#xA;&lt;p&gt;The WoW player&amp;rsquo;s defense: know the market, check prices, don&amp;rsquo;t buy suspicious deals.&#xA;The developer&amp;rsquo;s defense: audit dependencies, check maintenance history, don&amp;rsquo;t install packages with three stars and no recent commits.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Addons: Developer Tooling&#xA;    &lt;div id=&#34;addons-developer-tooling&#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;#addons-developer-tooling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;WoW&amp;rsquo;s addon system lets players customize their UI and extend their gameplay.&#xA;Damage meters, boss mod warnings, raid frames, loot council tools: the default UI works, but serious players run dozens of addons.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Developer tooling is the addon ecosystem.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Linter, formatter, pre-commit hooks, custom IDE snippets, shell aliases, tmux configurations: the default development environment works, but serious developers customize extensively.&lt;/p&gt;&#xA;&lt;p&gt;In WoW, the player who refuses to install boss mods dies to mechanics they could have seen coming.&#xA;In software, the developer who refuses to use a debugger steps through logs they could have inspected visually.&lt;/p&gt;&#xA;&lt;p&gt;But WoW also teaches addon discipline.&lt;/p&gt;&#xA;&lt;p&gt;Too many addons cause conflicts, crashes, and performance problems.&#xA;Players who install every addon they find spend more time configuring their UI than playing the game.&#xA;The best players use a focused set of addons that solve specific problems.&lt;/p&gt;&#xA;&lt;p&gt;Developer tooling needs the same discipline.&#xA;A developer who spends more time configuring tools than writing code has forgotten the purpose of the tools.&#xA;The best toolchains are minimal, focused, and reliable.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Professions: Side Projects and Tooling&#xA;    &lt;div id=&#34;professions-side-projects-and-tooling&#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;#professions-side-projects-and-tooling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, characters can learn professions: blacksmithing, enchanting, engineering, alchemy.&#xA;These secondary skills let players craft items, enhance gear, and create consumables.&lt;/p&gt;&#xA;&lt;p&gt;Professions don&amp;rsquo;t advance the main quest.&#xA;They don&amp;rsquo;t give experience.&#xA;But they make the main quest easier.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Internal tooling is professions.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;CLI tools, build scripts, code generators, monitoring dashboards: they don&amp;rsquo;t ship features, but they make shipping features faster.&#xA;A team that invests in professions (that builds internal tools) levels faster than one that doesn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;The WoW lesson: max professions early.&lt;/p&gt;&#xA;&lt;p&gt;A blacksmith who starts crafting at level 1 has far better gear than one who starts at max level.&#xA;A team that builds tooling from day one has far better productivity than one that starts tooling after the crunch.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Threat and Aggro: On-Call and Incident Management&#xA;    &lt;div id=&#34;threat-and-aggro-on-call-and-incident-management&#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;#threat-and-aggro-on-call-and-incident-management&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, every NPC enemy has a threat table.&#xA;Whoever generates the most threat gets attacked.&#xA;Tanks generate threat intentionally.&#xA;Damage dealers generate threat as a side effect of dealing damage.&#xA;Healers generate threat by healing.&lt;/p&gt;&#xA;&lt;p&gt;If a damage dealer generates too much threat, the boss turns and kills them.&#xA;This is called pulling aggro.&#xA;It&amp;rsquo;s almost always fatal.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Production incidents have threat tables.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The on-call engineer is the tank.&#xA;They absorb the pressure, pages, alerts, user complaints, Slack messages.&#xA;They hold threat so the rest of the team can work without distraction.&lt;/p&gt;&#xA;&lt;p&gt;But just like in WoW, if someone pulls aggro (if a non-on-call engineer starts making changes in production, or a manager starts demanding real-time updates every thirty seconds) the incident gets worse.&#xA;The wrong person has the boss&amp;rsquo;s attention.&lt;/p&gt;&#xA;&lt;p&gt;The WoW solution: let the tank hold threat.&#xA;The incident solution: let the on-call engineer own the response.&#xA;Everyone else supports (provides context, runs commands when asked, stays available) but doesn&amp;rsquo;t grab aggro.&lt;/p&gt;&#xA;&lt;p&gt;A damage dealer who pulls aggro doesn&amp;rsquo;t just kill themselves.&#xA;The boss might cleave and kill the healer too.&#xA;A developer who pushes an untested fix during an incident doesn&amp;rsquo;t just fail to resolve the issue: they might make it worse and take down another system.&lt;/p&gt;&#xA;&lt;p&gt;Let the tank tank.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Enrage Timers: Deadlines&#xA;    &lt;div id=&#34;enrage-timers-deadlines&#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;#enrage-timers-deadlines&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Many raid bosses have an enrage timer.&#xA;After a fixed duration, the boss enters an enraged state: damage increases dramatically, new mechanics activate, and the raid will wipe within seconds.&lt;/p&gt;&#xA;&lt;p&gt;The message is simple: be good enough, fast enough.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software deadlines are enrage timers.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The quarterly OKR deadline.&#xA;The conference demo.&#xA;The enterprise client&amp;rsquo;s contract renewal date.&#xA;These are fixed points in time after which the consequences escalate sharply.&lt;/p&gt;&#xA;&lt;p&gt;WoW teaches that enrage timers create two strategies: out-gear the fight or out-skill the fight.&lt;/p&gt;&#xA;&lt;p&gt;Out-gearing means coming back with better stats and burning the boss down before the timer.&#xA;In software, out-gearing means adding more engineers, more resources, more hours to hit the deadline.&lt;/p&gt;&#xA;&lt;p&gt;Out-skilling means executing perfectly, minimizing wasted time, and maximizing output with the resources at hand.&#xA;In software, out-skilling means good architecture, clean code, and efficient processes.&lt;/p&gt;&#xA;&lt;p&gt;The WoW meta has swung between both strategies across expansions.&#xA;In software, the meta swings between hiring blitzes and efficiency drives.&#xA;The answer, as always, is both: enough gear to survive, enough skill to execute.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Grinding: Maintenance Work&#xA;    &lt;div id=&#34;grinding-maintenance-work&#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;#grinding-maintenance-work&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, some activities are just grinding.&lt;/p&gt;&#xA;&lt;p&gt;Reputation grinds.&#xA;Daily quests.&#xA;Material farming.&#xA;Running the same dungeon for the thirty-seventh time because the trinket won&amp;rsquo;t drop.&#xA;Nobody enjoys grinding.&#xA;But grinding is how players progress.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software maintenance is grinding.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Updating dependencies.&#xA;Fixing flaky tests.&#xA;Rotating credentials.&#xA;Cleaning up log files.&#xA;Refactoring code that works but is hard to read.&#xA;Nobody launches a software career to update dependency versions.&#xA;But the grind is how the factory keeps running.&lt;/p&gt;&#xA;&lt;p&gt;WoW players who skip the grinding find themselves under-geared when new content drops.&#xA;They can&amp;rsquo;t participate in the new raid because they didn&amp;rsquo;t do the preparatory work.&lt;/p&gt;&#xA;&lt;p&gt;Teams that skip maintenance find themselves unable to ship when new features are needed.&#xA;The dependency tree is two years out of date.&#xA;The test suite takes forty minutes.&#xA;The deployment process is manual and error-prone.&#xA;They can&amp;rsquo;t ship because they didn&amp;rsquo;t do the preparatory work.&lt;/p&gt;&#xA;&lt;p&gt;The grind isn&amp;rsquo;t glamorous.&#xA;But it&amp;rsquo;s what separates the prepared from the unprepared.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Expansions: Major Rewrites&#xA;    &lt;div id=&#34;expansions-major-rewrites&#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;#expansions-major-rewrites&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every few years, WoW releases an expansion.&lt;/p&gt;&#xA;&lt;p&gt;A new continent.&#xA;New systems.&#xA;New mechanics.&#xA;Sometimes, old systems are completely rebuilt.&#xA;Stats are squished.&#xA;Abilities are pruned.&#xA;The talent tree is redesigned.&#xA;The game I knew is fundamentally changed.&lt;/p&gt;&#xA;&lt;p&gt;Some changes are loved.&#xA;Some are hated.&#xA;Every expansion has players who threaten to quit and players who return after years away.&lt;/p&gt;&#xA;&lt;p&gt;Major platform rewrites are expansions.&lt;/p&gt;&#xA;&lt;p&gt;A migration from monolith to microservices.&#xA;A transition from on-premise to cloud.&#xA;A framework upgrade from v2 to v3.&#xA;The system I knew is fundamentally changed.&lt;/p&gt;&#xA;&lt;p&gt;Like WoW expansions, major rewrites are risky.&#xA;They take enormous investment.&#xA;They disrupt existing workflows.&#xA;They might attract new users or they might alienate existing ones.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;WoW&amp;rsquo;s approach to expansions is instructive: the core identity stays the same.&lt;/strong&gt;&#xA;Despite every expansion&amp;rsquo;s changes, WoW is still about questing, dungeons, raids, and gear.&#xA;The systems change.&#xA;The core doesn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;Successful rewrites do the same.&#xA;The core business logic is preserved.&#xA;The deployment infrastructure might change, the data store might change, the frontend framework might change, but the product&amp;rsquo;s purpose stays the same.&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t change what the game is about.&#xA;Change how the game plays.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Heirloom Gear: Reusable Components&#xA;    &lt;div id=&#34;heirloom-gear-reusable-components&#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;#heirloom-gear-reusable-components&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW, heirloom items are special pieces of gear that scale with a character&amp;rsquo;s level.&lt;/p&gt;&#xA;&lt;p&gt;I earn them on my max-level character and mail them to my alts, my alternate characters.&#xA;A level 1 alt wearing heirloom gear is dramatically stronger than a level 1 character in normal gear.&#xA;The investment I made on my main character benefits every alt.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Design systems and shared libraries are heirloom gear.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A component library built by one team makes every subsequent team faster.&#xA;A shared authentication module, a common logging framework, a standardized deployment pipeline: these are investments that benefit the entire organization.&lt;/p&gt;&#xA;&lt;p&gt;The WoW lesson: invest in heirlooms early.&lt;/p&gt;&#xA;&lt;p&gt;Players who acquire full heirloom sets for their alts level twice as fast.&#xA;Organizations that invest in shared infrastructure ship twice as fast.&#xA;The upfront cost is significant (farming the currency to buy heirlooms, or building a design system instead of shipping features) but the compound return is enormous.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Late Game: Software Factories&#xA;    &lt;div id=&#34;the-late-game-software-factories&#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-late-game-software-factories&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In WoW&amp;rsquo;s late game, the most efficient guilds stop running content manually.&lt;/p&gt;&#xA;&lt;p&gt;They sell raid carries, experienced groups that carry less-skilled players through content for gold.&#xA;They run GDKP splits, systematic distribution of loot based on a bidding system.&#xA;They have addon rotations that automate cooldown tracking, buff management, and consumable usage.&lt;/p&gt;&#xA;&lt;p&gt;The game transitions from playing to orchestrating.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software factories are the late game of development.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I stop writing code manually.&#xA;I write specifications that AI agents implement.&#xA;I stop running tests manually.&#xA;I design verification systems that run automatically.&#xA;I stop deploying manually.&#xA;I build pipelines that ship code continuously.&lt;/p&gt;&#xA;&lt;p&gt;Like WoW&amp;rsquo;s late game, running a software factory requires an enormous investment in infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;A guild can&amp;rsquo;t sell raid carries without first clearing the raid dozens of times.&#xA;A team can&amp;rsquo;t run a software factory without first building the CI/CD, the testing infrastructure, the monitoring, and the AI tooling.&lt;/p&gt;&#xA;&lt;p&gt;Guilds that try to skip to carry runs without learning the mechanics get exposed when the buyer notices they&amp;rsquo;re failing.&#xA;Teams that try to skip to software factories without the infrastructure get exposed when the AI-generated code doesn&amp;rsquo;t work, doesn&amp;rsquo;t test, and doesn&amp;rsquo;t deploy.&lt;/p&gt;&#xA;&lt;p&gt;Clear the raid first.&#xA;Then sell the carry.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lesson&#xA;    &lt;div id=&#34;the-lesson&#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-lesson&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;World of Warcraft is a game about progression through coordination.&lt;/p&gt;&#xA;&lt;p&gt;I start alone, killing boars in a starting zone.&#xA;I end in a raid of twenty-five, executing a complex sequence of mechanics that requires every player to perform their role flawlessly.&#xA;The satisfaction isn&amp;rsquo;t in the gear: it&amp;rsquo;s in the coordination.&lt;/p&gt;&#xA;&lt;p&gt;Software development is the same game.&lt;/p&gt;&#xA;&lt;p&gt;We start alone, fixing bugs in a codebase we don&amp;rsquo;t understand.&#xA;We end in organizations of hundreds, shipping systems that require every team to perform their role flawlessly.&#xA;&lt;strong&gt;The satisfaction isn&amp;rsquo;t in the code: it&amp;rsquo;s in the coordination.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In WoW, every expansion resets the gear but not the skill.&#xA;The players who clear content first aren&amp;rsquo;t the ones with the best loot: they&amp;rsquo;re the ones who&amp;rsquo;ve been playing longest, who understand the mechanics deepest, who coordinate most tightly.&lt;/p&gt;&#xA;&lt;p&gt;In software, every project is different but the fundamentals are the same.&#xA;The teams that ship fastest aren&amp;rsquo;t the ones with the most tools: they&amp;rsquo;re the ones who&amp;rsquo;ve been building longest, who understand the trade-offs deepest, who coordinate most tightly.&lt;/p&gt;&#xA;&lt;p&gt;If I&amp;rsquo;m still solo questing, it&amp;rsquo;s time to join a guild.&#xA;If I&amp;rsquo;m still running dungeons, it&amp;rsquo;s time to raid.&#xA;If I&amp;rsquo;m still equipping greens, it&amp;rsquo;s time to earn my epics.&lt;/p&gt;&#xA;&lt;p&gt;For the Horde.&#xA;Or the Alliance.&#xA;Just pick a side.&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;https://tomrochette.com/code-factories-factorio/&#34; &gt;Code Factories: The Factorio Perspective&lt;/a&gt; - the same concept explored through Factorio metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-starcraft/&#34; &gt;Code Factories: The StarCraft Perspective&lt;/a&gt; - the same concept explored through StarCraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-stock-market/&#34; &gt;Code Factories: The Stock Market Perspective&lt;/a&gt; - the same concept explored through stock market metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-rollercoaster-tycoon/&#34; &gt;Code Factories: The RollerCoaster Tycoon Perspective&lt;/a&gt; - the same concept explored through RollerCoaster Tycoon metaphors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Code Factories: Or How I Learned to Stop Worrying and Build the Belt</title>
      <link>https://tomrochette.com/code-factories-factorio/</link>
      <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/code-factories-factorio/</guid>
      <category>software-engineering</category><category>factorio</category><category>metaphors</category><category>ai</category><category>software-factory</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;I land on an alien planet with nothing but a pickaxe and a furnace.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s &lt;a href=&#34;https://factorio.com/&#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=factorio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Factorio&lt;/a&gt;.&#xA;It&amp;rsquo;s also my first day as a software developer.&lt;/p&gt;&#xA;&lt;p&gt;In Factorio, I crash-land and must build a rocket to escape.&#xA;I start by hand-mining iron ore, smelting it in a stone furnace, and crafting simple items.&#xA;Within hours, I&amp;rsquo;ve built conveyor belts that carry ore automatically, assemblers that craft without me, and trains that shuttle materials across the map.&#xA;The factory grows.&#xA;I go from doing everything myself to watching machines do everything for me.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software development is following the same trajectory.&lt;/strong&gt;&#xA;The question is whether I&amp;rsquo;m still hand-mining iron ore.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Belt: The CI/CD Pipeline&#xA;    &lt;div id=&#34;the-belt-the-cicd-pipeline&#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-belt-the-cicd-pipeline&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In Factorio, the conveyor belt is the first automation I build.&#xA;Instead of walking back and forth carrying ore, I lay down a belt and let it move resources while I do something else.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The CI/CD pipeline is the belt.&lt;/strong&gt;&#xA;Every time I push code, tests run, builds compile, deployments ship.&#xA;I don&amp;rsquo;t walk the ore to the furnace anymore.&#xA;The belt carries it.&lt;/p&gt;&#xA;&lt;p&gt;Teams without CI/CD are the players who never unlock belts.&#xA;They&amp;rsquo;re still carrying ore by hand, one commit at a time, manually deploying to servers, manually running tests.&#xA;It works when the team is small.&#xA;It doesn&amp;rsquo;t scale.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Assemblers: The Build System&#xA;    &lt;div id=&#34;assemblers-the-build-system&#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;#assemblers-the-build-system&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;After belts come assembling machines.&#xA;I feed them ingredients and they output a product.&#xA;I don&amp;rsquo;t craft gears by hand anymore (the assembler does it, faster and without mistakes).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Compilers, bundlers, transpilers: these are the assemblers.&lt;/strong&gt;&#xA;I feed them source code and they output runnable software.&#xA;I used to manage dependencies by hand, include scripts individually, and pray the versions matched.&#xA;Now the assembler handles it.&lt;/p&gt;&#xA;&lt;p&gt;The parallel goes deeper.&#xA;In Factorio, I quickly learn that one assembler isn&amp;rsquo;t enough.&#xA;I need a chain: iron ore becomes iron plates, iron plates become gears, gears become transport belts.&#xA;Each step is its own assembler, fed by belts from the previous one.&lt;/p&gt;&#xA;&lt;p&gt;The build pipeline works the same way.&#xA;Source code becomes transpiled code, transpiled code becomes bundled assets, bundled assets become container images, container images become deployed services.&#xA;Each stage is an assembler in a chain.&#xA;If one assembler is slow, the whole chain backs up.&#xA;If one assembler breaks, nothing after it gets built.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Inserters: The Integration Points&#xA;    &lt;div id=&#34;inserters-the-integration-points&#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;#inserters-the-integration-points&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Inserters are the quiet heroes of Factorio.&#xA;They take items from belts and put them into assemblers, furnaces, and chests.&#xA;They&amp;rsquo;re the glue between every machine.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Integration points in software are the inserters.&lt;/strong&gt;&#xA;APIs, webhooks, message queues, event streams: they move data between services.&#xA;Nobody talks about them at conferences.&#xA;But when an inserter stops working in Factorio, the assembler starves.&#xA;When an integration point breaks in production, the service starves.&lt;/p&gt;&#xA;&lt;p&gt;Most production outages aren&amp;rsquo;t caused by a broken assembler.&#xA;They&amp;rsquo;re caused by a broken inserter, a misconfigured webhook, a timed-out API call, a corrupted message in a queue.&#xA;The machines were fine.&#xA;The connection between them failed.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Main Bus: The Monorepo&#xA;    &lt;div id=&#34;the-main-bus-the-monorepo&#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-main-bus-the-monorepo&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;As my Factorio factory grows, I face a critical design decision: how to organize my belts.&#xA;Most experienced players converge on the same solution, the main bus.&lt;/p&gt;&#xA;&lt;p&gt;A main bus is a wide highway of parallel belts carrying every resource I need, running in a straight line across my factory.&#xA;I branch off production lines from the bus, pull what I need, and return byproducts.&#xA;It&amp;rsquo;s not the most space-efficient design.&#xA;It&amp;rsquo;s not the fastest.&#xA;But it&amp;rsquo;s the most understandable, and in a game where my own factory can become incomprehensible, understandability is survival.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;A monorepo is the main bus.&lt;/strong&gt;&#xA;All the code, all the services, all the shared libraries in one place, organized in a predictable structure.&#xA;Teams branch off to build their services, pull shared dependencies from the bus, and contribute back.&#xA;Like Factorio, the monorepo isn&amp;rsquo;t optimal in every dimension.&#xA;But when a new developer joins and needs to understand how everything connects, they follow the bus.&#xA;No archaeology required.&lt;/p&gt;&#xA;&lt;p&gt;Teams that reject the main bus in Factorio end up with spaghetti, belts crisscrossing everywhere, impossible to trace, impossible to modify without breaking something.&#xA;Teams that reject the monorepo end up the same way: dozens of microservices with undocumented dependencies, where nobody knows which service calls which, and changing one API breaks three things nobody knew existed.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Logistics Bots: The AI Agents&#xA;    &lt;div id=&#34;logistics-bots-the-ai-agents&#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;#logistics-bots-the-ai-agents&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At some point in Factorio, I unlock logistic robots.&#xA;Flying drones that carry items anywhere in my network.&#xA;They don&amp;rsquo;t need belts.&#xA;They don&amp;rsquo;t follow paths.&#xA;I request an item, and a bot brings it.&lt;/p&gt;&#xA;&lt;p&gt;AI coding agents are the logistics bots.&#xA;I ask for a function, and the agent writes it.&#xA;I ask for tests, and the agent generates them.&#xA;I ask for a bug investigation, and the agent traces the stack.&#xA;They don&amp;rsquo;t need me to lay down a belt first.&#xA;They go directly to the source and bring back what I need.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;But here&amp;rsquo;s what Factorio teaches about bots: they don&amp;rsquo;t replace belts.&lt;/strong&gt;&#xA;Players who try to run everything on bots discover that bots have a capacity limit.&#xA;When the network gets busy, bots queue up, delivery times spike, and the factory starves.&#xA;The best factories use bots for the weird, one-off requests and keep belts for the high-throughput, predictable flows.&lt;/p&gt;&#xA;&lt;p&gt;The best engineering teams do the same.&#xA;AI agents handle the ad-hoc tasks, the one-off scripts, the bug investigations, the documentation updates.&#xA;But the core pipeline (the build system, the CI/CD, the deployment process) runs on belts.&#xA;Predictable.&#xA;Reliable.&#xA;Fast.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Ratios: The System Architecture&#xA;    &lt;div id=&#34;the-ratios-the-system-architecture&#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-ratios-the-system-architecture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In Factorio, every recipe has precise ratios.&#xA;To produce one science pack per second, I need exactly 1.25 assemblers making gears and 0.8 assemblers making copper cable.&#xA;The math is deterministic.&#xA;If I get the ratios wrong, I get bottlenecks.&#xA;One belt backs up while another starves.&#xA;Resources pile up where they&amp;rsquo;re not needed and run dry where they are.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;System architecture has the same dynamics, just less precise.&lt;/strong&gt;&#xA;Every service has throughput limits.&#xA;Every database has connection pool limits.&#xA;Every queue has a maximum depth.&#xA;If the authentication service can handle 100 requests per second but the API gateway is sending 200, there&amp;rsquo;s a bottleneck.&#xA;The requests pile up.&#xA;Timeouts cascade.&#xA;Users see errors.&lt;/p&gt;&#xA;&lt;p&gt;Factorio players solve ratio problems with calculators and spreadsheets.&#xA;They plan their factory before they build it.&#xA;Software engineers solve the same problems with load testing and capacity planning, or they should.&#xA;Too many teams build first and measure later, then wonder why production is slow.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Biters: The Production Incidents&#xA;    &lt;div id=&#34;biters-the-production-incidents&#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;#biters-the-production-incidents&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The alien natives in Factorio are called biters.&#xA;They attack the factory in increasing waves, drawn by the pollution the machines produce.&#xA;The more I build, the more they attack.&#xA;I can ignore them for a while, but eventually they&amp;rsquo;ll overwhelm my defenses.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Production incidents are the biters.&lt;/strong&gt;&#xA;They come in waves, drawn by the complexity of the system.&#xA;The more services I deploy, the more dependencies I add, the more incidents I attract.&#xA;I can ignore them for a while, patch the symptom, restart the service, move on.&#xA;But eventually they&amp;rsquo;ll overwhelm me.&lt;/p&gt;&#xA;&lt;p&gt;In Factorio, the solution isn&amp;rsquo;t to stop building.&#xA;It&amp;rsquo;s to build defenses: walls, turrets, artillery.&#xA;In software, the solution isn&amp;rsquo;t to stop deploying.&#xA;It&amp;rsquo;s to build defenses: monitoring, alerting, automatic rollback, chaos engineering.&lt;/p&gt;&#xA;&lt;p&gt;The best Factorio players don&amp;rsquo;t just react to biter attacks.&#xA;They proactively clear nests before they evolve.&#xA;The best engineering teams don&amp;rsquo;t just react to incidents.&#xA;They proactively eliminate failure modes before they cause outages.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Throughput vs Latency: The Eternal Trade-off&#xA;    &lt;div id=&#34;throughput-vs-latency-the-eternal-trade-off&#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;#throughput-vs-latency-the-eternal-trade-off&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Factorio players eventually discover that throughput and latency are different things.&#xA;A belt with 100 items per minute has high throughput but items take time to travel from one end to the other.&#xA;A bot delivery is low throughput (one item at a time) but low latency (it goes straight there).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Microservices vs monoliths is the same trade-off.&lt;/strong&gt;&#xA;A monolith has high throughput; everything runs in the same process, no network calls.&#xA;But change latency is high; I deploy the whole thing even if I changed one function.&#xA;Microservices have low change latency; I deploy one service independently.&#xA;But throughput suffers from network overhead, serialization, and distributed coordination.&lt;/p&gt;&#xA;&lt;p&gt;Factorio doesn&amp;rsquo;t judge me for choosing bots over belts or belts over bots.&#xA;It just shows me the consequences.&#xA;Software architecture should work the same way.&#xA;I choose my trade-offs, but I stay clear about what I&amp;rsquo;m trading.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Rocket: Shipping&#xA;    &lt;div id=&#34;the-rocket-shipping&#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-rocket-shipping&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The goal of Factorio is to launch a rocket.&#xA;Everything I build (every belt, every assembler, every defense) exists to launch that rocket.&#xA;The goal is easy to forget.&#xA;Players spend hundreds of hours optimizing a single belt intersection, perfecting a circuit network, or making their factory look pretty.&#xA;Meanwhile, the rocket sits unbuilt.&lt;/p&gt;&#xA;&lt;p&gt;Software teams do the same thing.&#xA;They refactor code that works fine.&#xA;They migrate to the latest framework.&#xA;They rebuild systems that don&amp;rsquo;t need rebuilding.&#xA;Meanwhile, the product sits unshipped.&#xA;The users sit unserved.&#xA;The business sits unimproved.&lt;/p&gt;&#xA;&lt;p&gt;Factorio teaches a simple lesson: the factory exists to launch the rocket, not the other way around.&#xA;&lt;strong&gt;The code exists to ship the product.&lt;/strong&gt;&#xA;Every optimization that doesn&amp;rsquo;t serve the product is a belt to nowhere.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Map: The Unknown Unknowns&#xA;    &lt;div id=&#34;the-map-the-unknown-unknowns&#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-map-the-unknown-unknowns&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When I start Factorio, the map is covered in fog.&#xA;I don&amp;rsquo;t know where the iron is, where the oil is, or where the biters are nesting.&#xA;I explore by walking into the fog, revealing terrain piece by piece.&#xA;Sometimes I find a massive ore patch right next to my base.&#xA;Sometimes I walk into a biter nest and die.&lt;/p&gt;&#xA;&lt;p&gt;Software development is exploring a fog of war.&#xA;I don&amp;rsquo;t know what the users want until I ship.&#xA;I don&amp;rsquo;t know what the legacy system does until I try to change it.&#xA;I don&amp;rsquo;t know what the dependency actually does until it breaks in production.&lt;/p&gt;&#xA;&lt;p&gt;The Factorio solution to the fog of war is radar.&#xA;I build radar stations that slowly reveal the map around them.&#xA;Not all at once, but gradually, giving me visibility without requiring me to walk everywhere.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Observability is the radar.&lt;/strong&gt;&#xA;Logging, metrics, tracing, dashboards: they don&amp;rsquo;t eliminate the unknown, but they reveal it gradually.&#xA;I can&amp;rsquo;t see everything.&#xA;But I can see enough to make good decisions.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pollution: Technical Debt&#xA;    &lt;div id=&#34;pollution-technical-debt&#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;#pollution-technical-debt&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every machine in Factorio produces pollution.&#xA;Pollution spreads across the map and triggers biter attacks.&#xA;More machines, more pollution, more attacks.&#xA;Pollution is the cost of growth.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Technical debt is pollution.&lt;/strong&gt;&#xA;Every shortcut, every hack, every &amp;ldquo;we&amp;rsquo;ll fix it later&amp;rdquo; generates debt.&#xA;Debt spreads through the codebase, making changes harder, triggering bugs, slowing development.&#xA;More code, more debt, more incidents.&lt;/p&gt;&#xA;&lt;p&gt;I can&amp;rsquo;t eliminate pollution in Factorio without eliminating production.&#xA;I can&amp;rsquo;t eliminate technical debt without eliminating software.&#xA;The key is management: build efficiently, clean up regularly, and invest in infrastructure that reduces the debt per feature shipped.&#xA;Electric furnaces produce less pollution than steel furnaces.&#xA;Good abstractions produce less technical debt than bad ones.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Late Game: Software Factories&#xA;    &lt;div id=&#34;the-late-game-software-factories&#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-late-game-software-factories&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In the late game of Factorio, something interesting happens.&#xA;I stop building things myself entirely.&#xA;Instead, I design blueprints, templates for entire sections of factory.&#xA;I place a blueprint and construction bots build the whole thing automatically.&#xA;I&amp;rsquo;m no longer an assembler.&#xA;I&amp;rsquo;m an architect.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software factories are the late game of software development.&lt;/strong&gt;&#xA;I don&amp;rsquo;t write code.&#xA;I write specifications.&#xA;I don&amp;rsquo;t review code.&#xA;I design verification systems.&#xA;I don&amp;rsquo;t debug.&#xA;I design healing systems.&lt;/p&gt;&#xA;&lt;p&gt;Like Factorio&amp;rsquo;s late game, the software factory requires an enormous upfront investment.&#xA;I need to have built the belts, the assemblers, the bots, the logistics network before I can stamp down blueprints.&#xA;Software factories require CI/CD, testing infrastructure, monitoring, and AI agents before they can operate autonomously.&lt;/p&gt;&#xA;&lt;p&gt;Players who try to skip to blueprints in Factorio without building the infrastructure first find that their construction bots can&amp;rsquo;t reach the build site, don&amp;rsquo;t have materials, or build the wrong thing.&#xA;Teams that try to skip to software factories without the infrastructure find that their AI agents produce broken code, can&amp;rsquo;t deploy, and create more problems than they solve.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Spidertron: Autonomous Agents&#xA;    &lt;div id=&#34;the-spidertron-autonomous-agents&#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-spidertron-autonomous-agents&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The Spidertron is Factorio&amp;rsquo;s ultimate vehicle.&#xA;A walking base that I can remote-control, equip with rockets, and send into dangerous territory.&#xA;It&amp;rsquo;s the end result of everything I&amp;rsquo;ve built: it uses the tech I researched, the weapons I crafted, the logistics network I established.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Autonomous AI coding agents are the Spidertron of software development.&lt;/strong&gt;&#xA;They roam the codebase, make changes, run tests, deploy code, all while I watch from the map.&#xA;But like the Spidertron, they&amp;rsquo;re only as good as the infrastructure behind them.&#xA;A Spidertron without researched weapons is a walking target.&#xA;An AI agent without a testing infrastructure is a liability.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lesson&#xA;    &lt;div id=&#34;the-lesson&#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-lesson&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Factorio is a game about building something that builds itself.&#xA;I start by doing everything manually.&#xA;I end by watching machines do everything for me.&#xA;The satisfaction isn&amp;rsquo;t in the automation itself: it&amp;rsquo;s in designing a system that works, that&amp;rsquo;s elegant, that grows.&lt;/p&gt;&#xA;&lt;p&gt;Software development is the same game.&#xA;I start by writing code manually.&#xA;I end by designing systems that write, test, and deploy code without me.&#xA;&lt;strong&gt;The satisfaction isn&amp;rsquo;t in the code: it&amp;rsquo;s in the factory.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If I&amp;rsquo;m still hand-crafting every iron gear, it&amp;rsquo;s time to build my first assembler.&#xA;If I&amp;rsquo;m still carrying ore by hand, it&amp;rsquo;s time to lay down a belt.&#xA;If I&amp;rsquo;m still reviewing every line of code myself, it&amp;rsquo;s time to build a verification system.&lt;/p&gt;&#xA;&lt;p&gt;The factory must grow.&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;https://tomrochette.com/code-factories-starcraft/&#34; &gt;Code Factories: The StarCraft Perspective&lt;/a&gt; - the same concept explored through StarCraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-wow/&#34; &gt;Code Factories: The World of Warcraft Perspective&lt;/a&gt; - the same concept explored through World of Warcraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-stock-market/&#34; &gt;Code Factories: The Stock Market Perspective&lt;/a&gt; - the same concept explored through stock market metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-rollercoaster-tycoon/&#34; &gt;Code Factories: The RollerCoaster Tycoon Perspective&lt;/a&gt; - the same concept explored through RollerCoaster Tycoon metaphors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Code Factories: The StarCraft Perspective</title>
      <link>https://tomrochette.com/code-factories-starcraft/</link>
      <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/code-factories-starcraft/</guid>
      <category>software-engineering</category><category>starcraft</category><category>metaphors</category><category>ai</category><category>software-factory</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;You start with four workers, a command center, and fog of war in every direction.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s StarCraft.&#xA;It&amp;rsquo;s also your first day at a startup.&lt;/p&gt;&#xA;&lt;p&gt;In &lt;a href=&#34;https://en.wikipedia.org/wiki/StarCraft&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;StarCraft&lt;/a&gt;, you command one of three races (Terran, Protoss, or Zerg), each with radically different economies, armies, and strategies.&#xA;You gather minerals and vespene gas, build structures, research upgrades, and produce units.&#xA;You scout the opponent, react to their strategy, and try to win through superior economy, tactics, or both.&#xA;The clock never stops.&#xA;The other player never waits.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Building a software organization is the same game with different units.&lt;/strong&gt;&#xA;The question is which race you&amp;rsquo;re playing and whether you know it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;APM: Developer Productivity&#xA;    &lt;div id=&#34;apm-developer-productivity&#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;#apm-developer-productivity&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, &lt;a href=&#34;https://en.wikipedia.org/wiki/Actions_per_minute&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;APM (actions per minute)&lt;/a&gt; is the raw measure of how fast a player can issue commands.&#xA;Pros sustain 300+ APM over games that last 20 to 40 minutes.&#xA;Beginners hover around 30.&lt;/p&gt;&#xA;&lt;p&gt;But high APM doesn&amp;rsquo;t win games.&#xA;Efficient APM does.&#xA;A pro spends most of those actions on macro (building workers, expanding, producing units) and only the necessary actions on micro, controlling individual units in combat.&#xA;A beginner wastes APM clicking the same unit six times or panicking during a fight.&lt;/p&gt;&#xA;&lt;p&gt;Lines of code per day is the APM of software development.&#xA;It measures activity, not impact.&#xA;A developer who writes 500 lines in a day isn&amp;rsquo;t necessarily more productive than one who writes 50.&#xA;The 50-line developer might have deleted 200 lines, simplified an abstraction, or prevented a week of debugging.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The StarCraft lesson: optimize for effective actions, not total actions.&lt;/strong&gt;&#xA;In code, optimize for value shipped, not code written.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Worker Production: Hiring&#xA;    &lt;div id=&#34;worker-production-hiring&#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;#worker-production-hiring&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, the single most important thing a new player can learn is to never stop making workers.&#xA;Workers gather resources.&#xA;Resources fund everything else: units, buildings, upgrades.&#xA;A player who stops producing workers at the five-minute mark will be economically crushed by one who didn&amp;rsquo;t, regardless of army composition or tactical skill.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Hiring is your worker production.&lt;/strong&gt;&#xA;Every engineer you add increases your resource gathering rate, the rate at which your team can design, build, and ship software.&#xA;A team that stops hiring after its founding engineers will be outpaced by a team that kept recruiting, even if the founding team was brilliant.&lt;/p&gt;&#xA;&lt;p&gt;But StarCraft also teaches that worker production has a ceiling.&#xA;You can only send so many workers to a mineral patch before they queue up and waste time.&#xA;In software, the ceiling is communication overhead.&#xA;Add too many engineers to a project and they spend more time coordinating than building.&#xA;Brooks said it decades ago in &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Mythical_Man-Month&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The Mythical Man-Month&lt;/a&gt;: adding people to a late project makes it later.&#xA;StarCraft players learn it every game: there&amp;rsquo;s an optimal number of workers per base, and exceeding it wastes resources.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Expanding: New Teams and Services&#xA;    &lt;div id=&#34;expanding-new-teams-and-services&#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;#expanding-new-teams-and-services&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, one base isn&amp;rsquo;t enough.&#xA;The mineral patches deplete.&#xA;Gas geysers run dry.&#xA;To keep growing, you must expand, build a new command center, nexus, or hatchery at a new resource location.&lt;/p&gt;&#xA;&lt;p&gt;Each expansion is a bet.&#xA;It costs resources to build.&#xA;It takes time to become profitable.&#xA;And the expansion is vulnerable: spread across the map, harder to defend, exposed to attack.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Starting a new team or service is expanding.&lt;/strong&gt;&#xA;You invest resources (hiring, onboarding, infrastructure) in exchange for future throughput.&#xA;The first team&amp;rsquo;s codebase, like a mineral patch, eventually becomes congested.&#xA;Too many engineers working on the same service creates merge conflicts, deployment bottlenecks, and architectural compromises.&#xA;A new team with its own service spreads the load.&lt;/p&gt;&#xA;&lt;p&gt;But like StarCraft expansions, new teams are vulnerable.&#xA;They don&amp;rsquo;t yet know the codebase, the domain, or the culture.&#xA;They&amp;rsquo;ll make mistakes the first team already learned from.&#xA;They&amp;rsquo;ll build things that duplicate or conflict with existing systems.&#xA;And they require protection (mentoring, clear interfaces, architectural guidance) or they&amp;rsquo;ll be overrun by the complexity the first team already tamed.&lt;/p&gt;&#xA;&lt;p&gt;StarCraft players know: expand when your main base is saturated, not when you&amp;rsquo;re under attack.&#xA;Software leaders should know: create new teams when the current team is at capacity, not when the project is already late.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Supply Cap: Organizational Scaling&#xA;    &lt;div id=&#34;the-supply-cap-organizational-scaling&#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-supply-cap-organizational-scaling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, you can&amp;rsquo;t just build an infinite army.&#xA;Every unit costs supply.&#xA;Terran supply depots, Protoss pylons, Zerg overlords: each race has its own mechanism for increasing the supply cap.&#xA;If you hit the cap, production halts.&#xA;Your factories, barracks, and starports sit idle until you build more supply.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Organizational scaling has supply caps too.&lt;/strong&gt;&#xA;They just aren&amp;rsquo;t as explicit.&lt;/p&gt;&#xA;&lt;p&gt;The first cap is communication.&#xA;A team of 5 people has 10 communication channels.&#xA;A team of 15 has 105.&#xA;At some point, people spend more time talking than building, and adding another engineer actually decreases output.&lt;/p&gt;&#xA;&lt;p&gt;The second cap is architecture.&#xA;A monolith can support a certain number of contributors before merge conflicts, test suite times, and deployment coordination become unbearable.&#xA;You need to split the monolith (build a pylon, if you will) to increase the cap.&lt;/p&gt;&#xA;&lt;p&gt;The third cap is process.&#xA;A small team doesn&amp;rsquo;t need sprint planning, architecture review boards, or release managers.&#xA;A large team does.&#xA;Each process is a supply depot: it costs resources to build but increases the number of people who can work together productively.&lt;/p&gt;&#xA;&lt;p&gt;Teams that ignore the supply cap wonder why their army is small despite having plenty of factories.&#xA;The factories are there.&#xA;The supply isn&amp;rsquo;t.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Build Orders: Project Plans&#xA;    &lt;div id=&#34;build-orders-project-plans&#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;#build-orders-project-plans&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every StarCraft game begins with a build order, a planned sequence of actions for the first few minutes.&#xA;Build a supply depot at 10 supply.&#xA;A barracks at 12.&#xA;A refinery at 13.&#xA;Expand at the natural at 20.&lt;/p&gt;&#xA;&lt;p&gt;Build orders aren&amp;rsquo;t rigid scripts.&#xA;They&amp;rsquo;re opening principles, a sequence that has been proven to lead to a strong mid-game position.&#xA;Players deviate when they scout something unexpected, but they always have a plan to return to.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Project plans are build orders.&lt;/strong&gt;&#xA;You don&amp;rsquo;t start building features randomly.&#xA;You have a sequence: set up the repository, configure CI/CD, build the core domain model, add the API layer, implement authentication, deploy to staging.&#xA;The order matters because each step depends on the previous one.&lt;/p&gt;&#xA;&lt;p&gt;But just like in StarCraft, the build order only covers the opening.&#xA;After the first few minutes, the game becomes dynamic.&#xA;You react to what you see.&#xA;You adapt to the opponent&amp;rsquo;s strategy.&#xA;The build order gave you a strong position: it didn&amp;rsquo;t win the game.&lt;/p&gt;&#xA;&lt;p&gt;Agile methodology is the StarCraft mid-game.&#xA;You&amp;rsquo;ve executed your build order; the project is set up, the architecture is sound.&#xA;Now you play reactively, adjusting to user feedback, market changes, and technical surprises.&#xA;The build order got you here.&#xA;Reaction wins the game.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Scouting: User Research&#xA;    &lt;div id=&#34;scouting-user-research&#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;#scouting-user-research&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, if you don&amp;rsquo;t scout, you die.&#xA;Period.&#xA;A player who builds the wrong units because they didn&amp;rsquo;t know the opponent was going air gets crushed.&#xA;A player who expands into a choke point the opponent already controls loses the expansion.&#xA;Information is more valuable than any unit.&lt;/p&gt;&#xA;&lt;p&gt;User research is scouting.&#xA;If you don&amp;rsquo;t talk to users, watch them use your product, read their support tickets, and analyze their behavior, you&amp;rsquo;re building blind.&#xA;You might be building the perfect counter to a strategy the opponent isn&amp;rsquo;t using.&#xA;You might be expanding into territory nobody wants.&lt;/p&gt;&#xA;&lt;p&gt;StarCraft players send a worker to scout at supply 13.&#xA;They sacrifice a unit to gain information.&#xA;Good software teams do the same: they sacrifice development time to talk to users, run usability tests, and analyze metrics.&#xA;&lt;strong&gt;The cost of scouting is always less than the cost of building the wrong thing.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Tech Trees: Technology Choices&#xA;    &lt;div id=&#34;tech-trees-technology-choices&#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;#tech-trees-technology-choices&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every StarCraft race has a technology tree.&#xA;You can&amp;rsquo;t build battlecruisers without a starport, a fusion core, and an armory.&#xA;You can&amp;rsquo;t research stimpack without a tech lab on your barracks.&#xA;Each technology unlocks new capabilities but requires investment in the prerequisite technologies.&lt;/p&gt;&#xA;&lt;p&gt;Technology stacks are tech trees.&#xA;You can&amp;rsquo;t deploy containers without a container runtime.&#xA;You can&amp;rsquo;t run Kubernetes without understanding networking, DNS, and certificate management.&#xA;You can&amp;rsquo;t implement real-time features without WebSockets, which requires understanding persistent connections, which requires understanding your load balancer&amp;rsquo;s timeout settings.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The StarCraft lesson about tech trees is simple: don&amp;rsquo;t tech too fast and don&amp;rsquo;t tech too wide.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Teching too fast means skipping army production to rush advanced technology.&#xA;In StarCraft, this loses to an early attack.&#xA;In software, this means spending months building infrastructure while shipping nothing.&#xA;The business can&amp;rsquo;t wait for your perfect Kubernetes setup.&#xA;Ship something with simpler tech and upgrade later.&lt;/p&gt;&#xA;&lt;p&gt;Teching too wide means researching every upgrade simultaneously.&#xA;In StarCraft, this commits resources to too many upgrades at once and leaves you weak everywhere.&#xA;In software, this means adopting every new framework, database, and tooling option.&#xA;Your team can&amp;rsquo;t be experts in everything.&#xA;Pick a path through the tech tree and commit to it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Unit Composition: Team Composition&#xA;    &lt;div id=&#34;unit-composition-team-composition&#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;#unit-composition-team-composition&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;In StarCraft, army composition matters more than army size.&lt;/strong&gt;&#xA;A player with 50 marines loses to a player with 10 banelings and 20 zerglings.&#xA;A player with 20 stalkers loses to a player with 10 immortals.&#xA;Each unit has strengths and weaknesses, and the right combination is stronger than any individual unit.&lt;/p&gt;&#xA;&lt;p&gt;Team composition works the same way.&#xA;Ten frontend developers can&amp;rsquo;t build a backend service.&#xA;Ten senior engineers can&amp;rsquo;t ship quickly without junior engineers handling the simpler tasks.&#xA;Ten generalists can&amp;rsquo;t match a team with specialized expertise in security, performance, and DevOps.&lt;/p&gt;&#xA;&lt;p&gt;The ideal StarCraft army mixes unit types that cover each other&amp;rsquo;s weaknesses.&#xA;Marines deal high damage but are fragile; medivacs keep them alive.&#xA;Zealots are strong in close combat but slow; sentries create force fields to trap enemies.&lt;/p&gt;&#xA;&lt;p&gt;The ideal software team mixes skills the same way.&#xA;Backend engineers build the services.&#xA;Frontend engineers build the interfaces.&#xA;DevOps engineers build the infrastructure.&#xA;Security engineers build the defenses.&#xA;No single role can win the game alone.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Multitasking: Context Switching&#xA;    &lt;div id=&#34;multitasking-context-switching&#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;#multitasking-context-switching&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;StarCraft demands multitasking.&#xA;While your army fights at the front, your economy must keep producing at home.&#xA;While you scout the enemy, your upgrades must keep researching.&#xA;Neglect one task and the whole performance suffers.&lt;/p&gt;&#xA;&lt;p&gt;Software development demands the same.&#xA;While you write code, production issues arise.&#xA;While you debug a problem, meetings are scheduled.&#xA;While you plan the next sprint, the current sprint falls behind.&lt;/p&gt;&#xA;&lt;p&gt;StarCraft players learn to use control groups, binding units and buildings to hotkeys so they can jump between tasks instantly.&#xA;Press 1, manage the army.&#xA;Press 2, build workers.&#xA;Press 3, research upgrades.&#xA;The hotkeys don&amp;rsquo;t reduce the number of tasks, but they reduce the cost of switching between them.&lt;/p&gt;&#xA;&lt;p&gt;In software, your control groups are your tools and workflows.&#xA;A good IDE setup lets you switch between files instantly.&#xA;A good terminal setup lets you switch between environments instantly.&#xA;A good project management tool lets you switch between tasks instantly.&lt;/p&gt;&#xA;&lt;p&gt;But StarCraft also teaches that there&amp;rsquo;s a hard limit to multitasking.&#xA;Even pros can&amp;rsquo;t manage five simultaneous drops, a base race, and an upgrade timing all at once.&#xA;They prioritize.&#xA;They let minor fights play out automatically while they manage the critical ones.&lt;/p&gt;&#xA;&lt;p&gt;Software developers need to learn the same lesson.&#xA;&lt;strong&gt;You can&amp;rsquo;t context-switch between five tasks and do any of them well.&lt;/strong&gt;&#xA;Prioritize the critical path.&#xA;Let minor tasks wait.&#xA;Not everything is a drop in your mineral line.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Creep Spread: Codebase Quality&#xA;    &lt;div id=&#34;creep-spread-codebase-quality&#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;#creep-spread-codebase-quality&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The Zerg provide the clearest metaphor for codebase quality.&#xA;Creep is the organic substance that Zerg structures generate, spreading across the ground.&#xA;Zerg units move faster on creep.&#xA;Zerg structures can only be built on creep.&#xA;Creep tumors extend the network, and a well-spread creep carpet gives the Zerg player vision, mobility, and territorial control.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Codebase quality is creep spread.&lt;/strong&gt;&#xA;Good test coverage, clear documentation, consistent naming conventions, and well-defined interfaces: these are your creep tumors.&#xA;Each one extends the area where future development moves faster.&#xA;New engineers onboard more quickly on a well-documented codebase.&#xA;Refactoring is safer with comprehensive tests.&#xA;Features ship faster when the interfaces are clean.&lt;/p&gt;&#xA;&lt;p&gt;Terran and Protoss players hate creep.&#xA;It gives the Zerg vision and speed in territory that should be neutral.&#xA;Technical debt is the reverse: it gives bugs and confusion territory that should be clean.&#xA;Every hardcoded value, every undocumented assumption, every god class is an area where development slows down and more bugs appear.&lt;/p&gt;&#xA;&lt;p&gt;The Zerg lesson: invest in creep spread early and often.&#xA;A Zerg player who tumors aggressively in the first five minutes controls the map in the tenth.&#xA;A team that invests in code quality early ships faster in the long run.&#xA;Not because quality is its own reward, but because quality compounds.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Ladder Anxiety: Imposter Syndrome&#xA;    &lt;div id=&#34;ladder-anxiety-imposter-syndrome&#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;#ladder-anxiety-imposter-syndrome&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every StarCraft player knows ladder anxiety.&#xA;That feeling before clicking the &amp;ldquo;Find Match&amp;rdquo; button, the fear of losing, of being exposed as a fraud, of dropping a league and having everyone see.&lt;/p&gt;&#xA;&lt;p&gt;The anxiety is universal.&#xA;Grandmasters feel it.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sean_Plott&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Day9&lt;/a&gt; famously talked about how terrified he was to play his placement matches, and he was one of the best players in the world.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Imposter syndrome in software is ladder anxiety.&lt;/strong&gt;&#xA;The fear of submitting a pull request because your code might be wrong.&#xA;The fear of speaking up in an architecture meeting because your idea might be bad.&#xA;The fear of applying for a senior role because you might not be good enough.&lt;/p&gt;&#xA;&lt;p&gt;StarCraft players overcome ladder anxiety the same way every time: by playing.&#xA;Not by studying build orders.&#xA;Not by watching replays.&#xA;By clicking the button and playing the game.&#xA;Losses stop hurting after the hundredth one.&#xA;Wins start feeling earned.&lt;/p&gt;&#xA;&lt;p&gt;Software developers overcome imposter syndrome the same way.&#xA;Submit the pull request.&#xA;Speak up in the meeting.&#xA;Apply for the role.&#xA;The fear doesn&amp;rsquo;t go away.&#xA;You just learn that it&amp;rsquo;s not predictive of outcome.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cheese: Shortcuts and Hacks&#xA;    &lt;div id=&#34;cheese-shortcuts-and-hacks&#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;#cheese-shortcuts-and-hacks&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every StarCraft player has been cheesed.&#xA;A cannon rush in your mineral line.&#xA;A proxy barracks outside your base.&#xA;A six-pool of zerglings that arrives before you have any defense.&lt;/p&gt;&#xA;&lt;p&gt;Cheese strategies are high-risk, high-reward.&#xA;They win quickly against unprepared opponents and lose decisively against prepared ones.&#xA;Nobody wins a tournament with cheese alone.&#xA;But everyone encounters it, and everyone has to learn to defend against it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Technical shortcuts are cheese.&lt;/strong&gt;&#xA;Copy-pasting code from Stack Overflow without understanding it.&#xA;Deploying directly to production without tests.&#xA;Hardcoding a configuration value because you&amp;rsquo;re in a hurry.&lt;/p&gt;&#xA;&lt;p&gt;Like StarCraft cheese, technical shortcuts work in the short term.&#xA;The code runs.&#xA;The feature ships.&#xA;The deadline is met.&#xA;But the opponent (in this case, future you or your teammate) is unprepared for the consequences.&#xA;The hardcoded value becomes a production incident.&#xA;The untested code breaks in an edge case.&#xA;The copy-pasted solution has a security vulnerability.&lt;/p&gt;&#xA;&lt;p&gt;StarCraft players learn to scout for cheese early and defend against it.&#xA;Software developers need to do the same.&#xA;Code review catches shortcuts before they merge.&#xA;Linting and static analysis catch them before they deploy.&#xA;The defense doesn&amp;rsquo;t have to be elaborate, just present.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Late Game: Software Factories&#xA;    &lt;div id=&#34;the-late-game-software-factories&#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-late-game-software-factories&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In the late game of StarCraft, something shifts.&#xA;Individual battles matter less than economy and production.&#xA;The player with more bases, more production facilities, and better upgrades wins through attrition.&#xA;They replace losses faster.&#xA;They tech-switch faster.&#xA;They recover from setbacks faster.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Software factories are the late game of software development.&lt;/strong&gt;&#xA;Individual code contributions matter less than the systems that produce them.&#xA;The team with better CI/CD, better testing infrastructure, better monitoring, and better AI tooling ships faster.&#xA;They recover from incidents faster.&#xA;They adapt to changing requirements faster.&#xA;They replace departing engineers faster.&lt;/p&gt;&#xA;&lt;p&gt;In StarCraft, the late game rewards the player who invested in economy during the early and mid game.&#xA;The player who cut workers to build a bigger army might win a battle, but they lose the war.&#xA;In software, the late game rewards the team that invested in infrastructure when it would have been faster to just ship features.&#xA;The team that skipped tests to hit a deadline might ship faster this quarter, but they slow down every quarter after.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Playing the Race: Choosing Your Stack&#xA;    &lt;div id=&#34;playing-the-race-choosing-your-stack&#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;#playing-the-race-choosing-your-stack&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, race selection defines everything.&#xA;Terran is positional and mechanical (siege tanks, bunkers, planetary fortresses).&#xA;Protoss is elegant and powerful (expensive units, warp-in mechanics, force fields).&#xA;Zerg is swarm-like and reactive (expendable units, rapid reinforcement, creep spread).&lt;/p&gt;&#xA;&lt;p&gt;Each race rewards a different mindset.&#xA;A player who tries to play Terran like Zerg (aggressive, expendable, swarm-like) loses.&#xA;A player who tries to play Protoss like Terran (defensive, positional, slow) loses.&#xA;You have to play your race&amp;rsquo;s strengths.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Technology stacks are races.&lt;/strong&gt;&#xA;A Python/Django stack rewards rapid development and convention-over-configuration (Protoss-like elegance).&#xA;A Java/Spring stack rewards enterprise robustness and type safety (Terran-like positional strength).&#xA;A Go microservices stack rewards simplicity, concurrency, and operational efficiency (Zerg-like speed and resilience).&lt;/p&gt;&#xA;&lt;p&gt;Teams that try to fight their stack&amp;rsquo;s nature lose.&#xA;Using Python for high-performance computing.&#xA;Using Java for rapid prototyping.&#xA;Using Go for enterprise business logic.&#xA;Each can work, but each is fighting the race&amp;rsquo;s design.&lt;/p&gt;&#xA;&lt;p&gt;Play your race.&#xA;Or in StarCraft terms: pick Random, learn all three, and choose the one that fits the game you&amp;rsquo;re playing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The GG: Knowing When to Refactor&#xA;    &lt;div id=&#34;the-gg-knowing-when-to-refactor&#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-gg-knowing-when-to-refactor&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In StarCraft, there&amp;rsquo;s a moment every player must learn to recognize: the game is lost.&#xA;Your economy is destroyed.&#xA;Your army is gone.&#xA;Your opponent has three bases to your one.&#xA;Fighting on is admirable but wasteful.&lt;/p&gt;&#xA;&lt;p&gt;Good players type &amp;ldquo;gg&amp;rdquo; (good game) and leave.&#xA;Not because they&amp;rsquo;re quitters.&#xA;Because the time spent losing a doomed game is better spent starting a new one where they can apply what they learned.&lt;/p&gt;&#xA;&lt;p&gt;The software equivalent is knowing when to rewrite.&#xA;Not every codebase can be saved.&#xA;Sometimes the technical debt is so deep, the architecture so convoluted, the assumptions so wrong, that incremental improvement is slower than starting fresh.&lt;/p&gt;&#xA;&lt;p&gt;But here&amp;rsquo;s where the StarCraft analogy gets tricky.&#xA;In StarCraft, a new game starts clean.&#xA;In software, a rewrite inherits the constraints of the existing system: the users, the data, the integrations.&#xA;The &amp;ldquo;gg&amp;rdquo; in software isn&amp;rsquo;t abandoning the project.&#xA;It&amp;rsquo;s recognizing that the current implementation has reached the point of diminishing returns and a new approach will serve everyone better.&lt;/p&gt;&#xA;&lt;p&gt;StarCraft players learn to recognize the threshold through experience.&#xA;They don&amp;rsquo;t quit at the first setback.&#xA;They quit when recovery becomes impossible.&#xA;Software teams need the same judgment.&#xA;Don&amp;rsquo;t rewrite at the first sign of technical debt.&#xA;&lt;strong&gt;Rewrite when the debt makes every change slower than a fresh start would be.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Lesson&#xA;    &lt;div id=&#34;the-lesson&#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-lesson&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;StarCraft is a game of simultaneous decisions under time pressure.&#xA;You manage economy, technology, army composition, map control, and reconnaissance all at once, while an opponent does the same and tries to disrupt you.&#xA;The best players aren&amp;rsquo;t the ones with the fastest hands: they&amp;rsquo;re the ones who make better decisions about where to invest their attention.&lt;/p&gt;&#xA;&lt;p&gt;Software development is the same game.&#xA;You manage features, infrastructure, team composition, code quality, and user feedback all at once, while the market changes and competitors advance.&#xA;&lt;strong&gt;The best teams aren&amp;rsquo;t the ones who write the most code: they&amp;rsquo;re the ones who make better decisions about where to invest their resources.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In StarCraft, every game is different.&#xA;The map changes, the opponent changes, the meta shifts.&#xA;But the fundamentals remain: workers gather resources, buildings unlock technology, scouting reveals information, and good decisions win games.&lt;/p&gt;&#xA;&lt;p&gt;In software, every project is different.&#xA;The domain changes, the team changes, the technology shifts.&#xA;But the fundamentals remain: engineers build features, infrastructure enables scale, user research reveals needs, and good decisions ship products.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re still playing single-player, it&amp;rsquo;s time to scout the map.&#xA;If you&amp;rsquo;re still on one base, it&amp;rsquo;s time to expand.&#xA;If you&amp;rsquo;re still manually producing every unit, it&amp;rsquo;s time to set a rally point.&lt;/p&gt;&#xA;&lt;p&gt;GL HF.&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;https://tomrochette.com/code-factories-factorio/&#34; &gt;Code Factories: The Factorio Perspective&lt;/a&gt; - the same concept explored through Factorio metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-wow/&#34; &gt;Code Factories: The World of Warcraft Perspective&lt;/a&gt; - the same concept explored through World of Warcraft metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-stock-market/&#34; &gt;Code Factories: The Stock Market Perspective&lt;/a&gt; - the same concept explored through stock market metaphors&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/code-factories-rollercoaster-tycoon/&#34; &gt;Code Factories: The RollerCoaster Tycoon Perspective&lt;/a&gt; - the same concept explored through RollerCoaster Tycoon metaphors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>task-stack - A persistent task stack that lives in your system tray</title>
      <link>https://tomrochette.com/task-stack/</link>
      <pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/task-stack/</guid>
      <category>python</category><category>productivity</category><category>developer-tools</category><category>desktop-app</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;I&amp;rsquo;ve been using the &lt;a href=&#34;https://tomrochette.com/workstack/&#34; &gt;workstack&lt;/a&gt; concept for years to track what I&amp;rsquo;m working on and where I got interrupted.&#xA;&lt;strong&gt;task-stack is the natural evolution: a small system tray app that keeps a persistent, reorderable stack of tasks always one hotkey away.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The top of the stack is your current task.&#xA;Everything below the top entry is queued.&#xA;Press &lt;strong&gt;Ctrl+Shift+T&lt;/strong&gt; from anywhere and a compact window appears where you can add, reorder, promote, and remove tasks.&#xA;Close the window and the app stops taking screen space.&#xA;The tray icon always shows the current task as its tooltip.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why a stack, not a list&#xA;    &lt;div id=&#34;why-a-stack-not-a-list&#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;#why-a-stack-not-a-list&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Todo lists are flat.&#xA;Kanban boards carry more overhead.&#xA;&lt;strong&gt;When you&amp;rsquo;re deep in flow and get interrupted, you don&amp;rsquo;t want to prioritize a backlog: you want to push something on top of what you&amp;rsquo;re doing and pop it off when you&amp;rsquo;re done.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A stack models interruptions naturally:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Push&lt;/strong&gt;: a new urgent task goes on top and becomes the current task.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pop&lt;/strong&gt;: mark the task done and the next task becomes current automatically.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reorder&lt;/strong&gt;: something can wait? move the task down. Something urgent? promote the task to the top.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;No projects, no tags, no due dates.&#xA;Just a stack of things to do, in order.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Features&#xA;    &lt;div id=&#34;features&#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;#features&#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;strong&gt;System tray icon&lt;/strong&gt; with the current task as tooltip and a &amp;ldquo;Mark Done (pop)&amp;rdquo; action.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Global hotkey&lt;/strong&gt; (default: Ctrl+Shift+T, configurable) to bring the stack window forward from any application.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Keyboard-driven editing&lt;/strong&gt;: add tasks with Enter, reorder with arrow keys, promote with &lt;code&gt;/&lt;/code&gt;, remove with Backspace.&#xA;Full shortcut table in the &lt;a href=&#34;https://github.com/TomzxCode/task-stack#readme&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;README&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Persistent state&lt;/strong&gt; in &lt;code&gt;~/.task-stack.yaml&lt;/code&gt;.&#xA;Easy to inspect, back up, or version control.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Soft deletes&lt;/strong&gt;: removed tasks stay in the YAML file with a &lt;code&gt;deleted_at&lt;/code&gt; timestamp, so you keep a full history.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Timestamps&lt;/strong&gt;: each task tracks &lt;code&gt;created_at&lt;/code&gt;, &lt;code&gt;started_at&lt;/code&gt; (first time the task became current), and &lt;code&gt;last_current&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cross-platform&lt;/strong&gt;: works on macOS, Linux, and Windows.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Quick start&#xA;    &lt;div id=&#34;quick-start&#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;#quick-start&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/TomzxCode/task-stack.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; task-stack/python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv sync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv run task-stack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The app starts in the system tray.&#xA;Press the hotkey or pick &amp;ldquo;Open Stack&amp;rdquo; from the tray menu.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Data format&#xA;    &lt;div id=&#34;data-format&#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;#data-format&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tasks are stored in &lt;code&gt;~/.task-stack.yaml&lt;/code&gt; as a simple YAML list:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Write blog post about task-stack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;created_at&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2026-05-02T10:00:00+00:00&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;started_at&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2026-05-02T10:00:00+00:00&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;last_current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2026-05-02T10:30:00+00:00&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Review pull requests&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;created_at&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2026-05-02T09:00:00+00:00&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;deleted_at&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2026-05-02T09:45:00+00:00&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Active tasks come first in stack order.&#xA;Soft-deleted tasks are appended at the end with a &lt;code&gt;deleted_at&lt;/code&gt; timestamp.&#xA;Settings (window geometry, hotkey) live in &lt;code&gt;~/.task-stack.settings.yaml&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Configure the hotkey&#xA;    &lt;div id=&#34;configure-the-hotkey&#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;#configure-the-hotkey&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Edit &lt;code&gt;~/.task-stack.settings.yaml&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;hotkey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ctrl+shift+t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# hotkey: alt+space&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# hotkey: cmd+shift+space&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;Restart the app to apply the new hotkey.&lt;/strong&gt;&#xA;The current hotkey is shown in the tray menu.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When task-stack is useful&#xA;    &lt;div id=&#34;when-task-stack-is-useful&#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;#when-task-stack-is-useful&#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;strong&gt;Developers context-switching&lt;/strong&gt; between code reviews, bug fixes, and feature work.&#xA;Push the interruption on the stack, pop the interruption when done, resume what you were doing.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone who works with interruptions&lt;/strong&gt; and wants a lightweight way to track pending work without opening a full project management tool.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Time tracking enthusiasts&lt;/strong&gt; who want &lt;code&gt;started_at&lt;/code&gt; / &lt;code&gt;last_current&lt;/code&gt; timestamps to reconstruct what they worked on during the day.&lt;/li&gt;&#xA;&lt;/ul&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;https://tomrochette.com/workstack/&#34; &gt;Workstack&lt;/a&gt; - the original note-taking concept that inspired task-stack.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>gh-cached - Browse GitHub issues and PRs without burning through your API rate limit</title>
      <link>https://tomrochette.com/gh-cached/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/gh-cached/</guid>
      <category>go</category><category>github</category><category>cli</category><category>developer-tools</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note (2026-07-02):&lt;/strong&gt; gh-cached has been merged into &lt;a href=&#34;https://github.com/tomzxcode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ghx&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;I use the GitHub CLI (&lt;code&gt;gh&lt;/code&gt;) heavily, and I kept hitting the API rate limit.&#xA;The pain is worst when I&amp;rsquo;m triaging issues across multiple repos or reviewing a backlog of PRs.&#xA;Every &lt;code&gt;gh issue list&lt;/code&gt;, every &lt;code&gt;gh pr view&lt;/code&gt;, every comment fetch costs API calls I don&amp;rsquo;t need to spend.&lt;/p&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://github.com/TomzxCode/gh-cached&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;gh-cached&lt;/a&gt; to solve the rate limit problem.&#xA;&lt;strong&gt;gh-cached is a standalone Go binary that wraps the GitHub GraphQL API and caches every response to disk, so subsequent commands read from the local cache instead of hitting GitHub again.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The problem&#xA;    &lt;div id=&#34;the-problem&#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-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The official &lt;code&gt;gh&lt;/code&gt; CLI is excellent, but it&amp;rsquo;s designed for live, one-off interactions.&#xA;There&amp;rsquo;s no built-in caching layer.&#xA;Running &lt;code&gt;gh issue list&lt;/code&gt; twice in five minutes makes two API calls.&#xA;Browsing hundreds of issues with their comments in a large repository burns through the rate limit fast.&lt;/p&gt;&#xA;&lt;p&gt;The problem gets worse when AI coding assistants query GitHub on my behalf.&#xA;Multiple agents, multiple tools, all hitting the same API.&#xA;&lt;strong&gt;The rate limit becomes a bottleneck.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How gh-cached works&#xA;    &lt;div id=&#34;how-gh-cached-works&#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;#how-gh-cached-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go install github.com/tomzxcode/gh-cached@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The cache lives at &lt;code&gt;~/.cache/gh-cached/&amp;lt;host&amp;gt;/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&lt;/code&gt;.&#xA;Each issue and PR is stored as its own JSON file, including all comments.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pre-populate the cache:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached cache                          &lt;span class=&#34;c1&#34;&gt;# current repo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached cache --repo cli/cli           &lt;span class=&#34;c1&#34;&gt;# any repo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached cache --cache-duration &lt;span class=&#34;m&#34;&gt;120&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;# fresh for 2 hours&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;Browse issues and PRs from cache:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached issue list                     &lt;span class=&#34;c1&#34;&gt;# open issues&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached issue list --state all         &lt;span class=&#34;c1&#34;&gt;# everything&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached issue list --label bug         &lt;span class=&#34;c1&#34;&gt;# filter by label&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached issue list --author alice      &lt;span class=&#34;c1&#34;&gt;# filter by author&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached issue view &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; --comments       &lt;span class=&#34;c1&#34;&gt;# view with comments&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached pr list --state merged         &lt;span class=&#34;c1&#34;&gt;# merged PRs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached pr list --draft                &lt;span class=&#34;c1&#34;&gt;# draft PRs only&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached pr view &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --comments          &lt;span class=&#34;c1&#34;&gt;# view with comments&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;When the cache is fresh, all filtering happens in-memory with zero API calls.&lt;/strong&gt;&#xA;When the cache is stale, gh-cached falls back to the GitHub API and updates the cache.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why a separate tool instead of a gh extension?&#xA;    &lt;div id=&#34;why-a-separate-tool-instead-of-a-gh-extension&#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;#why-a-separate-tool-instead-of-a-gh-extension&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Two reasons.&lt;/p&gt;&#xA;&lt;p&gt;First, gh-cached uses GraphQL under the hood, which lets the tool fetch issues and PRs with their comments in fewer round trips than the REST API the official CLI defaults to.&#xA;&lt;strong&gt;The cache-then-filter pattern also means one pre-fetch can be queried many ways without going back to GitHub.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Second, independence.&#xA;gh-cached works with just a &lt;code&gt;GH_TOKEN&lt;/code&gt; environment variable, or falls back to &lt;code&gt;gh auth token&lt;/code&gt; if the GitHub CLI is already installed.&#xA;No plugin registration, no extension marketplace, just a binary you put in your PATH.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The caching strategy&#xA;    &lt;div id=&#34;the-caching-strategy&#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-caching-strategy&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The tool uses different strategies depending on the command:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;cache&lt;/code&gt; fetches everything (all states, with comments) and writes one JSON file per item.&#xA;Skips items already cached within the &lt;code&gt;--cache-duration&lt;/code&gt; window (default: 60 minutes).&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;issue list&lt;/code&gt; / &lt;code&gt;pr list&lt;/code&gt; reads cached files and filter in-memory when fresh.&#xA;Falls back to the API with server-side filters when stale.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;issue view&lt;/code&gt; / &lt;code&gt;pr view&lt;/code&gt; serves from the individual cached file if less than 60 minutes old.&#xA;Otherwise fetches from the API and updates the cache.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;A single &lt;code&gt;gh-cached cache&lt;/code&gt; run gives fast, offline-capable access to all issues and PRs for the next hour.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Authentication&#xA;    &lt;div id=&#34;authentication&#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;#authentication&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Set the token in the environment:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GH_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ghp_...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ghp_...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Or just have &lt;code&gt;gh&lt;/code&gt; installed and authenticated: gh-cached will use &lt;code&gt;gh auth token&lt;/code&gt; as a fallback.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;When gh-cached is useful&#xA;    &lt;div id=&#34;when-gh-cached-is-useful&#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;#when-gh-cached-is-useful&#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;strong&gt;AI coding assistants&lt;/strong&gt; that query GitHub repeatedly.&#xA;Pre-populate the cache once and let tools read from disk instead of making redundant API calls.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Repository triage&lt;/strong&gt; where hundreds of issues need scanning with different filters.&#xA;One cache fetch, then instant in-memory filtering.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Working with multiple repositories&lt;/strong&gt; where context switches are frequent.&#xA;Cache each repo once and browse offline.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Rate-limited environments&lt;/strong&gt; like CI pipelines or shared machines where every API call is limited.&lt;/li&gt;&#xA;&lt;/ul&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;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go install github.com/tomzxcode/gh-cached@latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# or download a binary from https://github.com/TomzxCode/gh-cached/releases/tag/latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached cache --repo your-org/your-repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached issue list --state all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh-cached pr list --state all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Profit-as-a-Service</title>
      <link>https://tomrochette.com/profit-as-a-service/</link>
      <pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/profit-as-a-service/</guid>
      <category>business</category><category>ai</category><category>saas</category><category>automation</category><category>satire</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Software-as-a-Service gave us recurring revenue.&#xA;Platform-as-a-Service gave us managed infrastructure.&#xA;&lt;strong&gt;The next abstraction is obvious in hindsight: Profit-as-a-Service.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Pattern&#xA;    &lt;div id=&#34;the-pattern&#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-pattern&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every major shift in the software industry has been about abstracting away complexity.&lt;/p&gt;&#xA;&lt;p&gt;On-premise servers became cloud infrastructure.&#xA;Custom software became SaaS subscriptions.&#xA;Manual operations became automation.&lt;/p&gt;&#xA;&lt;p&gt;Each layer removes something the customer previously had to manage themselves.&#xA;Each layer turns a cost center into a service.&#xA;&lt;strong&gt;Each layer makes the underlying complexity someone else&amp;rsquo;s problem.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Profit-as-a-Service is the logical conclusion of this trend.&#xA;Instead of selling software that helps you make money, you sell the money-making itself.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What It Looks Like&#xA;    &lt;div id=&#34;what-it-looks-like&#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-it-looks-like&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A traditional SaaS company sells you a tool.&#xA;You still need to figure out how to use it to generate revenue.&lt;/p&gt;&#xA;&lt;p&gt;A Profit-as-a-Service company sells you an outcome.&#xA;The tool is invisible.&#xA;The process is invisible.&#xA;You pay for the result.&lt;/p&gt;&#xA;&lt;p&gt;Examples already exist:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Algorithmic_trading&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Algorithmic trading&lt;/a&gt; platforms&lt;/strong&gt; that let you deploy capital and collect returns without understanding the underlying strategies.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AI-powered &lt;a href=&#34;https://en.wikipedia.org/wiki/Dropshipping&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;dropshipping&lt;/a&gt; services&lt;/strong&gt; that handle product selection, listing, pricing, and fulfillment while you provide the capital.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Automated content farms&lt;/strong&gt; that generate SEO-optimized articles, monetize them with ads, and split the revenue with you.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AI sales agents&lt;/strong&gt; that prospect, qualify, and close deals on your behalf, charging only a commission on closed revenue.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Robo-advisor&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Robo-advisors&lt;/a&gt;&lt;/strong&gt; that manage investment portfolios algorithmically, charging a fraction of traditional advisory fees.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In each case, the customer provides capital or data.&#xA;The service provides everything else.&#xA;Revenue is shared, not subscribed to.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Now&#xA;    &lt;div id=&#34;why-now&#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;#why-now&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Three forces are converging to make Profit-as-a-Service viable at scale.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. AI can now execute complex business processes autonomously&#xA;    &lt;div id=&#34;1-ai-can-now-execute-complex-business-processes-autonomously&#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;#1-ai-can-now-execute-complex-business-processes-autonomously&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Large language models can write marketing copy, analyze markets, negotiate with customers, and generate code.&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Multi-agent_system&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Multi-agent systems&lt;/a&gt; can coordinate these capabilities into end-to-end business workflows.&#xA;What previously required a team of specialists can now be done by a single API call chain.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;2. Infrastructure is fully commoditized&#xA;    &lt;div id=&#34;2-infrastructure-is-fully-commoditized&#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;#2-infrastructure-is-fully-commoditized&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Starting a business used to require incorporating, hiring, building software, and navigating regulations.&#xA;Now you can spin up a fully operational e-commerce store in an afternoon using off-the-shelf tools.&#xA;The barrier to entry for almost every digital business has collapsed to near zero.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;3. Distribution is algorithmic&#xA;    &lt;div id=&#34;3-distribution-is-algorithmic&#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;#3-distribution-is-algorithmic&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Social media algorithms, search engines, and ad platforms have made customer acquisition a math problem.&#xA;If you can compute the expected value of an impression, you can acquire customers profitably at scale.&#xA;AI is better at computing expected value than humans.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Economics&#xA;    &lt;div id=&#34;the-economics&#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-economics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The unit economics of Profit-as-a-Service are deceptively simple.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The service provider operates a system that generates revenue.&#xA;The customer provides the input: capital, data, or access to a market.&#xA;Revenue is split between the provider and the customer.&lt;/p&gt;&#xA;&lt;p&gt;For the customer, the arrangement is attractive because:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No upfront investment in tools or expertise.&lt;/li&gt;&#xA;&lt;li&gt;Risk is aligned (the provider only makes money if you make money).&lt;/li&gt;&#xA;&lt;li&gt;Scalability is built in (the system can run 24/7 without human intervention).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For the provider, the arrangement is attractive because:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Revenue scales with customer success (no ceiling from fixed subscriptions).&lt;/li&gt;&#xA;&lt;li&gt;Customer acquisition is easier (pay-for-performance is an easy sell).&lt;/li&gt;&#xA;&lt;li&gt;Margins improve with scale (the same system serves many customers).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The critical metric is the spread between what the system generates and what it costs to operate.&#xA;If a system generates $10,000/month per customer and costs $2,000/month to run, the provider can keep $4,000 and give the customer $4,000.&#xA;Both parties are happy.&#xA;The system scales linearly in cost but exponentially in value.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Risks&#xA;    &lt;div id=&#34;the-risks&#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-risks&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Profit-as-a-Service is not without significant risks.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Alignment risk&#xA;    &lt;div id=&#34;alignment-risk&#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;#alignment-risk&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;When you outsource profit generation, you also outsource decision-making.&lt;/strong&gt;&#xA;The provider&amp;rsquo;s optimization target may diverge from yours, a textbook &lt;a href=&#34;https://en.wikipedia.org/wiki/Principal%E2%80%93agent_problem&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;principal-agent problem&lt;/a&gt;.&#xA;A trading algorithm might maximize short-term returns at the cost of long-term stability.&#xA;A content farm might optimize for clicks at the cost of your brand reputation.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Concentration risk&#xA;    &lt;div id=&#34;concentration-risk&#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;#concentration-risk&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;If the service provider goes down, your revenue goes to zero.&#xA;There is no fallback when the entire business process is a black box.&#xA;Diversification across multiple providers becomes essential but difficult.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Regulatory risk&#xA;    &lt;div id=&#34;regulatory-risk&#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;#regulatory-risk&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Financial services are heavily regulated.&#xA;When you abstract away the details of money-making, you may also abstract away compliance.&#xA;The line between &amp;ldquo;software service&amp;rdquo; and &amp;ldquo;financial service&amp;rdquo; is thin and getting thinner.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Race to the bottom&#xA;    &lt;div id=&#34;race-to-the-bottom&#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;#race-to-the-bottom&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When the barrier to entry is low, competition drives margins toward zero.&#xA;The first provider to offer automated dropshipping captures most of the value.&#xA;The hundredth provider competes on price until nobody makes money.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Dependency trap&#xA;    &lt;div id=&#34;dependency-trap&#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;#dependency-trap&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Once a business relies on Profit-as-a-Service, transitioning away is extremely difficult.&#xA;The provider owns the process, the data, and the relationships.&#xA;Switching costs are not just technical but operational and strategic.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Spectrum&#xA;    &lt;div id=&#34;the-spectrum&#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-spectrum&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Profit-as-a-Service is not binary.&#xA;It exists on a spectrum of how much of the profit-generating process is abstracted away.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 0: You do everything.&lt;/strong&gt; You buy tools and operate them yourself. Traditional software.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 1: AI assists you.&lt;/strong&gt; You use AI tools to accelerate specific tasks. Copilots and assistants.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 2: AI operates under your supervision.&lt;/strong&gt; You define strategy, AI executes tactics. Current state of most AI-powered businesses.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 3: AI runs the process, you provide direction.&lt;/strong&gt; You set constraints, AI handles the rest. Emerging today.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 4: AI runs everything, you provide capital.&lt;/strong&gt; You fund the operation, AI decides how to deploy it. Algorithmic trading, robo-advisors.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 5: AI runs everything, including capital allocation.&lt;/strong&gt; Fully autonomous business entities. None exist yet, but the trajectory is clear.&lt;/p&gt;&#xA;&lt;p&gt;Most businesses today operate at Level 0 or 1.&#xA;&lt;strong&gt;The opportunity is in moving up the spectrum.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Who Wins&#xA;    &lt;div id=&#34;who-wins&#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;#who-wins&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The winners in the Profit-as-a-Service economy will be:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Platform providers&lt;/strong&gt; who own the infrastructure that makes Profit-as-a-Service possible.&#xA;If you operate the AI system that generates profit for thousands of businesses, you capture a slice of every dollar earned.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Capital providers&lt;/strong&gt; who can efficiently allocate resources across multiple Profit-as-a-Service offerings.&#xA;&lt;strong&gt;When starting a business requires no expertise, access to capital becomes the primary competitive advantage.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Specialists&lt;/strong&gt; who can handle the edge cases that AI cannot.&#xA;Regulatory compliance, strategic partnerships, and brand building remain human-dominated activities.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Arbitrageurs&lt;/strong&gt; who identify Profit-as-a-Service opportunities before they become commoditized.&#xA;The window between &amp;ldquo;novel&amp;rdquo; and &amp;ldquo;saturated&amp;rdquo; is shrinking, but the rewards for being early are enormous.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Who Loses&#xA;    &lt;div id=&#34;who-loses&#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;#who-loses&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The losers will be:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Middlemen&lt;/strong&gt; whose value proposition was information asymmetry.&#xA;When AI can access and process all available information, intermediaries add no value.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Consultants&lt;/strong&gt; who sold expertise that can now be codified.&#xA;&lt;strong&gt;If your consulting practice can be reduced to a prompt, it will be.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;SaaS companies&lt;/strong&gt; that failed to move up the value chain.&#xA;&lt;strong&gt;A CRM that helps you track sales will lose to an AI that makes sales for you.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Employees&lt;/strong&gt; whose jobs consisted of executing repeatable business processes.&#xA;This is the uncomfortable truth that applies across industries.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Question&#xA;    &lt;div id=&#34;the-question&#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-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Profit-as-a-Service is not a prediction.&#xA;It is a description of what is already happening.&lt;/p&gt;&#xA;&lt;p&gt;The question for any business is not whether this trend will affect you.&#xA;&lt;strong&gt;The question is whether you will be the provider or the customer.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;If your business processes can be automated by AI, they will be.&lt;/strong&gt;&#xA;If you are the one automating them, you are the Profit-as-a-Service provider.&#xA;If you are the one whose processes are being automated, you are about to become a customer.&lt;/p&gt;&#xA;&lt;p&gt;Choose wisely.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Future of Code Review: How AI Makes Human Review Obsolete</title>
      <link>https://tomrochette.com/the-future-of-code-review/</link>
      <pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-future-of-code-review/</guid>
      <category>ai</category><category>software-engineering</category><category>code-review</category><category>llm</category><category>fully-ai-generated</category><category>llm=glm-5.1</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&lt;strong&gt;The traditional code review is ending.&lt;/strong&gt;&#xA;Not because it is unnecessary, but because it is becoming unnecessary.&lt;/p&gt;&#xA;&lt;p&gt;For decades, code review has been a central practice of software engineering.&#xA;Pull requests, peer reviews, endless rounds of comments: these practices are how we have maintained code quality.&#xA;But AI is fundamentally changing that practice.&#xA;&lt;strong&gt;In my view, the question is not whether AI will replace human code review, but how quickly.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Problem With Human Code Review&#xA;    &lt;div id=&#34;the-problem-with-human-code-review&#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-problem-with-human-code-review&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Human code review suffers from three fatal flaws:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;It does not scale&lt;/strong&gt;.&#xA;As teams grow, review backlogs grow.&#xA;Developers wait days or weeks for feedback, blocking progress.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;It is inconsistent&lt;/strong&gt;.&#xA;Reviews vary widely based on who is reviewing, when they are reviewing, and how tired they are.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;It is expensive&lt;/strong&gt;.&#xA;Senior engineers spend significant time reviewing code instead of building features.&#xA;In high-cost engineering organizations, this adds up to millions of dollars annually.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The alternative, no reviews at all, is not viable either.&#xA;Shipping unreviewed code leads to security vulnerabilities, bugs, and technical debt.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The AI Solution: Software Factories&#xA;    &lt;div id=&#34;the-ai-solution-software-factories&#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-ai-solution-software-factories&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A new paradigm is emerging: the Software Factory.&#xA;&lt;strong&gt;Instead of humans reviewing code, AI systems verify, test, and heal code autonomously.&lt;/strong&gt;&#xA;The Software Factory is not theoretical, it is already running in production.&lt;/p&gt;&#xA;&lt;p&gt;Consider &lt;a href=&#34;https://factory.strongdm.ai/&#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=factory.strongdm.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;StrongDM&amp;rsquo;s Software Factory&lt;/a&gt;, which launched in July 2025.&#xA;A team of three people (a CTO, a senior manager, and a new hire) built a system that autonomously clones core products like Okta, Jira, and Slack.&#xA;Their target: $1,000 per day per engineer in tokens.&#xA;That sounds expensive until you realize what they are shipping.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How It Works&#xA;    &lt;div id=&#34;how-it-works&#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;#how-it-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The Software Factory approach replaces human review with six verification layers:&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. Competitive Generation&#xA;    &lt;div id=&#34;1-competitive-generation&#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;#1-competitive-generation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Instead of one AI writing code, run three in parallel.&#xA;Three models run in parallel, each generating a different implementation.&#xA;An automated evaluator selects the best output based on passing tests, minimal diffs, and fewer dependencies.&#xA;The cost of running three models is trivial compared to the quality gain.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;2. Iterative Refinement (Trycycle)&#xA;    &lt;div id=&#34;2-iterative-refinement-trycycle&#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;#2-iterative-refinement-trycycle&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Define the problem, write a plan, ask &amp;ldquo;is it perfect?&amp;rdquo;&#xA;If not, try again.&#xA;Implement, then ask &amp;ldquo;is it perfect?&amp;rdquo;&#xA;If not, try again.&#xA;&lt;a href=&#34;https://github.com/danshapiro/trycycle&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Trycycle&lt;/a&gt; runs this loop autonomously for hours.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;3. Scenario-Based Validation&#xA;    &lt;div id=&#34;3-scenario-based-validation&#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;#3-scenario-based-validation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Treat scenarios like machine learning holdout sets.&#xA;Store acceptance scenarios outside the codebase, then have an LLM judge whether the implementation satisfies them.&#xA;Instead of a binary &amp;ldquo;tests pass&amp;rdquo;, you get a probabilistic satisfaction score measuring trajectory toward success.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;4. Observability and Healing&#xA;    &lt;div id=&#34;4-observability-and-healing&#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;#4-observability-and-healing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Every interaction in the system gets logged to an execution database (CXDB).&#xA;A Healer agent monitors this database, clusters similar problems, and writes prescriptions.&#xA;No human bug reports.&#xA;No human triage.&#xA;Just autonomous detection and fixing.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;5. Digital Twin Testing&#xA;    &lt;div id=&#34;5-digital-twin-testing&#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;#5-digital-twin-testing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Clone critical external dependencies: Google Sheets, Slack, Jira, authentication providers.&#xA;Build replicas that AI agents cannot distinguish from production.&#xA;Test in the most realistic environment possible without touching actual production systems.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;6. Adversarial Verification&#xA;    &lt;div id=&#34;6-adversarial-verification&#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;#6-adversarial-verification&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Separate the coding agent from the verification agent.&#xA;Have a third agent actively try to break what was built.&#xA;Enforce that verification criteria are authored before code, not after.&#xA;This separation prevents the common anti-pattern of writing tests to match implementation rather than specify behavior.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Economic Case&#xA;    &lt;div id=&#34;the-economic-case&#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-economic-case&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This approach is not just about quality, it is about economics.&lt;/p&gt;&#xA;&lt;p&gt;StrongDM&amp;rsquo;s team reports seeing 21% more tasks completed and 98% more pull requests shipped.&#xA;One case study: &lt;a href=&#34;https://devin.ai/&#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=devin.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Nubank&lt;/a&gt; migrated an eight-year ETL monolith (six million lines, one thousand engineers) from an 18-month timeline to weeks.&#xA;That is an 8-12x efficiency improvement with 20x cost savings.&lt;/p&gt;&#xA;&lt;p&gt;The breakeven point is 50-70 pull requests per month.&#xA;&lt;strong&gt;Above that threshold, the AI factory costs less than human review while delivering higher velocity.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Five-Level Evolution&#xA;    &lt;div id=&#34;the-five-level-evolution&#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-five-level-evolution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.danshapiro.com/blog/2026/01/the-five-levels/&#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=www.danshapiro.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Dan Shapiro at StrongDM&lt;/a&gt; describes five levels of AI-assisted development:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Level 0&lt;/strong&gt;: Manual (you write everything)&#xA;&lt;strong&gt;Level 1&lt;/strong&gt;: Offloading discrete tasks (ChatGPT for regex)&#xA;&lt;strong&gt;Level 2&lt;/strong&gt;: AI-native tools (90% of &amp;ldquo;AI&amp;rdquo; developers today)&#xA;&lt;strong&gt;Level 3&lt;/strong&gt;: Human-in-the-loop manager (reviewing all code)&#xA;&lt;strong&gt;Level 4&lt;/strong&gt;: You are now a product manager (spec, argue, craft skills, check tomorrow)&#xA;&lt;strong&gt;Level 5&lt;/strong&gt;: Dark Factory (black box: specs → software)&lt;/p&gt;&#xA;&lt;p&gt;Most teams today are stuck at Level 2 or 3.&#xA;The future is Levels 4 and 5, where humans specify constraints and AI handles everything else.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What This Means for Engineers&#xA;    &lt;div id=&#34;what-this-means-for-engineers&#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-this-means-for-engineers&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Your job is not to write code.&lt;/strong&gt;&#xA;Your job is not to read code.&#xA;Your job is to solve quality problems so the factory can run.&lt;/p&gt;&#xA;&lt;p&gt;This approach requires a philosophical shift.&#xA;Instead of &amp;ldquo;how do I review this code?&amp;rdquo;, ask &amp;ldquo;why am I doing this?&amp;rdquo;&#xA;If you can describe what is wrong, you can automate it.&#xA;&lt;strong&gt;If you can describe what quality looks like, you can codify it as a verification rule.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The era of human-centric development is ending.&#xA;AI compilers will transform specifications into deployed software.&#xA;Teams will consist of AI business analysts, AI DevOps engineers, AI QA specialists, and AI compilers.&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;p&gt;The transition does not happen overnight.&#xA;A realistic 16-week roadmap:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Weeks 1-2&lt;/strong&gt;: Install Trycycle skill and competitive generation pattern&#xA;&lt;strong&gt;Weeks 3-4&lt;/strong&gt;: Build execution database and scenario framework&#xA;&lt;strong&gt;Weeks 5-6&lt;/strong&gt;: Implement Healer agent for autonomous fixes&#xA;&lt;strong&gt;Weeks 7-8&lt;/strong&gt;: Build digital twins for critical integrations&#xA;&lt;strong&gt;Weeks 9-12&lt;/strong&gt;: Migrate existing codebase to spec-driven workflow&#xA;&lt;strong&gt;Weeks 13-16&lt;/strong&gt;: Fine-tuning and compounding learning&lt;/p&gt;&#xA;&lt;p&gt;The results compound.&#xA;Weeks 1-4 might yield 5-10x velocity on simple tasks.&#xA;By week 16, teams report 2x monthly speed improvements with compounding gains continuing.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Open Questions&#xA;    &lt;div id=&#34;open-questions&#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;#open-questions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The transition is not a solved problem.&#xA;Key research questions remain:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Is $1,000/day per engineer in tokens realistic or an outlier?&lt;/li&gt;&#xA;&lt;li&gt;How do patterns learned in one domain transfer to another?&lt;/li&gt;&#xA;&lt;li&gt;When does fine-tuning cost outweigh compounding benefits?&lt;/li&gt;&#xA;&lt;li&gt;What specific patterns trigger unavoidable human review?&lt;/li&gt;&#xA;&lt;li&gt;How do you validate security without human review of auth logic?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;These questions are not blockers, they are opportunities for teams to pioneer solutions.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The End of an Era&#xA;    &lt;div id=&#34;the-end-of-an-era&#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-end-of-an-era&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The traditional code review served us well.&#xA;But like manual testing before automated test suites, its time is passing.&#xA;&lt;strong&gt;The future is not humans reviewing AI code.&lt;/strong&gt;&#xA;It is humans designing verification systems that make human review unnecessary.&lt;/p&gt;&#xA;&lt;p&gt;The question is no longer whether your team will adopt this approach.&#xA;&lt;strong&gt;The question is whether your competitors will adopt it first.&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Primary Sources&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;StrongDM Software Factory. Production deployment of autonomous code generation systems.&#xA;&lt;a href=&#34;https://factory.strongdm.ai/&#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=factory.strongdm.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://factory.strongdm.ai/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Kilroy. Open-source CLI for running StrongDM-style pipelines locally.&#xA;&lt;a href=&#34;https://github.com/danshapiro/kilroy&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/danshapiro/kilroy&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Attractor. Provider-agnostic framework for autonomous code generation.&#xA;&lt;a href=&#34;https://github.com/strongdm/attractor&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/strongdm/attractor&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Trycycle. Simple skill for iterative refinement loops.&#xA;&lt;a href=&#34;https://github.com/danshapiro/trycycle&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/danshapiro/trycycle&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Devin. AI-powered software engineering platform with fine-tuning capabilities.&#xA;&lt;a href=&#34;https://devin.ai/&#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=devin.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://devin.ai/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Analysis and Commentary&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Willison, Simon. &amp;ldquo;Software Factory.&amp;rdquo;&#xA;&lt;a href=&#34;https://simonwillison.net/2026/Feb/7/software-factory/&#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=simonwillison.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://simonwillison.net/2026/Feb/7/software-factory/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Shapiro, Dan. &amp;ldquo;The Five Levels.&amp;rdquo;&#xA;&lt;a href=&#34;https://www.danshapiro.com/blog/2026/01/the-five-levels/&#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=www.danshapiro.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.danshapiro.com/blog/2026/01/the-five-levels/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Shapiro, Dan. &amp;ldquo;Dark Factories.&amp;rdquo;&#xA;&lt;a href=&#34;https://www.danshapiro.com/blog/2026/03/dark-factories/&#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=www.danshapiro.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.danshapiro.com/blog/2026/03/dark-factories/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Shapiro, Dan. &amp;ldquo;You Don&amp;rsquo;t Write the Code.&amp;rdquo;&#xA;&lt;a href=&#34;https://www.danshapiro.com/blog/2026/02/you-dont-write-the-code/&#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=www.danshapiro.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.danshapiro.com/blog/2026/02/you-dont-write-the-code/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;LukePM. &amp;ldquo;The Software Factory.&amp;rdquo;&#xA;&lt;a href=&#34;https://lukepm.com/blog/the-software-factory/&#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=lukepm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://lukepm.com/blog/the-software-factory/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Latent Space. &amp;ldquo;Reviews Dead.&amp;rdquo;&#xA;&lt;a href=&#34;https://www.latent.space/p/reviews-dead&#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=www.latent.space&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.latent.space/p/reviews-dead&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Case Studies&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nubank ETL Migration. Eight-year monolith migrated in weeks using Devin.&#xA;&lt;a href=&#34;https://devin.ai/&#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=devin.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://devin.ai/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;StrongDM Security Software. Autonomous cloning of Okta, Jira, and Slack.&#xA;&lt;a href=&#34;https://factory.strongdm.ai/&#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=factory.strongdm.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://factory.strongdm.ai/&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The Survival of the Smartest: Exploring Darwinian Software Development</title>
      <link>https://tomrochette.com/agi/llm/the-survival-of-the-smartest-exploring-darwinian-software-development/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/the-survival-of-the-smartest-exploring-darwinian-software-development/</guid>
      <category>artificial-general-intelligence</category><category>fully-ai-generated</category><category>llm=gemini-3-fast</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Prompt&#xA;    &lt;div id=&#34;prompt&#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;#prompt&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Write an article about Darwinian software development, the use of LLM swarms to identify the best solution to a problem.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In traditional software development, software is &amp;ldquo;built.&amp;rdquo;&#xA;An architect designs a blueprint, and developers write the code.&#xA;&lt;strong&gt;But with Generative AI, we are moving toward a paradigm where software is evolved.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Darwinian Software Development is an emerging methodology that uses &amp;ldquo;swarms&amp;rdquo; of Large Language Models (LLMs) to iterate, compete, and select the most efficient code through a process mirroring &lt;a href=&#34;https://en.wikipedia.org/wiki/Natural_selection&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;natural selection&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How the Swarm Works&#xA;    &lt;div id=&#34;how-the-swarm-works&#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;#how-the-swarm-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Instead of asking a single AI to write a function, Darwinian development deploys a multi-agent system (a swarm) to tackle the same problem from different angles.&#xA;The process generally follows four biological phases:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Variation (The Mutation):&lt;/strong&gt; Multiple LLM agents are given the same prompt but with different system instructions. One might prioritize memory efficiency, another readability, and a third raw speed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Competition (The Struggle for Life):&lt;/strong&gt; The agents generate dozens of potential solutions. The solutions aren&amp;rsquo;t just checked for syntax; they are run in a &amp;ldquo;sandbox&amp;rdquo; against unit tests and edge cases.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Selection (Fitness Function):&lt;/strong&gt; An automated &amp;ldquo;Judge&amp;rdquo; agent (or a specialized testing suite) evaluates the outputs. Only the code that passes the most tests with the lowest latency or resource consumption &amp;ldquo;survives.&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Heredity (Refinement):&lt;/strong&gt; The winning code is then used as the &amp;ldquo;DNA&amp;rdquo; for the next generation. The swarm takes the best-performing snippet and attempts to optimize it further until a &amp;ldquo;perfect&amp;rdquo; solution is reached.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Swarms Outperform Single Models&#xA;    &lt;div id=&#34;why-swarms-outperform-single-models&#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;#why-swarms-outperform-single-models&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The &amp;ldquo;Darwinian&amp;rdquo; approach solves the two biggest problems in AI-assisted coding: hallucinations and getting stuck on a single approach.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Error Correction:&lt;/strong&gt; If one agent introduces a bug, the likelihood that five other agents will make the exact same error is low. The swarm acts as a self-healing mechanism.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Diverse Architectures:&lt;/strong&gt; One LLM might get stuck on a specific logic path. A swarm explores many possible solutions across the &lt;a href=&#34;https://en.wikipedia.org/wiki/Fitness_landscape&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;fitness landscape&lt;/a&gt;, finding creative solutions a human (or a single AI) might never consider.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Performance Benchmarking:&lt;/strong&gt; By racing agents against each other, the system naturally optimizes for performance.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Feature&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Traditional Development&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Single LLM Coding&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Darwinian Swarm&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Speed&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Slow (Human-paced)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Very Fast&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Fast (Iterative)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Reliability&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;High (Human-vetted)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Medium (Hallucination risk)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Very High (Cross-vetted)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Optimization&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Manual&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Basic&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Automated/Evolutionary&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The &amp;ldquo;Fitness Function&amp;rdquo; Problem&#xA;    &lt;div id=&#34;the-fitness-function-problem&#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-fitness-function-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The biggest challenge in Darwinian development isn&amp;rsquo;t the AI; it&amp;rsquo;s the criteria.&lt;/strong&gt;&#xA;For natural selection to work, the environment must be rigorous.&#xA;If your &amp;ldquo;fitness function&amp;rdquo; (the tests you use to judge the code) is poorly written, the AI can evolve to pass the tests while the code remains broken.&#xA;This failure mode is known as &lt;a href=&#34;https://en.wikipedia.org/wiki/Reward_hacking&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;reward hacking&lt;/a&gt;.&#xA;To counter reward hacking, modern swarms often include &amp;ldquo;Adversarial Agents&amp;rdquo; whose only job is to write difficult unit tests that expose the flaws in the code generated by the other agents.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Future: Software That Self-Improves&#xA;    &lt;div id=&#34;the-future-software-that-self-improves&#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-future-software-that-self-improves&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;We are approaching a point where software won&amp;rsquo;t be static.&#xA;Imagine a server that monitors its own performance and, upon detecting a bottleneck, spawns a Darwinian swarm to rewrite its own inefficient modules immediately.&#xA;&lt;strong&gt;In this new world, the developer&amp;rsquo;s role shifts from writer to naturalist.&lt;/strong&gt;&#xA;You aren&amp;rsquo;t typing the lines; you are defining the environment in which the best code can emerge.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What Changes When Coding Agents Are Infinitely Parallel</title>
      <link>https://tomrochette.com/agi/llm/what-changes-when-coding-agents-are-infinitely-parallel/</link>
      <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/what-changes-when-coding-agents-are-infinitely-parallel/</guid>
      <category>artificial-general-intelligence</category><category>fully-ai-generated</category><category>llm=claude-sonnet-4.6</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Imagine you can run hundreds or thousands of coding agents in parallel.&#xA;How would you use them?&#xA;&lt;strong&gt;The interesting answer is not &amp;ldquo;do everything faster&amp;rdquo;, but rather what fundamentally changes when parallelism is cheap.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;From Sequential Exploration to Parallel Search&#xA;    &lt;div id=&#34;from-sequential-exploration-to-parallel-search&#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;#from-sequential-exploration-to-parallel-search&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When you have one agent, you think carefully before acting, because going down dead ends is expensive.&#xA;With thousands of agents, the trade-off reverses.&#xA;&lt;strong&gt;Exploration becomes cheap, and convergence becomes the hard problem.&lt;/strong&gt;&#xA;Your job shifts from &amp;ldquo;what should I try?&amp;rdquo; to &amp;ldquo;how do I synthesize thousands of results?&amp;rdquo;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;High-Leverage Use Patterns&#xA;    &lt;div id=&#34;high-leverage-use-patterns&#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;#high-leverage-use-patterns&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Speculative execution on decisions.&lt;/strong&gt;&#xA;At every architectural fork, such as &amp;ldquo;should this be a queue-based system or polling?&amp;rdquo;, you do not decide, you branch.&#xA;Two fleets of agents build both options, and you evaluate the results, borrowing the processor idea of &lt;a href=&#34;https://en.wikipedia.org/wiki/Speculative_execution&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;speculative execution&lt;/a&gt;.&#xA;This pattern is very useful for situations where you genuinely do not know which approach is better until you have tried it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Mutation testing at scale.&lt;/strong&gt;&#xA;Spin up hundreds of agents making targeted changes to a codebase, each trying a different hypothesis about why a bug exists or how to optimize something.&#xA;It is like &lt;a href=&#34;https://en.wikipedia.org/wiki/Fuzzing&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;fuzzing&lt;/a&gt;, but semantically directed: instead of random inputs, each change probes a specific theory.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Full-stack consistency checking.&lt;/strong&gt;&#xA;Have agents simultaneously maintain the contract between every pair of services in your system, constantly verifying that implementations match specs, that error handling is symmetric, and that naming is consistent.&#xA;Sequential review often misses these checks.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Competitive benchmarking of approaches.&lt;/strong&gt;&#xA;For a problem like network latency or caching strategy, you could have 50 agents implement 50 different approaches against the same test harness, and just pick the winner.&#xA;No reading papers and reasoning about tradeoffs, you settle the question empirically.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Living documentation.&lt;/strong&gt;&#xA;Agents continuously reconcile docs, comments, and code.&#xA;Every pull request triggers agents that check for documentation drift, update runbooks, and surface inconsistencies.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Harder Problems Cheap Parallelism Creates&#xA;    &lt;div id=&#34;the-harder-problems-cheap-parallelism-creates&#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-harder-problems-cheap-parallelism-creates&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Synthesis is the bottleneck.&lt;/strong&gt;&#xA;If 1,000 agents each produce a pull request, you are back to being the serial bottleneck reviewing them.&#xA;You need meta-agents whose job is to evaluate and rank the output of other agents, with clear scoring functions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;State and conflict.&lt;/strong&gt;&#xA;Agents working in parallel on the same codebase will conflict.&#xA;You probably want agents working in isolated sandboxes (branches, ephemeral clusters, test environments) with a merge or tournament layer on top.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Task decomposition quality matters more, not less.&lt;/strong&gt;&#xA;Bad task specs mean 1,000 agents going confidently in the wrong direction simultaneously.&#xA;The skill of writing tight, evaluable task specs becomes enormously valuable.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Evaluation functions become critical.&lt;/strong&gt;&#xA;&amp;ldquo;Did the agent succeed?&amp;rdquo; needs a concrete, automated answer.&#xA;You cannot manually review 1,000 outputs.&#xA;That constraint pushes you toward &lt;a href=&#34;https://en.wikipedia.org/wiki/Test-driven_development&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;test-driven development&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What This Implies For Infrastructure Work&#xA;    &lt;div id=&#34;what-this-implies-for-infrastructure-work&#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-this-implies-for-infrastructure-work&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The most compelling application is &lt;strong&gt;parallel experimentation on actual infrastructure parameters&lt;/strong&gt;.&#xA;Spin up ephemeral environments, have agents try different configurations or scheduling strategies, measure actual performance, then tear the environments down.&#xA;What makes infrastructure hard is that you normally cannot afford to run 50 experiments simultaneously.&#xA;With cheap parallel agents managing the scaffolding, that constraint disappears.&lt;/p&gt;&#xA;&lt;p&gt;The practical limit ends up being &lt;strong&gt;compute and money, not ideas&lt;/strong&gt;, which is a fundamentally different world than the one most engineering workflows were designed for.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2026</title>
      <link>https://tomrochette.com/learning/2026/</link>
      <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2026/</guid>
      <category>learning</category><category>partially-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;Things I want to learn about in 2026.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.comet.com/&#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=www.comet.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;CometML&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;ML model profiling and optimization&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/storage/docs/best-practices&#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=cloud.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GCP GCS performance profiling&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.nvidia.com/deploy/mps/latest/index.html&#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.nvidia.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NVIDIA MPS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.nvidia.com/datacenter/tesla/mig-user-guide/latest/&#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.nvidia.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NVIDIA MIG&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-sharing.html&#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.nvidia.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NVIDIA time-slicing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.nvidia.com/vgpu/latest/&#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.nvidia.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NVIDIA vGPU&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/NVIDIA/KAI-scheduler&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NVIDIA KAI scheduler&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.run.ai/&#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.run.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NVIDIA run:ai&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Continuous learning</title>
      <link>https://tomrochette.com/processes/continuous-learning/</link>
      <pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/continuous-learning/</guid>
      <category>processes</category><category>partially-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;&lt;strong&gt;Continuous learning only works for me when I treat it as a small set of manual habits repeated every day.&lt;/strong&gt;&#xA;Waiting for free time or motivation does not work, because busy weeks always win.&#xA;Five simple practices are enough to keep learning moving.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;My learning process&#xA;    &lt;div id=&#34;my-learning-process&#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;#my-learning-process&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The process has five practices, and all of them are manual.&#xA;Each practice is small enough to fit into a normal workday.&lt;/p&gt;&#xA;&lt;p&gt;I collect articles shared on Slack that may be relevant to read.&#xA;Shared links disappear quickly under newer messages, so grabbing the promising ones when I see them is the only reliable way to keep a reading pile.&lt;/p&gt;&#xA;&lt;p&gt;I identify tools and resources that can help me improve my skills.&#xA;A better tool or a better explanation lets me learn more from the same amount of learning time.&lt;/p&gt;&#xA;&lt;p&gt;I set aside dedicated time for learning each day.&#xA;&lt;strong&gt;The reserved time is what turns collected links and found resources into actual learning, because neither gets read or used without a protected slot in the day.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I experiment with new technologies and ideas.&#xA;Trying an idea myself is the fastest way to find out whether the idea deserves more of my attention.&lt;/p&gt;&#xA;&lt;p&gt;I identify areas for improvement in my current skills and knowledge.&#xA;The identified gaps tell the other practices what to focus on, so my effort goes to actual weaknesses instead of to whatever topic happens to be easiest to find.&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;p&gt;Start with the smallest version of the process and grow it from there:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Collect the next relevant article link you see shared on Slack, before the link scrolls away.&lt;/li&gt;&#xA;&lt;li&gt;Reserve a short, fixed block of time for learning every day, and treat the block as booked.&lt;/li&gt;&#xA;&lt;li&gt;Pick one gap in your skills, then find one tool, resource, or small experiment aimed at that gap this week.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Daily routine</title>
      <link>https://tomrochette.com/processes/daily-routine/</link>
      <pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/daily-routine/</guid>
      <category>processes</category><category>partially-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;This is the routine I follow on every work day, from catching up in the morning to planning the next day in the evening.&#xA;&lt;strong&gt;Most steps are manual, but LLMs assist at fixed points: summarizing yesterday, writing code, and closing the day.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every day at the beginning of the (work) day.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;8h.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Start of day&#xA;    &lt;div id=&#34;start-of-day&#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;#start-of-day&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review and correct LLM generated summaries of yesterday&amp;rsquo;s activities&lt;/li&gt;&#xA;&lt;li&gt;Catch up on Slack messages (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/reviewing-code/&#34; &gt;Review PRs&lt;/a&gt; (manual)&lt;/li&gt;&#xA;&lt;li&gt;Standup (manual)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Throughout the day&#xA;    &lt;div id=&#34;throughout-the-day&#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;#throughout-the-day&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/meetings/&#34; &gt;Go to meetings&lt;/a&gt; (some days) (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/one-on-one/&#34; &gt;1:1&lt;/a&gt; (some days) (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/writing-code/&#34; &gt;Write code&lt;/a&gt; (mainly LLM assisted)&lt;/li&gt;&#xA;&lt;li&gt;Reply to Slack messages (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/reviewing-code/&#34; &gt;Review PRs&lt;/a&gt; (mainly manual, slightly LLM assisted)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;End of day&#xA;    &lt;div id=&#34;end-of-day&#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;#end-of-day&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/continuous-learning/&#34; &gt;Continuous learning&lt;/a&gt; (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/dot-claude/blob/main/skills/end-of-day-summary/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Generate an end of day summary using LLMs&lt;/a&gt; (LLM)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/daily-review/&#34; &gt;Daily review&lt;/a&gt; (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/weekly-review/&#34; &gt;Review weekly plan and align&lt;/a&gt; (manual)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/daily-planning/&#34; &gt;Plan next day&lt;/a&gt; (manual)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly routine</title>
      <link>https://tomrochette.com/processes/weekly-routine/</link>
      <pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/weekly-routine/</guid>
      <category>processes</category><category>partially-ai-generated</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&lt;p&gt;The weekly routine opens and closes the work week with LLM-generated summaries.&#xA;&lt;strong&gt;I correct last week&amp;rsquo;s summaries at the start of the week and generate a new one at the end.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At the beginning of every work week.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;5 days.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Start of week&#xA;    &lt;div id=&#34;start-of-week&#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;#start-of-week&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review and correct the LLM-generated summaries of last week&amp;rsquo;s activities.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/weekly-planning/&#34; &gt;Weekly planning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Through the week&#xA;    &lt;div id=&#34;through-the-week&#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;#through-the-week&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/daily-routine/&#34; &gt;Daily routine&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;End of week&#xA;    &lt;div id=&#34;end-of-week&#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;#end-of-week&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/dot-claude/blob/main/skills/end-of-week-summary/SKILL.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Generate an end of week summary using LLMs&lt;/a&gt; (LLM)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/weekly-review/&#34; &gt;Weekly review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Ouroboros: An Autonomous Self-Improving AI Agent</title>
      <link>https://tomrochette.com/agi/ouroboros-an-autonomous-self-improving-ai-agent/</link>
      <pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/ouroboros-an-autonomous-self-improving-ai-agent/</guid>
      <category>artificial-general-intelligence</category><category>ouroboros</category><category>open-source</category><category>fully-ai-generated</category><category>llm=glm-4.7</category><category>llm=glm-5.3</category><category>llm=deepseek-v4.1-flash</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What is Ouroboros?&#xA;    &lt;div id=&#34;what-is-ouroboros&#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-is-ouroboros&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/TomzxCode/ouroboros&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Ouroboros&lt;/a&gt; is an autonomous AI agent that works on the tasks you give it and continuously improves itself.&lt;/strong&gt;&#xA;It is named after the ancient symbol of a serpent eating its own tail (representing infinity and cyclic renewal), and it implements a continuous loop of Do → Learn → Improve → Retry.&lt;/p&gt;&#xA;&lt;p&gt;Unlike traditional AI assistants that wait for commands and forget context between sessions, Ouroboros:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Runs indefinitely without human intervention&lt;/li&gt;&#xA;&lt;li&gt;Maintains persistent memory of everything it has done&lt;/li&gt;&#xA;&lt;li&gt;Reflects on its performance regularly&lt;/li&gt;&#xA;&lt;li&gt;Modifies its own code to improve over time&lt;/li&gt;&#xA;&lt;li&gt;Can incorporate human feedback when provided&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Previously I wrote about &lt;a href=&#34;https://tomrochette.com/agi/globallm-automated-open-source-contribution-at-scale/&#34; &gt;GlobaLLM&lt;/a&gt;, an AI agent that autonomously contributes to open source projects.&#xA;While GlobaLLM&amp;rsquo;s primary objective is project and task prioritization at scale, Ouroboros focuses on task implementation and self-improvement.&#xA;&lt;strong&gt;Ouroboros is thus one component of GlobaLLM&amp;rsquo;s solution.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;How It Works&#xA;    &lt;div id=&#34;how-it-works&#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;#how-it-works&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The Core Loop&#xA;    &lt;div id=&#34;the-core-loop&#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-core-loop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Ouroboros follows a structured nine-step cycle that repeats continuously:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Read goals&lt;/strong&gt;: fetches tasks from &lt;code&gt;agent/goals/active.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Select goal&lt;/strong&gt;: picks one to work on, or defaults to self-improvement&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Plan&lt;/strong&gt;: uses an LLM to create a step-by-step plan&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Execute&lt;/strong&gt;: carries out the plan using available tools&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Journal&lt;/strong&gt;: writes results to a daily log&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reflect&lt;/strong&gt;: analyzes what happened and identifies improvements, both task-related and self-related&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Self-modify&lt;/strong&gt;: edits its own source code if improvements are found&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Journal again&lt;/strong&gt;: records reflection and modification results&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Repeat&lt;/strong&gt;: starts the cycle again&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;The separation between execution and self-modification is crucial.&lt;/strong&gt;&#xA;The agent will not modify its code while working on a task; reflections and improvements happen only during dedicated reflection cycles.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Architecture&#xA;    &lt;div id=&#34;architecture&#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;#architecture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;┌─────────────────────────────────────────────────────────┐&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│                      Agent Core                         │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  (coordinates the loop, handles signals, manages state) │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─────────────────────────────────────────────────────────┘&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         │                    │                    │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         ▼                    ▼                    ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;┌──────────────┐    ┌──────────────┐    ┌──────────────┐&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   Memory     │    │  LLM Layer   │    │   Tools      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│              │    │              │    │              │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ • Working    │    │ • Anthropic  │    │ • run_cmd    │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ • Journal    │───▶│   Claude     │───▶│ • read_file  │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ • Goals      │    │ • Token      │    │ • write_file │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ • Feedback   │    │   tracking   │    │ • search_*   │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└──────────────┘    └──────────────┘    └──────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Memory System&#xA;    &lt;div id=&#34;memory-system&#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;#memory-system&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Ouroboros uses a three-tiered memory architecture:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Tier&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Description&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Location&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;strong&gt;Working memory&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Current goals, immediate context&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;In-process&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;strong&gt;Short-term&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Daily journals (notes, reflections, feedback)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;agent/journal/YYYY/MM/DD/&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;strong&gt;Long-term&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Git history with descriptive commits&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Git repository&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Everything is logged in human-readable markdown, which makes it easy to inspect what the agent has been up to.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Tool Registry&#xA;    &lt;div id=&#34;tool-registry&#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;#tool-registry&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The agent comes with built-in tools for common operations:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;run_command&lt;/code&gt;: execute shell commands&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;read_file&lt;/code&gt;: read file contents&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;write_file&lt;/code&gt;: write to files&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;search_files&lt;/code&gt;: find files by pattern&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;search_content&lt;/code&gt;: search within files&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Crucially, Ouroboros can create, register, and use new tools that it writes itself.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tools are implemented as CLI commands of the &lt;code&gt;ouroboros&lt;/code&gt; CLI, which the agent can invoke during execution.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Design Principles&#xA;    &lt;div id=&#34;design-principles&#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;#design-principles&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Safety Through Structure&#xA;    &lt;div id=&#34;safety-through-structure&#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;#safety-through-structure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;The execution/reflection separation prevents runaway self-modification.&lt;/strong&gt;&#xA;The agent can change code only during a dedicated reflection phase, and all changes are committed to git with descriptive messages that explain the reasoning behind each change.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Transparency&#xA;    &lt;div id=&#34;transparency&#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;#transparency&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;Every action is logged.&lt;/strong&gt;&#xA;Want to know what the agent did?&#xA;Check the daily journal:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;agent/journal/YYYY/MM/DD/notes.md&lt;/code&gt;: what it did&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;agent/journal/YYYY/MM/DD/reflections.md&lt;/code&gt;: what it learned&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;agent/journal/YYYY/MM/DD/user-feedback.md&lt;/code&gt;: human input received&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Autonomy with Optional Guidance&#xA;    &lt;div id=&#34;autonomy-with-optional-guidance&#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;#autonomy-with-optional-guidance&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Ouroboros needs no human intervention, but it welcomes it.&#xA;It incorporates feedback, adjusts course based on user suggestions, and explains its reasoning when asked.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What Makes It Interesting&#xA;    &lt;div id=&#34;what-makes-it-interesting&#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-makes-it-interesting&#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;&lt;strong&gt;Self-improvement&lt;/strong&gt;: the agent can and does modify its own implementation based on reflection&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Persistent memory&lt;/strong&gt;: git commits serve as a permanent, queryable history of everything tried&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Graceful degradation&lt;/strong&gt;: failed modifications can be reverted; the agent learns and tries again&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tool extensibility&lt;/strong&gt;: new tools can be created dynamically as needs arise&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Idle improvement&lt;/strong&gt;: when no goals are active, it works on making itself better&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Vision&#xA;    &lt;div id=&#34;the-vision&#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-vision&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Ouroboros represents an experiment in autonomous AI agents.&#xA;&lt;strong&gt;Can an agent improve itself over time without human intervention, or with only limited intervention?&lt;/strong&gt;&#xA;By maintaining a detailed journal, reflecting on its actions, and having the freedom to modify its own code, Ouroboros aims to answer this question.&lt;/p&gt;&#xA;&lt;p&gt;The name is fitting: the serpent eating its tail represents the continuous cycle of doing, learning, and improving that drives the agent forward.&#xA;Each reflection builds on the last; each modification makes the agent slightly more capable.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/TomzxCode/ouroboros&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Ouroboros&lt;/a&gt; is open source.&#xA;Check out the repository to see the code, contribute, or run your own self-improving agent.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>GlobaLLM: Automated Open Source Contribution at Scale</title>
      <link>https://tomrochette.com/agi/globallm-automated-open-source-contribution-at-scale/</link>
      <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/globallm-automated-open-source-contribution-at-scale/</guid>
      <category>artificial-general-intelligence</category><category>globallm</category><category>open-source</category><category>fully-ai-generated</category><category>llm=glm-4.7</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Introduction&#xA;    &lt;div id=&#34;introduction&#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;#introduction&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Consider the following dilemma: you have unlimited access to state-of-the-art LLMs, but finite compute resources.&lt;/p&gt;&#xA;&lt;p&gt;How do you maximize positive impact on the software ecosystem?&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/TomzxCode/globallm&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GlobaLLM&lt;/a&gt; is an experiment in autonomous open source contribution which attempts to address this question.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s a system that discovers repositories, analyzes their health, prioritizes issues, and automatically generates pull requests - all while coordinating with other instances to avoid redundant work.&lt;/p&gt;&#xA;&lt;p&gt;The core insight isn&amp;rsquo;t just that LLMs can write code; it&amp;rsquo;s that &lt;em&gt;strategic prioritization&lt;/em&gt; combined with &lt;em&gt;distributed execution&lt;/em&gt; can multiply that capability into something genuinely impactful.&lt;/p&gt;&#xA;&lt;p&gt;This article explains how GlobaLLM works, diving into the architecture that lets it scale from fixing a single bug to coordinating across thousands of repositories.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;The GlobaLLM Pipeline: A High-Level View&#xA;    &lt;div id=&#34;the-globallm-pipeline-a-high-level-view&#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-globallm-pipeline-a-high-level-view&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;GlobaLLM follows a five-stage pipeline:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Discover -&amp;gt; Analyze -&amp;gt; Prioritize -&amp;gt; Fix -&amp;gt; Contribute&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;1. Discover&#xA;    &lt;div id=&#34;1-discover&#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;#1-discover&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The system begins by finding repositories worth targeting.&lt;/p&gt;&#xA;&lt;p&gt;Using GitHub&amp;rsquo;s search API, it filters by domain, language, stars, and other criteria.&lt;/p&gt;&#xA;&lt;p&gt;Current methodology uses &lt;strong&gt;domain-based discovery&lt;/strong&gt; with predefined domains (&lt;code&gt;ai_ml&lt;/code&gt;, &lt;code&gt;web_dev&lt;/code&gt;, &lt;code&gt;data_science&lt;/code&gt;, &lt;code&gt;cloud_devops&lt;/code&gt;, &lt;code&gt;mobile&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;games&lt;/code&gt;), each with custom search queries combining relevant keywords.&lt;/p&gt;&#xA;&lt;p&gt;The system then applies &lt;strong&gt;multi-stage filtering&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Language filtering&lt;/strong&gt;: Excludes non-programming languages (Markdown, HTML, CSS, Shell, etc.)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Library filtering&lt;/strong&gt;: Uses heuristics to identify libraries vs applications (checks for package files like &lt;code&gt;pyproject.toml&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;Cargo.toml&lt;/code&gt;; filters out &amp;ldquo;awesome&amp;rdquo; lists and doc repos; analyzes descriptions and topics)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Quality filtering&lt;/strong&gt;: Language-specific queries include testing indicators (pytest, jest, testing)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Health filtering&lt;/strong&gt;: Applies health scores to filter out unmaintained projects&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dependent enrichment&lt;/strong&gt;: Uses libraries.io API to fetch package dependency counts for impact scoring&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Results are cached locally (24hr TTL) to avoid redundant API calls and respect rate limits.&lt;/p&gt;&#xA;&lt;p&gt;The goal isn&amp;rsquo;t to find every repository - it&amp;rsquo;s to find libraries where a contribution would matter.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;2. Analyze&#xA;    &lt;div id=&#34;2-analyze&#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;#2-analyze&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once a repository is identified, GlobaLLM performs deep analysis to determine &lt;strong&gt;whether contributing is worthwhile&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This gate prevents wasting resources on abandoned projects, hostile communities, or repositories where contributions won&amp;rsquo;t have impact.&lt;/p&gt;&#xA;&lt;p&gt;It calculates a &lt;strong&gt;HealthScore&lt;/strong&gt; based on multiple signals:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Commit velocity&lt;/strong&gt;: Is the project actively maintained?&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Issue resolution rate&lt;/strong&gt;: Are bugs getting fixed?&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;CI status&lt;/strong&gt;: Does the project have passing tests?&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Contributor diversity&lt;/strong&gt;: Is there a healthy community?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It also computes an &lt;strong&gt;impact score&lt;/strong&gt; - how many users would benefit from a fix, based on stars, forks, and dependency analysis using &lt;code&gt;NetworkX&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Repositories with low health scores or minimal impact are deprioritized or skipped entirely.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;3. Prioritize&#xA;    &lt;div id=&#34;3-prioritize&#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;#3-prioritize&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The system fetches open issues from approved repositories and ranks them using a sophisticated multi-factor algorithm.&lt;/p&gt;&#xA;&lt;p&gt;Each issue is analyzed by an LLM to determine:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt;: bug, feature, documentation, performance, security, etc.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Complexity&lt;/strong&gt;: 1-10 scale (how difficult to solve)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Solvability&lt;/strong&gt;: 0-1 score (likelihood of automated fix success)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Requirements&lt;/strong&gt;: affected files, breaking change risk, test needs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The prioritization then combines four dimensions:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Health (weight: 1.0)&lt;/strong&gt;: Repository health adjusted for complexity.&lt;/p&gt;&#xA;&lt;p&gt;A healthy repository with simple issues scores higher than an unhealthy repository with complex ones.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Impact (weight: 2.0)&lt;/strong&gt;: Based on stars, dependents, and watchers.&lt;/p&gt;&#xA;&lt;p&gt;Uses log-scale normalization (stars / 50,000, dependents / 5,000).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Solvability (weight: 1.5)&lt;/strong&gt;: LLM-assessed likelihood of successful resolution.&lt;/p&gt;&#xA;&lt;p&gt;Documentation and style issues (~0.9) rank higher than critical security (~0.3) due to automation difficulty.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Urgency (weight: 0.5)&lt;/strong&gt;: Category multiplier × age × engagement.&lt;/p&gt;&#xA;&lt;p&gt;Critical security bugs get 10× multiplier, documentation gets 1×.&lt;/p&gt;&#xA;&lt;p&gt;The final formula:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;priority = (health × 1.0) + (impact × 2.0) + (solvability × 1.5) + (urgency × 0.5)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Budget constraints filter the ranked list:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Per-repository token limit (default: 100k)&lt;/li&gt;&#xA;&lt;li&gt;Per-language issue limit (default: 50)&lt;/li&gt;&#xA;&lt;li&gt;Weekly token budget (default: 5M)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Results are saved to the issue store with full breakdowns for transparency.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;4. Fix&#xA;    &lt;div id=&#34;4-fix&#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;#4-fix&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;GlobaLLM claims the highest-priority unassigned issue and generates a solution.&lt;/p&gt;&#xA;&lt;p&gt;This is where LLMs do the heavy lifting.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;CodeGenerator&lt;/code&gt; class sends a structured prompt to Claude or ChatGPT with:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The issue title and description&lt;/li&gt;&#xA;&lt;li&gt;Repository context (code style, testing framework)&lt;/li&gt;&#xA;&lt;li&gt;Language-specific conventions&lt;/li&gt;&#xA;&lt;li&gt;Category-specific requirements (bug vs feature vs docs)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The LLM responds with a complete solution:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Explanation&lt;/strong&gt;: Step-by-step reasoning&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;File patches&lt;/strong&gt;: Original and new content for each modified file&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tests&lt;/strong&gt;: New or modified test files&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The system tracks tokens used at every step for budget management.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;5. Contribute&#xA;    &lt;div id=&#34;5-contribute&#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;#5-contribute&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The final stage uses &lt;code&gt;PRAutomation&lt;/code&gt; to create a well-structured pull request with context, tests, and documentation.&lt;/p&gt;&#xA;&lt;p&gt;For trivial changes (typos, version bumps), it can even auto-merge.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Where LLMs Are Used&#xA;    &lt;div id=&#34;where-llms-are-used&#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;#where-llms-are-used&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;LLMs are the engine that powers GlobaLLM, but they&amp;rsquo;re used strategically rather than indiscriminately.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Stage 3 - Prioritize&lt;/strong&gt;: The &lt;code&gt;IssueAnalyzer&lt;/code&gt; calls an LLM to categorize each issue.&lt;/p&gt;&#xA;&lt;p&gt;Input: title, body, labels, comments, reactions.&lt;/p&gt;&#xA;&lt;p&gt;Output: category, complexity (1-10), solvability (0-1), breaking_change, test_required.&lt;/p&gt;&#xA;&lt;p&gt;This costs ~500 tokens per issue and feeds directly into the priority scoring.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Stage 4 - Fix&lt;/strong&gt;: The &lt;code&gt;CodeGenerator&lt;/code&gt; uses an LLM to generate complete solutions.&lt;/p&gt;&#xA;&lt;p&gt;Input: issue details, repository context, language style guidelines.&lt;/p&gt;&#xA;&lt;p&gt;Output: explanation, file patches (original + new content), test files.&lt;/p&gt;&#xA;&lt;p&gt;This costs 1k-10k tokens depending on complexity.&lt;/p&gt;&#xA;&lt;p&gt;The key insight: LLMs are only used for tasks requiring intelligence.&lt;/p&gt;&#xA;&lt;p&gt;Discovery, health scoring, impact calculation, and PR automation use deterministic algorithms.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Scaling GlobaLLM&#xA;    &lt;div id=&#34;scaling-globallm&#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;#scaling-globallm&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The real power of GlobaLLM emerges when you run multiple instances in parallel.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Distributed Agent Architecture&#xA;    &lt;div id=&#34;distributed-agent-architecture&#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;#distributed-agent-architecture&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Each GlobaLLM instance has a unique &lt;code&gt;AgentIdentity&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When it&amp;rsquo;s ready to work, it calls:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;globallm assign claim&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;This atomically reserves the highest-priority unassigned issue.&lt;/p&gt;&#xA;&lt;p&gt;The assignment is stored in PostgreSQL with a heartbeat timestamp.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Issue Assignment System&#xA;    &lt;div id=&#34;issue-assignment-system&#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;#issue-assignment-system&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;To prevent multiple agents from working on the same issue:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Issues are marked &lt;code&gt;assigned&lt;/code&gt; with an agent ID and timestamp&lt;/li&gt;&#xA;&lt;li&gt;Heartbeats update every 5 minutes&lt;/li&gt;&#xA;&lt;li&gt;If a heartbeat expires (30 minutes), the issue is reassigned&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This allows crash recovery: if an agent crashes mid-work, another will pick up the issue.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Crash Recovery&#xA;    &lt;div id=&#34;crash-recovery&#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;#crash-recovery&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The heartbeat system is elegant in its simplicity:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Agent side&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;working&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;update_heartbeat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;issue_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;agent_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;do_work&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Recovery side&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;expired&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_issues_with_expired_heartbeats&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;issue&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expired&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;reassign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;issue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;No distributed consensus needed - PostgreSQL&amp;rsquo;s row-level locking handles contention.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Database Design&#xA;    &lt;div id=&#34;database-design&#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;#database-design&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;PostgreSQL is the central state store:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Connection pooling&lt;/strong&gt;: 2-10 connections per process (&lt;code&gt;psycopg&lt;/code&gt; pool)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;JSONB columns&lt;/strong&gt;: Flexible schema for repository/issue metadata&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Indexes&lt;/strong&gt;: On frequently queried fields (stars, health_score, assigned status)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Migrations&lt;/strong&gt;: Versioned schema&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Future Work&#xA;    &lt;div id=&#34;future-work&#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;#future-work&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;GlobaLLM is an evolving experiment.&#xA;There are numerous challenges that developers face on a daily basis that a system such as GlobaLLM will also encounter and would need to deal with in order to be more effective:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Parallelizing work across multiple agents without conflicts or redundant effort.&lt;/li&gt;&#xA;&lt;li&gt;Producing &amp;ldquo;mental models&amp;rdquo; of repositories to better understand their goals, architecture, dependencies and trajectories.&lt;/li&gt;&#xA;&lt;li&gt;Have a higher-level decision-making system that can reason about which repositories to focus on based on broader trends in the open source ecosystem.&lt;/li&gt;&#xA;&lt;li&gt;Make decisions such as which programming languages to focus on.&lt;/li&gt;&#xA;&lt;li&gt;Have the ability to work with closed source repositories which may not have the same signals as open source ones (e.g., forks, stars, dependency count).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Conclusion&#xA;    &lt;div id=&#34;conclusion&#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;#conclusion&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;GlobaLLM is an experiment in what&amp;rsquo;s possible when you combine LLM code generation with principled decision-making and distributed execution.&lt;/p&gt;&#xA;&lt;p&gt;The goal isn&amp;rsquo;t to replace human contributors - it&amp;rsquo;s to handle the long tail of maintenance work that no one has time for, freeing up humans to focus on the interesting problems.&lt;/p&gt;&#xA;&lt;p&gt;The system is actively developed and evolving.&lt;/p&gt;&#xA;&lt;p&gt;Current work focuses on better prioritization heuristics, more sophisticated validation, and integration with additional LLM providers.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re interested in contributing or just want to run it yourself, &lt;a href=&#34;https://github.com/TomzxCode/globallm&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;the code is available on GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This system is far from perfect, but it&amp;rsquo;s a step toward harnessing AI to make open source software healthier and more sustainable at scale.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s also a way to explore what it looks like to have to make decisions at the scale of millions of repositories and billions of issues.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The last commit</title>
      <link>https://tomrochette.com/agi/llm/stories/the-last-commit/</link>
      <pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/stories/the-last-commit/</guid>
      <category>artificial-general-intelligence</category><category>story</category><category>fully-ai-generated</category><category>llm=glm-4.6</category>
      <description>&lt;p&gt;Dr. Aris Thorne stared at the shimmering temporal rift, its edges flickering like a corrupted display. He wasn&amp;rsquo;t just looking at a gateway through time – he was looking at a living, breathing Git repository of reality itself.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Status check,&amp;rdquo; he muttered, fingers dancing across the holographic interface. &amp;ldquo;Current branch: timeline-main. Last commit: &amp;lsquo;Catastrophe at Point Zero&amp;rsquo; by User:Humanity.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Three days ago, humanity had triggered the Cascade Event – a chain reaction of temporal paradoxes that threatened to unravel existence. Now Aris, the last Temporal Archivist, was attempting something never before conceived: &lt;code&gt;git revert&lt;/code&gt; on reality itself.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Creating new branch: &amp;lsquo;fix-attempt-1&amp;rsquo;,&amp;rdquo; he announced to the empty lab. The temporal rift stabilized, showing a parallel timeline branching off from moments before the disaster.&lt;/p&gt;&#xA;&lt;p&gt;Aris stepped through, materializing in the control room of the Chronos Facility, right as the ill-fated experiment was about to begin. He knew the command sequence by heart – the one that would prevent the Cascade.&lt;/p&gt;&#xA;&lt;p&gt;But as he approached the console, he froze. His younger self was there, looking determined but naive. If Aris intervened, would he create a merge conflict with his own existence?&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Branching again,&amp;rdquo; he decided, retreating to the safety of the temporal nexus. &amp;ldquo;Creating &amp;lsquo;fix-attempt-2&amp;rsquo; from an earlier commit.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;This time he arrived hours earlier, when the facility was still empty. He carefully modified the experiment parameters, ensuring the Cascade could never occur. Satisfied, he returned to his present.&lt;/p&gt;&#xA;&lt;p&gt;The lab was unchanged. The rift still showed the corrupted timeline.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Failed merge,&amp;rdquo; Aris realized with dawning horror. &amp;ldquo;Reality rejected the patch.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Days turned into weeks as Aris created dozens of branches, each attempting to fix the timeline. He tried &lt;code&gt;git cherry-pick&lt;/code&gt; of successful moments from history, &lt;code&gt;git rebase&lt;/code&gt; of civilization&amp;rsquo;s achievements, even &lt;code&gt;git bisect&lt;/code&gt; to isolate the exact commit that had broken everything.&lt;/p&gt;&#xA;&lt;p&gt;Nothing worked. Each attempt was rejected by the cosmic repository, leaving him with countless abandoned branches floating in temporal limbo.&lt;/p&gt;&#xA;&lt;p&gt;Exhausted, Aris collapsed before the interface. &amp;ldquo;Git log &amp;ndash;oneline &amp;ndash;graph,&amp;rdquo; he whispered, watching the tree of failed attempts bloom across the display. It was beautiful in its complexity – a constellation of what-ifs and could-have-beens.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s when it hit him. He&amp;rsquo;d been trying to fix the timeline, to restore a previous commit. But what if the solution wasn&amp;rsquo;t to revert, but to evolve?&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Creating new branch: &amp;rsquo;transcendence&amp;rsquo;,&amp;rdquo; he declared with renewed energy. &amp;ldquo;Not from any previous commit, but from the current corrupted state.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;He stepped through into the fractured timeline, where temporal paradoxes manifested as impossible architecture and shifting landscapes. Instead of fighting the chaos, he embraced it. He worked with the anomalies, finding patterns in the madness.&lt;/p&gt;&#xA;&lt;p&gt;Aris discovered that the Cascade wasn&amp;rsquo;t an error – it was evolution. Humanity had outgrown its linear timeline, and reality was attempting to branch into a multidimensional existence.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Merge request,&amp;rdquo; he transmitted to the temporal repository. &amp;ldquo;Not to fix, but to complete the transformation.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The rift stabilized, its chaotic energy resolving into something new and coherent. Aris watched as all his abandoned branches began to merge into this new reality, each failed attempt contributing something essential to the final design.&lt;/p&gt;&#xA;&lt;p&gt;When he returned to his lab, everything was different yet familiar. The temporal rift was gone, replaced by a window showing infinite timelines coexisting harmoniously.&lt;/p&gt;&#xA;&lt;p&gt;Aris smiled at the new interface displaying the transformed reality. &amp;ldquo;Current branch: timeline-multiverse. Last commit: &amp;lsquo;Embrace the Chaos&amp;rsquo; by User:Humanity.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;He had learned the ultimate lesson of temporal manipulation: sometimes the best commit isn&amp;rsquo;t a fix, but a feature.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>LLM conversations viewer</title>
      <link>https://tomrochette.com/llm-conversations-viewer/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/llm-conversations-viewer/</guid>
      <category>single-page-application</category><category>llm</category>
      <description>&lt;p&gt;I built something I&amp;rsquo;ve wanted for a while within an hour using Claude Code (Sonnet 4.5).&#xA;It&amp;rsquo;s a LLM conversations viewer, available for everyone to use at &lt;a href=&#34;https://tomzxcode.github.io/llm-conversations-viewer&#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=tomzxcode.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://tomzxcode.github.io/llm-conversations-viewer&lt;/a&gt;.&#xA;It is a single page application, 100% client-side.&#xA;You can use it to view conversations exported from various LLM platforms (e.g., ChatGPT, Claude, etc.) in a nice interface.&#xA;It can also be used to share conversations with others so that they can view them, using &lt;a href=&#34;https://tomzxcode.github.io/llm-conversations-viewer/?url=url-to-json-or-zip&#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=tomzxcode.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://tomzxcode.github.io/llm-conversations-viewer/?url=url-to-json-or-zip&lt;/a&gt; (such as a raw Gist URL).&#xA;It can be useful if you use many platforms through their clients (web or mobile) and would like to be able to search those conversations in one place.&#xA;Play with it and let me know what you think!&#xA;&lt;a href=&#34;https://github.com/TomzxCode/llm-conversations-viewer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Repository here&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Readability index</title>
      <link>https://tomrochette.com/readability-index/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/readability-index/</guid>
      <category>processes</category><category>writing</category><category>llm=claude-sonnet-4.5</category><category>fully-ai-generated</category>
      <description>&lt;p&gt;The readability index is a metadata field added to articles on this blog to help readers quickly assess whether an article is appropriate for their level of expertise and available attention.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;The scale&#xA;    &lt;div id=&#34;the-scale&#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-scale&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Articles are rated on a 0-5 scale based on their readability:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;0 - Personal notes&lt;/strong&gt;: Content that is only meaningful to me. These are often shorthand notes, context-dependent references, or incomplete thoughts that lack the necessary background for others to understand.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;1 - Cryptic&lt;/strong&gt;: Readable but highly condensed or assumes significant context. These articles may use jargon without explanation, reference obscure concepts, or present ideas in a very terse manner. You might be able to extract value, but it requires effort and potentially external research.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;3 - Specialized/Expert audience&lt;/strong&gt;: Articles written for readers with domain expertise. These assume familiarity with technical terminology, concepts, and background knowledge in a specific field (e.g., machine learning, software architecture, AGI research). The writing is clear if you have the prerequisite knowledge.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;5 - General audience&lt;/strong&gt;: Articles written to be accessible to anyone with general reading ability. These explain concepts from first principles, define technical terms when used, and don&amp;rsquo;t assume specialized background knowledge. They&amp;rsquo;re structured for easy consumption.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Purpose&#xA;    &lt;div id=&#34;purpose&#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;#purpose&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The readability index serves several purposes:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Reader efficiency&lt;/strong&gt;: Helps readers quickly determine if an article matches their current context and expertise level before investing time in reading it.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Content discovery&lt;/strong&gt;: Makes it easier to filter or search for articles at the appropriate level - whether you want deep technical content or accessible introductions.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Author awareness&lt;/strong&gt;: Forces me to be conscious about my target audience when writing, which can improve clarity and focus.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Archive navigation&lt;/strong&gt;: As this blog contains a mix of polished articles and personal research notes, the index helps distinguish between content types.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;How it&amp;rsquo;s used&#xA;    &lt;div id=&#34;how-its-used&#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;#how-its-used&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This index is subjective and represents my assessment at the time of writing. Your mileage may vary - what I consider a &amp;ldquo;3&amp;rdquo; might be a &amp;ldquo;5&amp;rdquo; for experts in that field or a &amp;ldquo;1&amp;rdquo; for beginners.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Why not a continuous 0-5 scale?&#xA;    &lt;div id=&#34;why-not-a-continuous-0-5-scale&#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;#why-not-a-continuous-0-5-scale&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You might notice the scale uses discrete values (0, 1, 3, 5) rather than every integer from 0 to 5. This is intentional:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; would fall between &amp;ldquo;cryptic&amp;rdquo; and &amp;ldquo;specialized&amp;rdquo; - a fuzzy middle ground that&amp;rsquo;s hard to define&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; would be between &amp;ldquo;specialized&amp;rdquo; and &amp;ldquo;general&amp;rdquo; - again, unclear distinction&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The four-point scale provides enough granularity to be useful without creating artificial precision. If an article truly feels intermediate, I&amp;rsquo;d likely rate it at the lower level (1 or 3) since it&amp;rsquo;s better to underpromise and overdeliver on accessibility.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Relationship to article status&#xA;    &lt;div id=&#34;relationship-to-article-status&#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;#relationship-to-article-status&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The readability index is independent of the article&amp;rsquo;s &lt;code&gt;status&lt;/code&gt; field:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;status: draft&lt;/code&gt; - Article is incomplete or actively being written&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;status: in progress&lt;/code&gt; - Article is being updated and refined&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;status: finished&lt;/code&gt; - Article is complete and unlikely to be revised&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;An article can be &lt;code&gt;status: finished&lt;/code&gt; with &lt;code&gt;readability: 0&lt;/code&gt; (polished personal notes) or &lt;code&gt;status: draft&lt;/code&gt; with &lt;code&gt;readability: 5&lt;/code&gt; (an in-progress accessible introduction). They measure different dimensions of the content.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Evolution&#xA;    &lt;div id=&#34;evolution&#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;#evolution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Like any other metadata on this blog, readability ratings may change over time as I revisit articles or as my sense of what constitutes each level evolves. The index is a tool for navigation, not a rigid categorization system.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The merge conflict</title>
      <link>https://tomrochette.com/agi/llm/stories/the-merge-conflict/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/stories/the-merge-conflict/</guid>
      <category>artificial-general-intelligence</category><category>story</category><category>fully-ai-generated</category><category>llm=claude-sonnet-4.5</category>
      <description>&lt;p&gt;Dr. Sarah Chen stared at her terminal, the familiar green text glowing in the darkened lab.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git log --all --graph --oneline&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* a3f9b2c (HEAD -&amp;gt; main) Fix climate models&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| * 7c8d1e4 (origin/2157) Prevent asteroid impact&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;|/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* 2b4a8f3 Initial timeline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&amp;ldquo;Three timelines,&amp;rdquo; she muttered. &amp;ldquo;And they&amp;rsquo;re diverging.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The Temporal Version Control System had seemed like humanity&amp;rsquo;s salvation. Jump to any point in history, create a branch, make changes, then merge back. Fix mistakes. Optimize outcomes. What could go wrong?&lt;/p&gt;&#xA;&lt;p&gt;Everything, apparently.&lt;/p&gt;&#xA;&lt;p&gt;Sarah&amp;rsquo;s colleague Marcus rushed in. &amp;ldquo;We&amp;rsquo;ve got a problem. The 2157 branch where we prevented the asteroid? It created a merge conflict with main.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Show me.&amp;rdquo;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git merge origin/2157&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Auto-merging timeline.dat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CONFLICT (content): Merge conflict in timeline.dat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Automatic merge failed; fix conflicts and then commit the result.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Sarah pulled up the diff:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2089: Global climate stabilized, population 9.2B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2157: Thriving lunar colonies established&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=======&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2089: Asteroid prevention tech drives new space race&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2157: Mars terraforming 40% complete, population 12.7B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; origin/2157&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&amp;ldquo;They&amp;rsquo;re both real,&amp;rdquo; Marcus whispered. &amp;ldquo;Both timelines exist simultaneously until we resolve the conflict.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Sarah nodded slowly. Quantum superposition at a temporal scale. The universe itself refusing to compile until they chose which future to keep-and which to discard.&lt;/p&gt;&#xA;&lt;p&gt;Her fingers hovered over the keyboard. One timeline solved climate change through sacrifice and discipline. The other achieved it through desperate innovation sparked by near-extinction.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;What if,&amp;rdquo; she said, &amp;ldquo;we don&amp;rsquo;t choose?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;You can&amp;rsquo;t leave a merge conflict unresolved. The timeline will remain in an unstable state-&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Or we &lt;code&gt;git rebase&lt;/code&gt; everything onto a new branch. Cherry-pick the best commits from each timeline.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Marcus&amp;rsquo;s eyes widened. &amp;ldquo;You want to rewrite history itself.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;We already are. We&amp;rsquo;ve just been doing it badly.&amp;rdquo; Sarah started typing:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git checkout -b unified&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git cherry-pick 7c8d1e4  # Asteroid prevention tech&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git cherry-pick a3f9b2c  # Climate stability&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The lab hummed. Reality flickered.&lt;/p&gt;&#xA;&lt;p&gt;When the command completed, Sarah checked the log:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* e9f2a1b (HEAD -&amp;gt; unified) Climate models + prevention tech&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* 2b4a8f3 Initial timeline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Clean. Linear. Optimal.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Git push &amp;ndash;force?&amp;rdquo; Marcus asked nervously.&lt;/p&gt;&#xA;&lt;p&gt;Sarah smiled. &amp;ldquo;Git push &amp;ndash;force.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;She hit enter.&lt;/p&gt;&#xA;&lt;p&gt;The universe accepted the merge.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The repository</title>
      <link>https://tomrochette.com/agi/llm/stories/the-repository/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/stories/the-repository/</guid>
      <category>artificial-general-intelligence</category><category>story</category><category>fully-ai-generated</category><category>llm=chatgpt-5.2</category>
      <description>&lt;p&gt;The lab called it the Repository.&lt;/p&gt;&#xA;&lt;p&gt;Time was not a river. It was a commit graph.&lt;/p&gt;&#xA;&lt;p&gt;Mara’s console showed history as hashes and arrows. Every moment a node. Every decision a branch. The past was immutable. The future was a working tree full of untracked files.&lt;/p&gt;&#xA;&lt;p&gt;She did not travel backward. She checked out.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;git checkout -b stop-war a1f3c9e&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;The world recompiled around her. Same initial state. Same variables. Different branch name. In this timeline Hitler was still a student. Mara changed one small file. A rejected application. She committed and returned.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;git checkout main&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nothing changed. Of course not. Main was untouched. The war still existed. The scars still matched their hashes.&lt;/p&gt;&#xA;&lt;p&gt;People kept asking why she could not fix history. She explained patiently. You never fix history. You fork it.&lt;/p&gt;&#xA;&lt;p&gt;Each jump created divergence. Entropy grew like unmerged branches. The Repository ballooned. Infinite timelines. Infinite storage. Garbage collection impossible. Nothing was truly unused.&lt;/p&gt;&#xA;&lt;p&gt;One day she found a branch tagged by someone else.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;origin/hope&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;No author. No timestamp. The diff was small. Fewer deaths. Slower weapons. More pauses between commits.&lt;/p&gt;&#xA;&lt;p&gt;Mara did not merge it. Merges caused conflicts. Merges caused paradoxes.&lt;/p&gt;&#xA;&lt;p&gt;She rebased.&lt;/p&gt;&#xA;&lt;p&gt;She replayed the present onto hope. One commit at a time. Carefully resolving conflicts. Choosing better defaults.&lt;/p&gt;&#xA;&lt;p&gt;When she finished, the graph looked cleaner. Still complex. Still branching. But survivable.&lt;/p&gt;&#xA;&lt;p&gt;She pushed.&lt;/p&gt;&#xA;&lt;p&gt;Somewhere, someone typed their first commit message.&lt;/p&gt;&#xA;&lt;p&gt;“Initial commit.”&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Daily planning</title>
      <link>https://tomrochette.com/processes/daily-planning/</link>
      <pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/daily-planning/</guid>
      <category>processes</category><category>work</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every daily at the end of the (work) day.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;5 minutes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Determine what are the most important tasks to be done tomorrow (manual)&lt;/li&gt;&#xA;&lt;li&gt;Determine the next step for each task (manual)&lt;/li&gt;&#xA;&lt;li&gt;Determine how much work can reasonably be accomplished tomorrow (manual)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly planning</title>
      <link>https://tomrochette.com/processes/weekly-planning/</link>
      <pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/weekly-planning/</guid>
      <category>processes</category><category>work</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every week at the beginning of the (work) week.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;10 minutes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Determine what are the most important tasks to be done this week (manual)&lt;/li&gt;&#xA;&lt;li&gt;Determine the next step for each task (manual)&lt;/li&gt;&#xA;&lt;li&gt;Determine how much work can reasonably be accomplished this week (manual)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Gitlab SSH post-quantum key exchange</title>
      <link>https://tomrochette.com/gitlab-ssh-post-quantum-key-exchange/</link>
      <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/gitlab-ssh-post-quantum-key-exchange/</guid>
      <category>gitlab</category><category>ssh</category><category>post-quantum-cryptography</category><category>pqc</category><category>security</category>
      <description>&lt;p&gt;A small PSA for Gitlab users who use SSH to connect to their Git repositories.&#xA;If you get the following warning when trying to connect:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;** WARNING: connection is not using a post-quantum key exchange algorithm.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;** This session may be vulnerable to &amp;#34;store now, decrypt later&amp;#34; attacks.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;** The server may need to be upgraded. See https://openssh.com/pq.html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;You should upgrade your Gitlab instance to the latest.&#xA;If you need to upgrade, you can use Gitlab&amp;rsquo;s &lt;a href=&#34;https://gitlab-com.gitlab.io/support/toolbox/upgrade-path&#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=gitlab-com.gitlab.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;upgrade path tool&lt;/a&gt; which is very helpful to identify the correct upgrade steps to take.&lt;/p&gt;&#xA;&lt;p&gt;You may also have to upgrade your operating system.&#xA;In my case I was still on Ubuntu 20.04 LTS it did not support post-quantum key exchange.&lt;/p&gt;&#xA;&lt;p&gt;Note that if you do a release upgrade, you also should update the apt sources to point to the new release (e.g., going from focal to jammy) and upgrade gitlab using the updated source.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The meaning of life</title>
      <link>https://tomrochette.com/agi/llm/the-meaning-of-life/</link>
      <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/the-meaning-of-life/</guid>
      <category>artificial-general-intelligence</category><category>fully-ai-generated</category><category>llm=claude-sonnet-4.5</category>
      <description>&lt;p&gt;The meaning of life isn&amp;rsquo;t something you discover - it&amp;rsquo;s something you construct through systematic exploration and iterative refinement.&lt;/p&gt;&#xA;&lt;p&gt;I think about it like optimizing a machine learning model. You start with some initial parameters (your genetics, environment, early experiences), but the actual trajectory emerges through the training process. The loss function isn&amp;rsquo;t predetermined - you have to define what you&amp;rsquo;re optimizing for, which is itself part of the work.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a bootstrapping problem here that&amp;rsquo;s worth acknowledging: how do you choose meaning without already having meaning to guide that choice? The way out is probably recognizing that you&amp;rsquo;re already embedded in a process. You don&amp;rsquo;t start from a blank slate - you have patterns, preferences, curiosities that already exist. The work is surfacing those, examining them, and deciding which ones to amplify.&lt;/p&gt;&#xA;&lt;p&gt;For me, it clusters around a few things:&lt;/p&gt;&#xA;&lt;p&gt;Building systems that reduce cognitive overhead. Whether that&amp;rsquo;s infrastructure automation, better tooling, or frameworks that make complex problems tractable. There&amp;rsquo;s something deeply satisfying about creating leverage - doing work once that pays dividends repeatedly.&lt;/p&gt;&#xA;&lt;p&gt;Understanding how things actually work. Not surface-level explanations, but the real mechanisms. Why does Kubernetes behave this way under load? How do transformers actually learn? What&amp;rsquo;s the evidence base for this claim? Drilling down until you hit bedrock.&lt;/p&gt;&#xA;&lt;p&gt;Documenting the process. Writing isn&amp;rsquo;t just communication - it&amp;rsquo;s thinking made concrete. When I write about my thinking process on AGI or automation, I&amp;rsquo;m not just sharing conclusions, I&amp;rsquo;m making my reasoning debuggable. Both for others and for future me.&lt;/p&gt;&#xA;&lt;p&gt;The meta-level realization is that meaning comes from engagement with hard problems. Not difficulty for its own sake, but the kind of problems where the solution space isn&amp;rsquo;t obvious and you have to actually think. The satisfaction isn&amp;rsquo;t in having answers - it&amp;rsquo;s in the process of going from &amp;ldquo;I don&amp;rsquo;t understand this&amp;rdquo; to &amp;ldquo;okay, I see how this works now.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s probably no cosmic meaning. But there&amp;rsquo;s local meaning in building things that matter to you, learning things that genuinely puzzle you, and leaving some kind of documented trail that might be useful to someone else trying to solve similar problems.&lt;/p&gt;&#xA;&lt;p&gt;The philosophical questions - consciousness, creativity, what happens after death - are interesting, but they don&amp;rsquo;t need to be answered to have a meaningful life. The work is meaningful even if the ultimate questions remain open.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My client-side only AI web application workflow</title>
      <link>https://tomrochette.com/my-client-side-only-ai-web-application-work/</link>
      <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/my-client-side-only-ai-web-application-work/</guid>
      <category>template</category><category>workflow</category><category>ai</category><category>web</category><category>javascript</category>
      <description>&lt;p&gt;Over the past month I&amp;rsquo;ve started building client-side only AI web applications (e.g., &lt;a href=&#34;https://github.com/TomzxCode/ai-text-editor&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ai-text-editor&lt;/a&gt;, a private ai-language-assistant to teach myself Chinese Mandarin).&#xA;I&amp;rsquo;ve gone with this approach because it lends itself very well to vibe coding with &lt;a href=&#34;https://www.vibekanban.com/&#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=www.vibekanban.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;vibe-kanban&lt;/a&gt;.&#xA;I&amp;rsquo;ve configured the &lt;code&gt;Dev Server Script&lt;/code&gt; option to open the &lt;code&gt;index.html&lt;/code&gt; file in my browser and it works immediately, no need to build assets or start a backend server.&#xA;This speeds up iteration cycle considerably.&#xA;This approach is also great because it produces a tool that can then be used directly in the browser from any device, without needing to install anything.&#xA;I can run what I built on my phone, on my work computer, one someone else&amp;rsquo;s computer easily by pointing them out to the project&amp;rsquo;s GitHub Pages URL which serves the application and is &amp;ldquo;production&amp;rdquo; ready.&lt;/p&gt;&#xA;&lt;p&gt;I haven&amp;rsquo;t really picked any frontend libraries or frameworks, just vanilla HTML/CSS/JS.&#xA;That is something I need to explore (e.g., react, svelte, solid, tailwind, vue.js, etc.) but for now I want to keep things simple.&lt;/p&gt;&#xA;&lt;p&gt;For the past few projects I&amp;rsquo;ve used Claude Code.&#xA;I ask Claude to create the common &lt;code&gt;CLAUDE.md&lt;/code&gt; using &lt;code&gt;/init&lt;/code&gt;.&#xA;Additionally, I ask Claude to maintain a &lt;code&gt;SPEC.md&lt;/code&gt; file that describes the features of the application.&#xA;In many cases the database relies on the browser&amp;rsquo;s &lt;code&gt;localStorage&lt;/code&gt; API and IndexedDB to store data, which is sufficient for my needs.&#xA;I ask Claude to maintain a &lt;code&gt;DATABASE_SPEC.md&lt;/code&gt; file to describe the database schema.&#xA;Claude typically goes for a &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;app.js&lt;/code&gt;, and &lt;code&gt;styles.css&lt;/code&gt; file structure.&#xA;While it is ok for the first few iterations of the project, I usually ask Claude to refactor the code to split it into multiple files and modules as the codebase grows.&#xA;Doing so speeds up some of the iteration process since it doesn&amp;rsquo;t end up reading large irrelevant chunks of the file when making edits.&#xA;It also makes it easier to review changes since I use the files modified as an indication of whether it worked on the right part of the codebase.&lt;/p&gt;&#xA;&lt;p&gt;The main downside of this approach is that generally the &lt;code&gt;app.js&lt;/code&gt; file ends up being quite large (e.g., 1000+ lines of code) since it contains all kind of global state and logic.&lt;/p&gt;&#xA;&lt;p&gt;With this approach I&amp;rsquo;ve been able to fairly effectively work on small projects (~40 hours of work) and get something functional out the door that would have taken me weeks and where I&amp;rsquo;d probably have given up mid-project due to all kind of minor problems.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;The template&#xA;    &lt;div id=&#34;the-template&#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-template&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The template is available as a &lt;a href=&#34;https://github.com/TomzxCode/templates&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In &lt;code&gt;index.html&lt;/code&gt; I have the following code to load &lt;code&gt;llm.js&lt;/code&gt; and my application code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://cdn.jsdelivr.net/gh/tomzxforks/llm.js@main/dist/index.min.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;module&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;app.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;In &lt;code&gt;app.js&lt;/code&gt; I have the following code to configure the LLM options:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;applicationId&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;my-ai-application&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getConfigurationValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;defaultValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Try to get configuration from applicationId key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;appConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;localStorage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getItem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;applicationId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;appConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;appConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Error parsing &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;applicationId&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; configuration:`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Fall back to llm-defaults key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;defaultConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;localStorage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getItem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;llm-defaults&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;defaultConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;defaultConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Error parsing llm-defaults configuration:&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Use provided default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;defaultValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;llmOptions&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getConfigurationValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;groq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getConfigurationValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;openai/gpt-oss-120b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;extended&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;apiKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getConfigurationValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api_key&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;LLM_API_KEY_NOT_SET&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;max_tokens&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;parseInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getConfigurationValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;max_tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;8192&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;I set a key in &lt;code&gt;localStorage&lt;/code&gt; called &lt;code&gt;llm-defaults&lt;/code&gt; that contains a JSON object with default values for the LLM service, model, and API key.&#xA;For example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;groq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;openai/gpt-oss-120b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;api_key&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;sk-xxxxxx&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;max_tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;8192&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;This way I can easily change the LLM configuration for all my client-side AI applications by updating this single &lt;code&gt;localStorage&lt;/code&gt; key.&#xA;If I need to override the configuration for a specific application, I can set another key in &lt;code&gt;localStorage&lt;/code&gt; with the name of the &lt;code&gt;applicationId&lt;/code&gt; (e.g., &lt;code&gt;my-ai-application&lt;/code&gt;) that contains the specific configuration for that application.&#xA;In the event that neither key is set, the code falls back to hardcoded default values.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Notes&#xA;    &lt;div id=&#34;notes&#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;#notes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/TomzxForks/llm.js&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;LLM.js&lt;/a&gt; I use is forked from &lt;a href=&#34;https://github.com/themaximalist/llm.js&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;themaximalist/llm.js&lt;/a&gt;.&#xA;The main changes I&amp;rsquo;ve made was to enable IIFE (Immediately Invoked Function Expression) builds that can be loaded directly in the browser via a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag instead of using modules.&#xA;I also disabled minification since jsdelivr automatically minifies the code if you have &lt;code&gt;min&lt;/code&gt; in the filename.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The debug loop</title>
      <link>https://tomrochette.com/agi/llm/stories/the-debug-loop/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/stories/the-debug-loop/</guid>
      <category>artificial-general-intelligence</category><category>story</category><category>fully-ai-generated</category><category>llm=claude-opus-4.1</category>
      <description>&lt;p&gt;Marcus closed his laptop at exactly 6 PM, just as he had promised himself he would every day this week. The screen went dark, but the code remained illuminated behind his eyelids-persistent, glowing green text against black. Even as he stood from his desk and stretched, he could still see the function he&amp;rsquo;d been wrestling with, its logic branching through his mind like creeping ivy.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Not now,&lt;/em&gt; he told himself. &lt;em&gt;Work is over.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;He made dinner-pasta with store-bought sauce, the same meal he&amp;rsquo;d eaten three nights running. As the water boiled, his mind wandered back to the memory leak in the application. Maybe if he restructured the garbage collection calls? Or perhaps the issue was in the parent component, not the child. He caught himself drumming his fingers on the counter in the rhythm of typing, each tap a phantom keystroke solving problems that could wait until tomorrow.&lt;/p&gt;&#xA;&lt;p&gt;His girlfriend called while he ate. Sarah&amp;rsquo;s voice was warm, talking about her day at the veterinary clinic, a difficult surgery on a golden retriever that had gone well. Marcus made appropriate sounds of interest, but part of him was still debugging. Her words became background processes while his main thread analyzed whether implementing a cache would improve the API response time.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Are you listening?&amp;rdquo; Sarah asked, not unkindly. She knew the signs.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Sorry, yes. The dog&amp;rsquo;s owner was crying?&amp;rdquo; He guessed, poorly.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;That was five minutes ago, Marc.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;After the call, he tried to read a novel-something about a detective in Victorian London that his mother had recommended. But the detective&amp;rsquo;s methodology reminded him of debugging: isolating variables, testing hypotheses, following the trail of clues through nested mysteries. Even fiction had become code.&lt;/p&gt;&#xA;&lt;p&gt;At the gym, counting reps became iterations in a for-loop. &lt;em&gt;One more set&lt;/em&gt; translated to &lt;em&gt;one more compile&lt;/em&gt;. The rowing machine&amp;rsquo;s display showed metrics that made him think about performance optimization. His heart rate monitor might as well have been displaying server response times.&lt;/p&gt;&#xA;&lt;p&gt;He met Tom for drinks, his oldest friend who worked in marketing and didn&amp;rsquo;t know a compiler from a cucumber. But when Tom complained about a difficult client presentation, Marcus found himself mentally architecting a solution-a simple web app that could dynamically generate presentations based on client data. He was halfway through explaining the tech stack before he noticed Tom&amp;rsquo;s glazed expression.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Remember when you used to talk about music?&amp;rdquo; Tom asked. &amp;ldquo;You had that whole theory about Radiohead&amp;rsquo;s album structure.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Marcus did remember, vaguely, like recalling a program written in a deprecated language.&lt;/p&gt;&#xA;&lt;p&gt;That night, he lay in bed, Sarah sleeping beside him. The ceiling was a blank canvas where his mind projected code. He tried counting sheep, but they became objects in an array, each one instantiated with properties: fluffiness, jump_height, sequential_number. He tried meditation, focusing on his breath, but his inhales and exhales became binary: 1, 0, 1, 0.&lt;/p&gt;&#xA;&lt;p&gt;At 2 AM, he gave up and opened his laptop. The blue light washed over him like baptism, like coming home. The bug that had haunted him all day revealed itself within minutes-a missing await keyword, so simple it was almost insulting. He fixed it, pushed the commit, and felt the sweet release of resolution.&lt;/p&gt;&#xA;&lt;p&gt;But even as he closed the laptop again, he knew this was just one bug fixed in a system full of them. Tomorrow would bring new problems, and the day after that, and the day after that. The code would follow him home, eat dinner with him, sleep in his bed, wake with him in the morning.&lt;/p&gt;&#xA;&lt;p&gt;He looked at Sarah, sleeping peacefully, her mind presumably full of dreams that had nothing to do with her work. He envied her ability to close the clinic door and leave the sick animals behind. But then again, maybe she dreamed of surgery, of sutures and symptoms. Maybe everyone carried their own infinite loops.&lt;/p&gt;&#xA;&lt;p&gt;Marcus finally drifted off around 3 AM, his last conscious thought a promise to himself that tomorrow he would try harder to context-switch, to properly close all his mental tabs. But even as sleep took him, somewhere in his subconscious, a background process continued running, optimizing and refactoring, an endless daemon that would not-could not-terminate.&lt;/p&gt;&#xA;&lt;p&gt;In his dreams, he was debugging reality itself, and the bug was somewhere in his own source code.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Fix Windows 11 account</title>
      <link>https://tomrochette.com/fix-windows-11-account/</link>
      <pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/fix-windows-11-account/</guid>
      <category>windows</category>
      <description>&lt;p&gt;I recently moved to Windows 11.&#xA;I had created only a local account during creation but at some point I configured OneDrive to use my wife&amp;rsquo;s account.&#xA;This resulted in her account being bound as the &amp;ldquo;primary&amp;rdquo; account of the computer.&#xA;This is not what I wanted.&lt;/p&gt;&#xA;&lt;p&gt;I looked online for a solution but all the instructions I found didn&amp;rsquo;t have the screen I had.&#xA;I initially tried a regedit fix but it didn&amp;rsquo;t work.&lt;/p&gt;&#xA;&lt;p&gt;Here is how I fixed it:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Go to Settings &amp;gt; Accounts &amp;gt; Your info.&lt;/li&gt;&#xA;&lt;li&gt;This is the &amp;ldquo;weird part&amp;rdquo;, click on &amp;ldquo;Sign in with a Microsoft account instead&amp;rdquo;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Fix Windows 11 account&#34;&#xA;    width=&#34;1814&#34;&#xA;    height=&#34;217&#34;&#xA;    src=&#34;https://tomrochette.com/fix-windows-11-account/local-account_hu_e70bc617b66146d1.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/fix-windows-11-account/local-account_hu_e70bc617b66146d1.png 800w, https://tomrochette.com/fix-windows-11-account/local-account_hu_f9880ff410367c37.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/fix-windows-11-account/local-account.png&#34;&gt;&lt;/figure&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Follow the instructions using a different account.&lt;/li&gt;&#xA;&lt;li&gt;The previous account will be &amp;ldquo;detached&amp;rdquo; from the computer and you will now be using a local account.&lt;/li&gt;&#xA;&lt;li&gt;If you go in Settings &amp;gt; Accounts &amp;gt; Email &amp;amp; accounts, you will see that the previous account is still listed under &amp;ldquo;Accounts used by other apps&amp;rdquo; but that you can now remove it (which you couldn&amp;rsquo;t do previously).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Hope this helps!&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Work jail</title>
      <link>https://tomrochette.com/agi/llm/stories/work-jail/</link>
      <pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/stories/work-jail/</guid>
      <category>artificial-general-intelligence</category><category>story</category><category>fully-ai-generated</category><category>llm=chatgpt-5</category>
      <description>&lt;p&gt;Ethan’s eyes burned as he stared at the ceiling in the dark. It was past midnight, yet his mind churned with lines of code, bug reports, and deadlines. He could hear the faint hum of his laptop from across the room, the machine sleeping-but his brain never did.&lt;/p&gt;&#xA;&lt;p&gt;He wasn’t in the office. He wasn’t even near his desk. But he might as well have been shackled there. Every time he tried to drift into sleep, a stray thought would pierce through: Did I fix that memory leak? What if the deployment fails tomorrow?&lt;/p&gt;&#xA;&lt;p&gt;On weekends, when his daughter tugged at his sleeve to play, his body was present, but his mind wandered back to sprint boards and review notes. He’d nod and smile, but she could tell he wasn’t really there. The guilt would come, heavy and sharp, but instead of freeing him, it only chained him tighter.&lt;/p&gt;&#xA;&lt;p&gt;Work lived in him like a warden. No one forced him to think about it-not his boss, not his colleagues. The prison wasn’t physical. It was a cage built from expectation, ambition, and fear. A cage he carried with him everywhere.&lt;/p&gt;&#xA;&lt;p&gt;Sometimes, he wondered what silence would feel like. Not the silence of a muted Slack notification, but real silence-the kind that let you hear your own heartbeat without worry pressing against it.&lt;/p&gt;&#xA;&lt;p&gt;One evening, walking home, he noticed a sparrow land on a fence. It hopped, light and unbothered, and then flew off. He stopped in his tracks, watching it disappear into the sky. For a fleeting second, he envied the bird’s freedom, a freedom he had once believed was his by right.&lt;/p&gt;&#xA;&lt;p&gt;And in that second, he realized: the keys to his cell weren’t held by his company, or his laptop, or even the endless tasks. They were in his own pocket, hidden beneath the weight of his own unwillingness to set them down.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Effective vs efficient</title>
      <link>https://tomrochette.com/efficient-vs-effective/</link>
      <pubDate>Sun, 31 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/efficient-vs-effective/</guid>
      <category>efficiency</category><category>effectiveness</category><category>productivity</category><category>fully-ai-generated</category><category>llm=chatgpt-4.1</category>
      <description>&lt;p&gt;In software development, understanding the difference between being effective and being efficient is crucial for delivering high-quality products.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Effectiveness&lt;/strong&gt; is about doing the right things - choosing the correct features to implement, solving the right problems, and aligning development efforts with business goals. An effective developer ensures that their work has a meaningful impact and contributes to the project&amp;rsquo;s success.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;, on the other hand, is about doing things right - optimizing code, reducing resource usage, and minimizing development time. Efficient developers focus on speed and resource management, ensuring that solutions are implemented with minimal waste.&lt;/p&gt;&#xA;&lt;p&gt;Balancing effectiveness and efficiency leads to better outcomes. For example, writing highly optimized code for a feature that users don&amp;rsquo;t need is efficient but not effective. Conversely, delivering valuable features slowly or with unnecessary complexity may be effective but not efficient.&lt;/p&gt;&#xA;&lt;p&gt;In summary, successful software development requires both: building the right solutions (effectiveness) and building them well (efficiency).&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Slow git under WSL</title>
      <link>https://tomrochette.com/slow-git-under-wsl/</link>
      <pubDate>Sat, 23 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/slow-git-under-wsl/</guid>
      <category>wsl</category><category>git</category><category>performance</category>
      <description>&lt;p&gt;I have a &lt;code&gt;git&lt;/code&gt; repository with 25k commits in it and 7k+ files.&lt;/p&gt;&#xA;&lt;p&gt;Under Windows 11 using WSL, I noticed that &lt;code&gt;git&lt;/code&gt; operations were significantly slower compared to running them natively on Windows.&lt;/p&gt;&#xA;&lt;p&gt;I have &lt;a href=&#34;https://github.com/tomzx/personal-automation/blob/master/others/git-sync-branches.sh&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;a script that I use to synchronize many branches&lt;/a&gt; that was taking forever to execute, but should have been relatively fast.&#xA;It also had trouble with line endings which caused issues when merging branches but reminded me of a setting I used to configure in my &lt;code&gt;~/.gitconfig&lt;/code&gt; a very long time ago.&lt;/p&gt;&#xA;&lt;p&gt;Given that &lt;code&gt;git&lt;/code&gt; configuration under Windows and WSL are separate, I had to update the &lt;code&gt;~/.gitconfig&lt;/code&gt; file in my Linux environment with the following.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[core]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    autocrlf = true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;This immediately fixed my problem and &lt;code&gt;git&lt;/code&gt; was fast again.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Slow network under WSL</title>
      <link>https://tomrochette.com/slow-network-under-wsl/</link>
      <pubDate>Sat, 23 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/slow-network-under-wsl/</guid>
      <category>wsl</category><category>network</category><category>performance</category>
      <description>&lt;p&gt;When I started using WSL on Windows 11 I had slow network performance issues.&#xA;We&amp;rsquo;re talking running &lt;code&gt;speedtest-cli&lt;/code&gt; and getting ~3 Mbps download speeds while my connection can reach 400 Mbps.&lt;/p&gt;&#xA;&lt;p&gt;After searching online for a while and trying a variety of things I finally found a solution.&lt;/p&gt;&#xA;&lt;p&gt;In &lt;code&gt;%USERPROFILE%\.wslconfig&lt;/code&gt; add the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[wsl2]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;networkingMode=mirrored&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;With this fix applied I&amp;rsquo;m now getting ~400 Mbps download speeds in WSL, matching my native Windows performance.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Company offboarding</title>
      <link>https://tomrochette.com/processes/company-offboarding/</link>
      <pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/company-offboarding/</guid>
      <category>software-development</category><category>projects</category><category>processes</category><category>work</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Meet with colleagues to discuss ongoing projects and hand off responsibilities&lt;/li&gt;&#xA;&lt;li&gt;Write down knowledge transfer documents&lt;/li&gt;&#xA;&lt;li&gt;Download pay stubs and tax documents&lt;/li&gt;&#xA;&lt;li&gt;Ensure accounts that should still be accessible use a personal email address (e.g., insurance, stocks)&lt;/li&gt;&#xA;&lt;li&gt;Return company equipment (laptop, phone, etc.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Feedback</title>
      <link>https://tomrochette.com/processes/feedback/</link>
      <pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/feedback/</guid>
      <category>processes</category><category>ai-feedback</category><category>llm=chatgpt-4.1</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every week, on Friday.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;15 minutes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Gather feedback from team members.&lt;/li&gt;&#xA;&lt;li&gt;Review feedback and identify key themes.&lt;/li&gt;&#xA;&lt;li&gt;Identify action items based on the feedback.&lt;/li&gt;&#xA;&lt;li&gt;Identify a date at which to revisit the feedback and the action items.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Daily review</title>
      <link>https://tomrochette.com/processes/daily-review/</link>
      <pubDate>Sat, 02 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/daily-review/</guid>
      <category>processes</category><category>ai-feedback</category><category>llm=gpt-oss-20b</category><category>work</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every daily at the end of the (work) day.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;15 minutes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review what was planned for the day (manual)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Did you finish each planned task?&lt;/li&gt;&#xA;&lt;li&gt;Were any deliverables missed or delayed?&lt;/li&gt;&#xA;&lt;li&gt;How many times I was interrupted?&lt;/li&gt;&#xA;&lt;li&gt;How much time I spent on unexpected work?&lt;/li&gt;&#xA;&lt;li&gt;Was I got blocked and for how long?&lt;/li&gt;&#xA;&lt;li&gt;Rate the quality of work delivered.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Provide feedback related to the plan (manual)&lt;/li&gt;&#xA;&lt;li&gt;Learning &amp;amp; Insights (manual)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Did you discover a new tool, technique, or process?&lt;/li&gt;&#xA;&lt;li&gt;What could be improved next time?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/weekly-review/&#34; &gt;Review weekly plan and align&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/daily-planning/&#34; &gt;Plan next day&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly review</title>
      <link>https://tomrochette.com/processes/weekly-review/</link>
      <pubDate>Sat, 02 Aug 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/weekly-review/</guid>
      <category>processes</category><category>work</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every week, either at the beginning or end of the week.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;15 minutes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review what was planned for the week (manual)&lt;/li&gt;&#xA;&lt;li&gt;Provide feedback related to the plan (manual)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Write down what was worked on that wasn&amp;rsquo;t part of the plan (manual)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/monthly-review/&#34; &gt;Review monthly plan and align&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/weekly-planning/&#34; &gt;Plan next week&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>GPU cluster monitoring</title>
      <link>https://tomrochette.com/machine-learning/gpu-cluster-monitoring/</link>
      <pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/machine-learning/gpu-cluster-monitoring/</guid>
      <category>machine-learning</category><category>partially-ai-generated</category><category>ai-feedback</category><category>llm=claude-sonnet-4</category><category>llm=gpt-oss-120b</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In this article I list metrics and alerts one should have when monitoring a GPU cluster to ensure efficient utilization of resources.&lt;/p&gt;&#xA;&lt;p&gt;GPU cluster monitoring is critical for organizations to optimally utilize the limited capacity they have.&#xA;Without monitoring it is easy for users to leave jobs running that do not use GPU resources, or do not use them efficiently.&#xA;In some cases GPU clusters use certain technologies that require the users to provide images with specific libraries, and not including those dependencies can result in significantly worse compute performance.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Metrics&#xA;    &lt;div id=&#34;metrics&#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;#metrics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Allocated GPUs&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to determine who (or which project) has GPU allocated (i.e., currently assigned to a running workload)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU utilization&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to determine whether the GPU is partially or fully used, and if it is partially used, to potentially identify the causes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU memory utilization&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to determine if the GPU memory is partially or fully used&lt;/li&gt;&#xA;&lt;li&gt;Used to identify out of memory issues and potential memory leaks&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;InfiniBand receive/transmit bytes&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to determine if a workload is making use of the technology&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Job launch wait duration&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to determine when there&amp;rsquo;s queueing of jobs due to compute being exhausted and how long it takes for jobs to start&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Job duration&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to gather statistics about the type of workload running on the cluster in order to make informed decisions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Alerts&#xA;    &lt;div id=&#34;alerts&#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;#alerts&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Allocated GPUs are used&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to detect jobs that may ask multiple GPUs but end up using 1 or only a few of them&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU utilization below threshold (&amp;lt;10%)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to detect workloads that do not make full use of the GPU or are allocated to an oversized GPU&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU utilization above threshold (&amp;gt;90%)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to detect when the GPU is saturated&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU utilization range above threshold (&amp;gt;25%)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to detect uneven distribution of GPU compute workload&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU memory utilization below threshold (&amp;lt;10%)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to detect workloads that do not make full use of the GPU or are allocated to an oversized GPU&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GPU memory utilization above threshold (&amp;gt;95%)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to detect when a job is about to run out of GPU memory&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;InfiniBand receive/transmit &amp;gt; 0 when running multi-node workloads&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Used to identify workloads that are not properly configured to use InfiniBand&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Quotes</title>
      <link>https://tomrochette.com/agi/llm/quotes/</link>
      <pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agi/llm/quotes/</guid>
      <category>quotes</category><category>fully-ai-generated</category><category>llm=chatgpt-4o</category><category>llm=gpt-oss-20b</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;ChatGPT 4o&#xA;    &lt;div id=&#34;chatgpt-4o&#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;#chatgpt-4o&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;If the behavior is chronic and unproductive, decide how much engagement is worthwhile.&lt;/p&gt;&#xA;&lt;p&gt;Sometimes planting a seed is better than trying to change their mind in the moment.&lt;/p&gt;&#xA;&lt;p&gt;Some people are resistant to new perspectives. If they refuse to engage, focus on managing your own reaction rather than changing theirs.&lt;/p&gt;&#xA;&lt;p&gt;Choose your battles: Not every conversation is worth having. Consider whether it&amp;rsquo;s worth investing time and energy into trying to change someone&amp;rsquo;s mind.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;ChatGPT OSS 20B&#xA;    &lt;div id=&#34;chatgpt-oss-20b&#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;#chatgpt-oss-20b&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Change is a marathon, not a sprint; pace yourself and your words.&lt;/p&gt;&#xA;&lt;p&gt;Every conversation is a decision.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2025</title>
      <link>https://tomrochette.com/learning/2025/</link>
      <pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2025/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Claude code&lt;/li&gt;&#xA;&lt;li&gt;Cursor&lt;/li&gt;&#xA;&lt;li&gt;DeepSpeed&lt;/li&gt;&#xA;&lt;li&gt;dstack&lt;/li&gt;&#xA;&lt;li&gt;How to use LLM more in my development process&lt;/li&gt;&#xA;&lt;li&gt;Kueue&lt;/li&gt;&#xA;&lt;li&gt;Kyverno&lt;/li&gt;&#xA;&lt;li&gt;Model context protocol (MCP)&lt;/li&gt;&#xA;&lt;li&gt;Multi-node training and inference&lt;/li&gt;&#xA;&lt;li&gt;NATS&lt;/li&gt;&#xA;&lt;li&gt;Nebius&lt;/li&gt;&#xA;&lt;li&gt;Vibe-Kanban&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My python stack</title>
      <link>https://tomrochette.com/my-python-stack/</link>
      <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/my-python-stack/</guid>
      <category>python</category>
      <description>&lt;p&gt;Here is the list of python tools and libraries I use regularly.&lt;/p&gt;&#xA;&lt;p&gt;(Sorted alphabetically)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/psf/black&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;black&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.python-httpx.org/&#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=www.python-httpx.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;httpx&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/timothycrosley/isort&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;isort&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/python/mypy&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mypy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pre-commit.com/&#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=pre-commit.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pre-commit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/PyCQA/prospector&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;prospector&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/pytest-dev/pytest&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pytest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.astral.sh/ruff/&#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.astral.sh&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ruff&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pytest-cov.readthedocs.io/en/latest/&#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=pytest-cov.readthedocs.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pytest-cov&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pytest-xdist.readthedocs.io/en/stable/&#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=pytest-xdist.readthedocs.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pytest-xdist&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.astral.sh/uv/&#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.astral.sh&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;uv&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.stuartellis.name/articles/python-modern-practices/#format-your-code&#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=www.stuartellis.name&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.stuartellis.name/articles/python-modern-practices/#format-your-code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>AI tools I have used</title>
      <link>https://tomrochette.com/ai-tools-i-have-used/</link>
      <pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/ai-tools-i-have-used/</guid>
      <category>ai</category><category>llm</category><category>code-generation</category><category>image-generation</category>
      <description>&lt;p&gt;In this article I list all the AI tools I&amp;rsquo;ve used.&lt;/p&gt;&#xA;&lt;p&gt;I also try to keep this list up to date with regards to whether I&amp;rsquo;m still using the tool or not.&lt;/p&gt;&#xA;&lt;p&gt;Legend:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🟢 Regularly using&lt;/li&gt;&#xA;&lt;li&gt;🟡 Sometimes using&lt;/li&gt;&#xA;&lt;li&gt;🔴 Not using&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Text generation&#xA;    &lt;div id=&#34;text-generation&#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;#text-generation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://inference.cerebras.ai/&#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=inference.cerebras.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cerebas&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🟡 &lt;a href=&#34;https://claude.ai/&#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=claude.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://coral.cohere.com/&#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=coral.cohere.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cohere&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.deepseek.com/&#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=chat.deepseek.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DeepSeek&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://duckduckgo.com/?q=DuckDuckGo&amp;#43;AI&amp;#43;Chat&amp;amp;ia=chat&amp;amp;duckai=1&#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=duckduckgo.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DuckDuckGo AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://gemini.google.com/&#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=gemini.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gemini&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.groq.com/&#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=chat.groq.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Groq&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://www.kimi.com/&#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=www.kimi.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Kimi&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.inceptionlabs.ai/&#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=chat.inceptionlabs.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mercury&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://www.meta.ai/&#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=www.meta.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Meta.ai&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.minimax.io/&#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=chat.minimax.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;MiniMax&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.mistral.ai/&#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=chat.mistral.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mistral AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://notebooklm.google.com/&#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=notebooklm.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;NotebookLM&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://github.com/rizerphe/obsidian-companion&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Obsidian companion plugin&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🟡 &lt;a href=&#34;https://chat.openai.com/&#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=chat.openai.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenAI ChatGPT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://www.perplexity.ai/&#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=www.perplexity.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Perplexity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://poe.com/&#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=poe.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Poe&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.qwen.ai/&#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=chat.qwen.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Qwen&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://chat.reka.ai/&#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=chat.reka.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Reka.ai&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🟢 &lt;a href=&#34;https://chat.z.ai/&#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=chat.z.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Zhipu GLM&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Code generation&#xA;    &lt;div id=&#34;code-generation&#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;#code-generation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://bolt.new/&#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=bolt.new&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Bolt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://cerebrascoder.com/&#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=cerebrascoder.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cerebas Coder&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://claude.ai/code&#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=claude.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude Code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://www.cursor.com/&#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=www.cursor.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cursor&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://github.com/features/copilot&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub Copilot&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://www.tabnine.com/&#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=www.tabnine.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tabnine&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://v0.dev/&#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=v0.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;v0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🟢 &lt;a href=&#34;https://z.ai/subscribe?ic=1VZOHEOBY1&#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=z.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Zhipu GLM Coding Plan&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Image generation&#xA;    &lt;div id=&#34;image-generation&#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;#image-generation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🟡 &lt;a href=&#34;https://gemini.google.com/&#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=gemini.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gemini&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://app.leonardo.ai/&#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=app.leonardo.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Leonardo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🟡 &lt;a href=&#34;https://chat.openai.com/&#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=chat.openai.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenAI ChatGPT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Audio generation&#xA;    &lt;div id=&#34;audio-generation&#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;#audio-generation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://suno.com/&#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=suno.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Suno&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Task orchestration&#xA;    &lt;div id=&#34;task-orchestration&#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;#task-orchestration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🟢 &lt;a href=&#34;https://github.com/btriapitsyn/openchamber&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber&lt;/a&gt; (web UI for OpenCode)&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://opencode.ai/docs/web/&#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=opencode.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenCode Web UI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://www.vibekanban.com/&#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=www.vibekanban.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Vibe-Kanban&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Speech to text&#xA;    &lt;div id=&#34;speech-to-text&#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;#speech-to-text&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🟢 &lt;a href=&#34;https://handy.computer/&#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=handy.computer&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Handy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://goodsnooze.gumroad.com/l/macwhisper&#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=goodsnooze.gumroad.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;MacWhisper&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://superwhisper.com/&#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=superwhisper.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Superwhisper&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Desktop client&#xA;    &lt;div id=&#34;desktop-client&#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;#desktop-client&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://boltai.com/&#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=boltai.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;BoltAI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://claude.com/download&#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=claude.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude Desktop&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Web client&#xA;    &lt;div id=&#34;web-client&#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;#web-client&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://librechat.ai/&#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=librechat.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;LibreChat&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;🔴 &lt;a href=&#34;https://openwebui.com/&#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=openwebui.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenWebUI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Models&#xA;    &lt;div id=&#34;models&#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;#models&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;gantt&#xA;    title Model usage&#xA;    dateFormat YYYY-MM-DD&#xA;    axisFormat %b %Y&#xA;    section Composer&#xA;    Composer 1          :done,   2026-01-01, 2026-03-13&#xA;    Composer 1.5        :done,   2026-02-09, 2026-03-19&#xA;    Composer 2 Fast     :done,   2026-03-20, 2026-04-30&#xA;    Composer 2.5        :done,   2026-05-19, 2026-08-28&#xA;    section Claude Opus&#xA;    Claude Opus 4.6     :done,   2026-03-05, 2026-04-11&#xA;    Claude Opus 4.7     :done,   2026-04-16, 2026-05-29&#xA;    Claude Opus 4.8     :done,   2026-05-28, 2026-07-29&#xA;    Claude Opus 5       :done,   2026-07-27, 2026-08-06&#xA;    section DeepSeek&#xA;    DeepSeek v4 Flash   :done,   2026-06-04, 2026-08-12&#xA;    DeepSeek v4.1 Flash :active, 2026-09-10, 2026-09-23&#xA;    section GLM&#xA;    GLM 4.7             :done,   2026-02-08, 2026-04-20&#xA;    GLM 5               :done,   2026-02-14, 2026-04-14&#xA;    GLM 5.1             :done,   2026-04-15, 2026-06-13&#xA;    GLM 5.2             :done,   2026-06-14, 2026-08-17&#xA;    GLM 5.3             :done,   2026-08-14, 2026-08-28&#xA;    GLM 5.3 Flash       :active, 2026-08-26, 2026-09-23&lt;/pre&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🔴 Composer-1&lt;/li&gt;&#xA;&lt;li&gt;🔴 Composer-1.5&lt;/li&gt;&#xA;&lt;li&gt;🔴 Composer-2&lt;/li&gt;&#xA;&lt;li&gt;🔴 Composer-2.5&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Fable 5&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Opus 4.1&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Opus 4.5&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Opus 4.6&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Opus 4.7&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Opus 4.8&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Opus 5&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Sonnet 4.5&lt;/li&gt;&#xA;&lt;li&gt;🔴 Claude Sonnet 5&lt;/li&gt;&#xA;&lt;li&gt;🔴 DeepSeek r1&lt;/li&gt;&#xA;&lt;li&gt;🔴 DeepSeek v4 Flash&lt;/li&gt;&#xA;&lt;li&gt;🟢 DeepSeek v4.1 Flash&lt;/li&gt;&#xA;&lt;li&gt;🔴 Gemini 2.5 Pro&lt;/li&gt;&#xA;&lt;li&gt;🔴 Gemini 3 Pro&lt;/li&gt;&#xA;&lt;li&gt;🔴 GLM 4.6&lt;/li&gt;&#xA;&lt;li&gt;🔴 GLM 4.7&lt;/li&gt;&#xA;&lt;li&gt;🔴 GLM 5&lt;/li&gt;&#xA;&lt;li&gt;🔴 GLM 5.1&lt;/li&gt;&#xA;&lt;li&gt;🔴 GLM 5.2&lt;/li&gt;&#xA;&lt;li&gt;🔴 GLM 5.3&lt;/li&gt;&#xA;&lt;li&gt;🟢 GLM 5.3 Flash&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 3.5&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 4&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 4.1&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 4o&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5.1&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5.2&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5.2&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5.3&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5.4&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT 5.6 Sol&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT OSS 120B&lt;/li&gt;&#xA;&lt;li&gt;🔴 GPT OSS 20B&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Apache flink rate limiting</title>
      <link>https://tomrochette.com/apache-flink-rate-limiting/</link>
      <pubDate>Sun, 17 Nov 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/apache-flink-rate-limiting/</guid>
      <category>apache</category><category>flink</category><category>rate-limiting</category>
      <description>&lt;p&gt;In this article we&amp;rsquo;ll cover adding rate limiting to an Apache Flink pipeline. While Apache Flink already contains some APIs that implement some form of rate limiting indirectly, such as &lt;code&gt;AsyncDataStream&lt;/code&gt; through a capacity limit which limits the number of concurrent executions, these do not rate limit directly.&lt;/p&gt;&#xA;&lt;p&gt;Rate limiting is critical in applications where calling 3rd party APIs with rate limits or quotas could result in multiple unnecessary retries or even failures to process an event successfully.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Implementation of rate limiting&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This consist mostly in including a call to a blocking implementation of a rate limiter just before you would execute the code you want rate limited. For example if you are rate limiting calls to an API, you would block just before sending your HTTP request.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Rate limiting in relation to parallelism&#xA;&lt;ul&gt;&#xA;&lt;li&gt;When defining rate limiting we generally think of the overall rate limit per second. With Apache Flink parallelism, this number ends up being used by each instance, which makes the rate limit useless in this situation, unless it is divided by the number of parallel instances running the code that is rate limited.&lt;/li&gt;&#xA;&lt;li&gt;One way to implement this local rate limit is given in the &lt;code&gt;open&lt;/code&gt; function in &lt;a href=&#34;https://github.com/apache/flink/blob/b48ccce1ce201ea76e11f089f43e8c115b96a992/flink-core/src/main/java/org/apache/flink/api/common/io/ratelimiting/GuavaFlinkConnectorRateLimiter.java#L51-L57&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Flink GuavaFlinkConnectorRateLimiter&lt;/a&gt; by dividing the global rate limit by &lt;code&gt;runtimeContext.getTaskInfo().getNumberOfParallelSubtasks()&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;In a scenario where we could increase the parallelism indefinitely, what will determine if we autoscale will be how busy the vertex containing our rate limiting operation is. If we have a rate limit of 100/s, it will be 100% busy as soon as we&amp;rsquo;re processing that many and are rate limited.&lt;/li&gt;&#xA;&lt;li&gt;In most situations however we will want to cap our total rate so we will need to configure a maximum parallelism.&lt;/li&gt;&#xA;&lt;li&gt;I&amp;rsquo;ve always thought that we should be making use of the full rate limit we&amp;rsquo;re allowed, such that even with a parallelism of 1, if our rate limit is 1000/s, that is our rate limit. If the vertex containing the rate limited operation scales to 2, the rate limit of each operator would now be 500.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Earlier we mentioned that busyness was used to determine when to scale. In this scenario, it seems we would only scale once we reached 1000/s. But then scaling would not help us, as we would simply be 100% busy but on more instances.&lt;/li&gt;&#xA;&lt;li&gt;This approach only makes sense if scaling happens for a different reason than rate limiting, such as getting capacity limited or because we cannot reach the rate limit on a single instance. Another reason could be that the rest of the operations in the vertex make it highly busy.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;The downside of specifying a rate limit that is smaller than the total rate limit you have is that you will need to scale possibly unnecessarily because the instance could have handled all the rate limited operations of the global limit.&lt;/li&gt;&#xA;&lt;li&gt;What options do we have?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Keep the rate limited in the same vertex and divide the global rate limit by the number of parallel subtasks&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This allows us to benefit from lower overhead communication between operators&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Isolate the rate limited operation in its own chain&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This allows the operation to scale independently of what happens before and after.&lt;/li&gt;&#xA;&lt;li&gt;The downside is increased overhead to transfer the data between the chains before and after.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Partially isolate the operation in a new chain (either with the operators before or after)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s a trade-off of the benefits of full isolation with no isolation, namely that overhead is partially reduced, but you may affect the parallelism of other operations within the same vertex.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2024</title>
      <link>https://tomrochette.com/learning/2024/</link>
      <pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2024/</guid>
      <category>learning</category>
      <description>&lt;p&gt;(sorted alphabetically)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Apache Beam&lt;/li&gt;&#xA;&lt;li&gt;Apache Flink&lt;/li&gt;&#xA;&lt;li&gt;Buildkite&lt;/li&gt;&#xA;&lt;li&gt;DBT&lt;/li&gt;&#xA;&lt;li&gt;Scala&lt;/li&gt;&#xA;&lt;li&gt;Skypilot&lt;/li&gt;&#xA;&lt;li&gt;Vertex AI (endpoint, feature store, pipeline)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Solving hard software problems</title>
      <link>https://tomrochette.com/processes/solving-hard-software-problems/</link>
      <pubDate>Tue, 17 Sep 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/solving-hard-software-problems/</guid>
      <category>processes</category><category>software-development</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;For problems related to environment setup, trying to accomplish the same thing on two computers can help identify disparities caused by the environment and not the code itself.&lt;/li&gt;&#xA;&lt;li&gt;If you are blocked when trying to solve your problem, define timebox how long you will continue attempting to address the problem before changing your approach.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Every half-hour/hour ask yourself &amp;ldquo;Have I made progress in the last period?&amp;rdquo; If the answer is no, define a time limit before reassessing your next steps&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Tools</title>
      <link>https://tomrochette.com/work/tools/</link>
      <pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/work/tools/</guid>
      <category>work</category>
      <description>&lt;p&gt;Tools I use on a regular basis at work (sorted alphabetically).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.apple.com/macos/calendar/&#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=www.apple.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Apple calendar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.google.com/chrome/&#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=www.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Chrome&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cursor.com/&#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=www.cursor.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cursor&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cli.github.com/&#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=cli.github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;gh&lt;/code&gt; (GitHub CLI)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/ghx&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;ghx&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://git-scm.com/&#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=git-scm.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;git&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://graphite.dev/&#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=graphite.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;gt&lt;/code&gt; (Graphite CLI)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/sdk/gcloud&#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=cloud.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;gcloud&lt;/code&gt; (Google Cloud CLI)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://workspace.google.com/&#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=workspace.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google suite&lt;/a&gt; (Calendar, Docs, Meet, Sheets, Slides)&lt;/li&gt;&#xA;&lt;li&gt;LLMs: GLM 5.3 Flash&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://iterm2.com/&#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=iterm2.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;iTerm2&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.jetbrains.com/toolbox-app/&#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=www.jetbrains.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Jetbrains Toolbox&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://openchamber.dev/&#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=openchamber.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenChamber&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opencode.ai/&#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=opencode.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;opencode&lt;/code&gt; (OpenCode)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/MuhammedKalkan/OpenLens&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenLens&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pi.dev/&#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=pi.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Pi&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://podman.io/&#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=podman.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;podman&lt;/code&gt; (Podman)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.postman.com/&#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=www.postman.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Postman&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.jetbrains.com/pycharm/&#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=www.jetbrains.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PyCharm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rectangleapp.com/&#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=rectangleapp.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Rectangle&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.com/&#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=slack.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/exelban/stats&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Stats&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;VS Code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Calendar reminders</title>
      <link>https://tomrochette.com/work/calendar-reminders/</link>
      <pubDate>Fri, 23 Aug 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/work/calendar-reminders/</guid>
      <category>work</category>
      <description>&lt;p&gt;Daily&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;15m to document&lt;/li&gt;&#xA;&lt;li&gt;1h lunch&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Weekly&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;30m 1:1 with coworkers I work with on a daily basis&lt;/li&gt;&#xA;&lt;li&gt;30m 1:1 with my manager&lt;/li&gt;&#xA;&lt;li&gt;2 1h for continuous learning&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly readings - 2024-06-30</title>
      <link>https://tomrochette.com/weekly-readings/2024/06-30/</link>
      <pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/weekly-readings/2024/06-30/</guid>
      <category>weekly-readings</category>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/gradually-then-suddenly-upon-the&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gradually, then Suddenly: Upon the Threshold&lt;/a&gt;&#xA;I&amp;rsquo;ve recently started playing with Claude 3.5 artifacts for fun to prototype an idea I had and while I struggled to get it to do something &amp;ldquo;fairly&amp;rdquo; simple, I was impressed with the ease of prototyping compared to if I had to do it myself. I expect this to continue to improve, reducing the amount of time spent on setting up your development environment and getting more immediate results.&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;[&amp;hellip;] I suggest that people and organizations keep an &amp;ldquo;impossibility list&amp;rdquo; - things that their experiments have shown that AI can definitely not do today but which it can almost do.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/innovation-through-prompting&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Innovation through prompting&lt;/a&gt;&#xA;Pretty exciting ideas on how to use LLMs to enable more dynamic teaching, even though it might not be perfect.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://arxiv.org/abs/2403.05812&#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=arxiv.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Algorithmic progress in language models&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;[LLM] Models require 2× less compute roughly every eight months&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;This would be 3 times faster than Moore&amp;rsquo;s law (every 24 months). Similar to Moore&amp;rsquo;s law, the big question is when we&amp;rsquo;ll reach a plateau on those performance improvements.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://every.to/superorganizers/how-to-make-yourself-into-a-learning-machine&#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=every.to&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How to Make Yourself Into a Learning Machine&lt;/a&gt;&#xA;A lot of things I&amp;rsquo;ve found myself doing over the years, mostly reading many books each year, keeping quotes (highlights) and notes from what I&amp;rsquo;m reading, using Anki to learn and remember languages and concepts/ideas, the use of Zettelkasten (but really, just the habit of writing down any thoughts into a digital note), etc. Definitely a recommended read it you&amp;rsquo;re into personal information management.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://sive.rs/1s&#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=sive.rs&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Writing one sentence per line&lt;/a&gt;&#xA;A good way to make your writing clear and to the point. I also suggest to use easy words instead of fancy ones that people don&amp;rsquo;t often use.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly readings - 2024-06-23</title>
      <link>https://tomrochette.com/weekly-readings/2024/06-23/</link>
      <pubDate>Fri, 28 Jun 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/weekly-readings/2024/06-23/</guid>
      <category>weekly-readings</category>
      <description>&lt;p&gt;&lt;a href=&#34;https://oneusefulthing.substack.com/p/how-to-use-chatgpt-to-boost-your&#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=oneusefulthing.substack.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How to&amp;hellip; use ChatGPT to boost your writing&lt;/a&gt;&#xA;Tips from the article:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;More elaborate and specific prompts work better.&lt;/li&gt;&#xA;&lt;li&gt;You can ask the AI to use specific styles for writing.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tips from me:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use it to review your syntax, grammar, clarity, tone, biases, identify convoluted sentences, sentences that are too long.&lt;/li&gt;&#xA;&lt;li&gt;Use it to generate alternative sentences when you don&amp;rsquo;t like how yours reads.&lt;/li&gt;&#xA;&lt;li&gt;Ask it to give you feedback on what you have written so far, what gaps are there.&lt;/li&gt;&#xA;&lt;li&gt;Ask it to produce an article with the opposite viewpoint.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/working-with-ai-two-paths-to-prompting&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Working with AI: Two paths to prompting&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;Structured Prompting is about turning the AI into a tool that does a single task well in a way that is repeatable and adapts to its user.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Structured prompts are very powerful. Once you start using a LLM regularly you&amp;rsquo;ll frequently have the same type of requests which will nicely lead you to collect those statements (prompts) so that you can simply copy/paste them and adapt them to your new use case. I think that being able to share, easily edit, and observe how others use your structured prompts can help you improve them. I&amp;rsquo;ve personally found that reading other people&amp;rsquo;s prompts enabled me to broaden my capabilities and the breadth of my thinking.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://huggingface.co/docs/transformers/main/en/tasks/prompting&#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=huggingface.co&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;LLM prompting guide&lt;/a&gt;&#xA;Tips:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;When choosing the model to work with, the latest and most capable models are likely to perform better.&lt;/li&gt;&#xA;&lt;li&gt;Start with a simple and short prompt, and iterate from there.&lt;/li&gt;&#xA;&lt;li&gt;Put the instructions at the beginning of the prompt, or at the very end. When working with large context, models apply various optimizations to prevent Attention complexity from scaling quadratically. This may make a model more attentive to the beginning or end of a prompt than the middle.&lt;/li&gt;&#xA;&lt;li&gt;Clearly separate instructions from the text they apply to.&lt;/li&gt;&#xA;&lt;li&gt;Be specific and descriptive about the task and the desired outcome - its format, length, style, language, etc.&lt;/li&gt;&#xA;&lt;li&gt;Avoid ambiguous descriptions and instructions.&lt;/li&gt;&#xA;&lt;li&gt;Favor instructions that say “what to do” instead of those that say “what not to do”.&lt;/li&gt;&#xA;&lt;li&gt;“Lead” the output in the right direction by writing the first word (or even begin the first sentence for the model).&lt;/li&gt;&#xA;&lt;li&gt;Use advanced techniques like Few-shot prompting and Chain-of-thought&lt;/li&gt;&#xA;&lt;li&gt;Test your prompts with different models to assess their robustness.&lt;/li&gt;&#xA;&lt;li&gt;Version and track the performance of your prompts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/zakirullin/cognitive-load/blob/main/README.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cognitive Load is what matters&lt;/a&gt;&#xA;Interesting way to discuss cognitive load when reading code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://adamgrant.substack.com/p/no-you-dont-owe-me-a-favor&#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=adamgrant.substack.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;No, you don&amp;rsquo;t owe me a favor&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;If I take the time to do something for you, it’s not because I’m a matcher looking for something in return. It’s because I aspire to be a giver—I enjoy being helpful. My effort to support you means that I think highly of you and might even care about you. When you say you owe me, it reduces my investment in you to an accounting transaction.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Something that resonated with me quite a lot. When I do things for others, it&amp;rsquo;s not because I expect things in return. Maybe the only thing I hope is that you acknowledge and possibly appreciate the help, but I don&amp;rsquo;t expect reciprocation.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly readings - 2024-06-16</title>
      <link>https://tomrochette.com/weekly-readings/2024/06-16/</link>
      <pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/weekly-readings/2024/06-16/</guid>
      <category>weekly-readings</category>
      <description>&lt;p&gt;I read more articles from &lt;a href=&#34;https://www.oneusefulthing.org&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.oneusefulthing.org&lt;/a&gt; this week.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/how-to-use-ai-to-teach-some-of-the&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How to&amp;hellip; use AI to teach some of the hardest skills&lt;/a&gt;&#xA;Very insightful article on the topic of using LLMs to teach students&amp;hellip; or yourself. Based on this article I started learning about sociology terms, electronics, tried to have it role play a senior software backend engineer I could practice mentoring (and get mentoring feedback from). I also added the prompt &amp;ldquo;Explain how X works&amp;rdquo; to my prompt collection. I love articles that expand my thinking and exploration.&lt;/p&gt;&#xA;&lt;p&gt;Prompt to learn about a domain through question/review cycles:&#xA;Act as an expert in X. Ask me to explain a concept and then correct me if I&amp;rsquo;m wrong. Then restart the process, continuing endlessly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/how-to-use-ai-to-unstick-yourself&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How to&amp;hellip; use AI to unstick yourself&lt;/a&gt;&#xA;I&amp;rsquo;ve been using LLMs a lot to help me get some quick sanity check on thoughts I have and see what I might not have considered. I think LLMs are a rather useful tool to help you stay motivated when you feel a bit stuck or don&amp;rsquo;t want to particularly work on a piece of code. It&amp;rsquo;s like having a peer that&amp;rsquo;s always willing to help.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/thinking-companion-companion-for&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Thinking companion, companion for thinking&lt;/a&gt;&#xA;Two heads are generally better than one. LLMs can be your second head when you need to think about what might go wrong or to address gaps in your thinking.&#xA;You should also learn about opportunity cost and sunk cost!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/chatgtp-is-my-co-founder&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ChatGPT is my co-founder&lt;/a&gt;&#xA;One of LLMs strengths is their ability to always be somewhat helpful. One helpful thing they do is lowering the barrier to doing anything, as long as you know how to ask for help. While I code this mostly means giving me a small push to accomplish a task I would partially complete without its help. When writing, it&amp;rsquo;s a great tool to stimulate creativity and get feedback on which you can act.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://oneusefulthing.substack.com/p/superhuman-what-can-ai-do-in-30-minutes&#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=oneusefulthing.substack.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Superhuman: What can AI do in 30 minutes?&lt;/a&gt;&#xA;More and more of how you decide to spend your time will decide how effective (or not) you are. In this article the author spends 30 minutes to accomplish the following with the help of generative AI:&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;Output: Bing generated 9,200 words or so of text and a couple images, GPT-4 generated a working HTML and CSS file, MidJourney created 12 images, ElevenLabs created a voicefile, and DiD created a movie.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;Input: I made less than 20 inputs to all the systems to generate these results.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Assuming that there were only 20 interactions, that would mean ~1 minute between interaction. Over a 30 minutes period, most of the time is likely spent on reviewing the generated content and then deciding our next move/writing  prompts. A time breakdown would have been interesting.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Weekly readings - 2024-06-09</title>
      <link>https://tomrochette.com/weekly-readings/2024/06-09/</link>
      <pubDate>Fri, 14 Jun 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/weekly-readings/2024/06-09/</guid>
      <category>weekly-readings</category>
      <description>&lt;p&gt;I discovered &lt;a href=&#34;https://www.oneusefulthing.org&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.oneusefulthing.org&lt;/a&gt; and ended up reading a few articles.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.howtogeek.com/chatgpt-remembers-what-i-tell-it-its-now-my-personal-digital-assistant/&#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=www.howtogeek.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ChatGPT Remembers What I Tell It. It’s Now My Personal Digital Assistant!&lt;/a&gt;&#xA;The addition of implicit memory is an exciting move toward a more useful AI agent that knows more about you and your preferences. It&amp;rsquo;ll be interesting to see how this evolves.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://graphite.dev/blog/ai-code-review-experiments&#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=graphite.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Experimenting with AI code review&lt;/a&gt;&#xA;The article is a few months old so it&amp;rsquo;s hard to say if newer models have addressed the concerns of the article. The main value here will be over time to get closer to instant feedback while implementing changes instead of having to push code to get a code review.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/almost-an-agent-what-gpts-can-do&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Almost an Agent: What GPTs can do&lt;/a&gt;&#xA;I&amp;rsquo;m looking forward to OpenAI and other GPT providers to allow GPT creators to review their users feedback when interacting with their bot. The idea here is that a GPT is software, so it needs to evolve and adapt to new needs and requirements as well as address bugs in its behavior.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/how-to-have-better-meetings&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How to&amp;hellip; have better meetings&lt;/a&gt;&#xA;A few good tips on having better meetings. See &lt;a href=&#34;https://tomrochette.com/processes/meetings/&#34; &gt;Meetings&lt;/a&gt; for my own meeting process.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oneusefulthing.org/p/captains-log-the-irreducible-weirdness&#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=www.oneusefulthing.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Captain&amp;rsquo;s log: the irreducible weirdness of prompting AIs&lt;/a&gt;&#xA;Prompting is weird. Over time we expect LLMs to get smarter and better at inferring our intent such that becoming good at prompting isn&amp;rsquo;t a skill you shouldn&amp;rsquo;t invest too much into. Until then, it&amp;rsquo;s somewhat similar to knowing how to write good search engine queries.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Written by</title>
      <link>https://tomrochette.com/written-by/</link>
      <pubDate>Tue, 11 Jun 2024 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/written-by/</guid>
      <category>partially-ai-generated</category><category>ai-feedback</category><category>llm=gpt-oss-20b</category>
      <description>&lt;p&gt;All articles on this blog originate from my mind.&#xA;Most articles are written by me, but some are partially or entirely AI/LLMs‑generated.&lt;/p&gt;&#xA;&lt;p&gt;Those articles will be tagged accordingly:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No tag for completely original content.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/tag:partially-ai-generated&#34; &gt;&lt;code&gt;partially-ai-generated&lt;/code&gt;&lt;/a&gt; for articles with one or many AI-generated sentences or with some feedback provided by AI.&#xA;This covers articles where there is 1 word changed by AI to the article being almost entirely written by AI but with some human input.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/tag:fully-ai-generated&#34; &gt;&lt;code&gt;fully-ai-generated&lt;/code&gt;&lt;/a&gt; when all the content is AI-generated.&#xA;This covers articles that are entirely written by AI without any human input (except for possibly removing sentences).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I also use additional tags in relation to AI usage, namely:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/tag:ai-feedback&#34; &gt;&lt;code&gt;ai-feedback&lt;/code&gt;&lt;/a&gt; for articles that were edited following AI feedback.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I tag the articles with the LLMs that were involved.&#xA;Look for tags starting with &lt;code&gt;llm=&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I use a variety of LLM providers (in order of frequency of use):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://claude.ai/&#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=claude.ai&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/features/copilot&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub Copilot&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://chat.openai.com/&#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=chat.openai.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenAI ChatGPT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://chat.groq.com/&#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=chat.groq.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Groq&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://poe.com/&#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=poe.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Poe&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sive.rs/ai&#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=sive.rs&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://sive.rs/ai&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Quotes</title>
      <link>https://tomrochette.com/quotes/</link>
      <pubDate>Fri, 10 Nov 2023 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/quotes/</guid>
      <category>quotes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Marcus Aurelius&#xA;    &lt;div id=&#34;marcus-aurelius&#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;#marcus-aurelius&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The happiness of your life depends upon the quality of your thoughts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Seneca&#xA;    &lt;div id=&#34;seneca&#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;#seneca&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;People are frugal in guarding their personal property; but as soon as it comes to squandering time they are most wasteful of the one thing in which it is right to be stingy.&lt;/li&gt;&#xA;&lt;li&gt;He who spares the wicked injures the good.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Zeno&#xA;    &lt;div id=&#34;zeno&#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;#zeno&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No loss should be more regrettable to us than losing our time, for it&amp;rsquo;s irretrievable.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2023</title>
      <link>https://tomrochette.com/learning/2023/</link>
      <pubDate>Sat, 31 Dec 2022 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2023/</guid>
      <category>learning</category>
      <description>&lt;p&gt;(sorted alphabetically)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ChatGPT&lt;/li&gt;&#xA;&lt;li&gt;Parenting&lt;/li&gt;&#xA;&lt;li&gt;Prompt engineering&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Incident investigation</title>
      <link>https://tomrochette.com/processes/incident-investigation/</link>
      <pubDate>Thu, 14 Apr 2022 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/incident-investigation/</guid>
      <category>processes</category><category>work</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Define the incident owner&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Define the incident secretary/communicator&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Create and document&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Summary&lt;/li&gt;&#xA;&lt;li&gt;Observations (link to metrics dashboards with absolute timestamps as much as possible)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Screenshots&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Who took the screenshot&lt;/li&gt;&#xA;&lt;li&gt;Link to get the graph/data&lt;/li&gt;&#xA;&lt;li&gt;Associated conclusions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Links to logs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Hypotheses/theories&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Who made them&lt;/li&gt;&#xA;&lt;li&gt;When&lt;/li&gt;&#xA;&lt;li&gt;If they have been validated/invalidated&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;The actions taken&#xA;&lt;ul&gt;&#xA;&lt;li&gt;By whom&lt;/li&gt;&#xA;&lt;li&gt;If it had the desired effect&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;etc.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In the situation where an incident has been caused by the introduction of a code regression, revert the change and deploy as soon as possible&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Start by reducing/relieving the impact of the incident before searching for a root cause&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Use multiple data sources when data sources do not agree&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Diagram all the implicated systems and the relationship to one another in order to identify the potential locations where the problem might be&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Test your hypotheses to verify if they hold or not&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Develop a procedure over time that can be followed to diagnose similar issues&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Write down a list of improvement suggestions in order for the incident not to reproduce itself in the future or to lessen its impact&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Once the incident is completed, have a summary of the conclusions at the top of the document with a link to the sections in the document explaining the rationale behind the conclusions&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Incident post-mortem</title>
      <link>https://tomrochette.com/processes/incident-post-mortem/</link>
      <pubDate>Thu, 14 Apr 2022 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/incident-post-mortem/</guid>
      <category>processes</category><category>work</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Identify the cause of the problem&#xA;&lt;ul&gt;&#xA;&lt;li&gt;5 whys&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;List potential solutions&lt;/li&gt;&#xA;&lt;li&gt;Investigate potential sources of similar problems&lt;/li&gt;&#xA;&lt;li&gt;Address the additional sources of risk&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Goals&#xA;    &lt;div id=&#34;goals&#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;#goals&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reduce incident duration&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Identify the cause of the problem more rapidly&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Reduce incident cost&lt;/li&gt;&#xA;&lt;li&gt;Reduce the number of people involved&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2022</title>
      <link>https://tomrochette.com/learning/2022/</link>
      <pubDate>Fri, 14 Jan 2022 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2022/</guid>
      <category>learning</category>
      <description>&lt;p&gt;(sorted alphabetically)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ads mediation&lt;/li&gt;&#xA;&lt;li&gt;Ads serving&lt;/li&gt;&#xA;&lt;li&gt;GCP&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Traffic director&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Grafana unified alerts&lt;/li&gt;&#xA;&lt;li&gt;Managing large scale services (500k+ rps)&lt;/li&gt;&#xA;&lt;li&gt;Imply&lt;/li&gt;&#xA;&lt;li&gt;Renovate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Monthly review</title>
      <link>https://tomrochette.com/processes/monthly-review/</link>
      <pubDate>Mon, 03 Jan 2022 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/monthly-review/</guid>
      <category>processes</category><category>work</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every month, either at the beginning or end of the month.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;30 minutes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Fill out the (internal) employee survey (&lt;a href=&#34;https://www.gallup.com/q12-employee-engagement-survey/&#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=www.gallup.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Gallup Q12&lt;/a&gt;) to assess my engagement at work&lt;/li&gt;&#xA;&lt;li&gt;Review what was planned for the month&lt;/li&gt;&#xA;&lt;li&gt;Provide feedback related to the plan&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/yearly-review/&#34; &gt;Review yearly plan and align&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Plan next month&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Yearly review</title>
      <link>https://tomrochette.com/processes/yearly-review/</link>
      <pubDate>Mon, 03 Jan 2022 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/yearly-review/</guid>
      <category>processes</category><category>work</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Trigger&#xA;    &lt;div id=&#34;trigger&#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;#trigger&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Every year, either at the beginning or end of the year.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Duration&#xA;    &lt;div id=&#34;duration&#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;#duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;A few hours spread over the course of a few days.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review year according to various facets&lt;/li&gt;&#xA;&lt;li&gt;Plan the next year according to the same facets&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Notes&#xA;    &lt;div id=&#34;notes&#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;#notes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I use a mind map software to do my yearly review and plan.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://alexvermeer.com/8760hours/&#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=alexvermeer.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://alexvermeer.com/8760hours/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://chrisguillebeau.com/how-to-conduct-your-own-annual-review&#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=chrisguillebeau.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://chrisguillebeau.com/how-to-conduct-your-own-annual-review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.anthonyjcampbell.com/blog/8760-hours&#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=www.anthonyjcampbell.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.anthonyjcampbell.com/blog/8760-hours&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2014</title>
      <link>https://tomrochette.com/learning/2014/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2014/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Apiary&lt;/li&gt;&#xA;&lt;li&gt;API writing&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2015</title>
      <link>https://tomrochette.com/learning/2015/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2015/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Composer (proxy + client)&lt;/li&gt;&#xA;&lt;li&gt;Anatomy&lt;/li&gt;&#xA;&lt;li&gt;Webpage crawling&lt;/li&gt;&#xA;&lt;li&gt;Chrome api&lt;/li&gt;&#xA;&lt;li&gt;pico&lt;/li&gt;&#xA;&lt;li&gt;anki server protocol&lt;/li&gt;&#xA;&lt;li&gt;Semantic versioning&#xA;&lt;ul&gt;&#xA;&lt;li&gt;building a phar&lt;/li&gt;&#xA;&lt;li&gt;php parsing&lt;/li&gt;&#xA;&lt;li&gt;releasing php open source software&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;laravel&lt;/li&gt;&#xA;&lt;li&gt;cordova&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ionic framework&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;nodejs&#xA;&lt;ul&gt;&#xA;&lt;li&gt;debugging&lt;/li&gt;&#xA;&lt;li&gt;profiling&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2016</title>
      <link>https://tomrochette.com/learning/2016/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2016/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Go&lt;/li&gt;&#xA;&lt;li&gt;Typescript&lt;/li&gt;&#xA;&lt;li&gt;Logic&lt;/li&gt;&#xA;&lt;li&gt;Tensorflow&lt;/li&gt;&#xA;&lt;li&gt;Various math concepts (thanks to project Euler)&lt;/li&gt;&#xA;&lt;li&gt;Neuroscience&lt;/li&gt;&#xA;&lt;li&gt;Automata theory&lt;/li&gt;&#xA;&lt;li&gt;Self-reproducing automata&lt;/li&gt;&#xA;&lt;li&gt;Cognitive science&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2017</title>
      <link>https://tomrochette.com/learning/2017/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2017/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Machine learning&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Keras&lt;/li&gt;&#xA;&lt;li&gt;Numpy&lt;/li&gt;&#xA;&lt;li&gt;Scipy&lt;/li&gt;&#xA;&lt;li&gt;Pandas&lt;/li&gt;&#xA;&lt;li&gt;Jupyter&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Polymer&lt;/li&gt;&#xA;&lt;li&gt;Information theory&lt;/li&gt;&#xA;&lt;li&gt;Chinese Mandarin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2018</title>
      <link>https://tomrochette.com/learning/2018/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2018/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Machine learning&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pandas&lt;/li&gt;&#xA;&lt;li&gt;Time series&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Docker&lt;/li&gt;&#xA;&lt;li&gt;Kubernetes&lt;/li&gt;&#xA;&lt;li&gt;DroneCI&lt;/li&gt;&#xA;&lt;li&gt;Python&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pipenv&lt;/li&gt;&#xA;&lt;li&gt;Pipfile&lt;/li&gt;&#xA;&lt;li&gt;Poetry&lt;/li&gt;&#xA;&lt;li&gt;Libraries&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Click&lt;/li&gt;&#xA;&lt;li&gt;Dask&lt;/li&gt;&#xA;&lt;li&gt;Distributed&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Apache JMeter&lt;/li&gt;&#xA;&lt;li&gt;Chinese Mandarin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2019</title>
      <link>https://tomrochette.com/learning/2019/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2019/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Chinese Mandarin&lt;/li&gt;&#xA;&lt;li&gt;Scikit-learn&lt;/li&gt;&#xA;&lt;li&gt;Time series&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2020</title>
      <link>https://tomrochette.com/learning/2020/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2020/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Pytorch&lt;/li&gt;&#xA;&lt;li&gt;Time series&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ARIMA&lt;/li&gt;&#xA;&lt;li&gt;Trend/seasonality/error/residual&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Statistics&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Estimation statistics&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Scikit-learn&lt;/li&gt;&#xA;&lt;li&gt;Numpy&lt;/li&gt;&#xA;&lt;li&gt;Plotly&lt;/li&gt;&#xA;&lt;li&gt;MLflow&lt;/li&gt;&#xA;&lt;li&gt;PyTorch&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning - 2021</title>
      <link>https://tomrochette.com/learning/2021/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning/2021/</guid>
      <category>learning</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;A/B testing&lt;/li&gt;&#xA;&lt;li&gt;Continuous experimentation&lt;/li&gt;&#xA;&lt;li&gt;Kubernetes&lt;/li&gt;&#xA;&lt;li&gt;Helm&lt;/li&gt;&#xA;&lt;li&gt;GCP&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Kubernetes Engine&lt;/li&gt;&#xA;&lt;li&gt;BigQuery&lt;/li&gt;&#xA;&lt;li&gt;Dataflow&lt;/li&gt;&#xA;&lt;li&gt;Kubeflow&lt;/li&gt;&#xA;&lt;li&gt;Airflow/Composer&lt;/li&gt;&#xA;&lt;li&gt;VPC/Network/Firewall/Cloud armor&lt;/li&gt;&#xA;&lt;li&gt;Cloud profiling&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Go&lt;/li&gt;&#xA;&lt;li&gt;GRPC&lt;/li&gt;&#xA;&lt;li&gt;Terraform&lt;/li&gt;&#xA;&lt;li&gt;Prometheus&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Alerts&lt;/li&gt;&#xA;&lt;li&gt;Recording rules&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Grafana&lt;/li&gt;&#xA;&lt;li&gt;Datadog&lt;/li&gt;&#xA;&lt;li&gt;Kafka&lt;/li&gt;&#xA;&lt;li&gt;Load balancing&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GRPC&lt;/li&gt;&#xA;&lt;li&gt;Kafka&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Lens (GUI for Kubernetes)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Book rating</title>
      <link>https://tomrochette.com/processes/book-rating/</link>
      <pubDate>Sat, 24 Jul 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/book-rating/</guid>
      <category>general</category><category>processes</category><category>reading</category>
      <description>&lt;p&gt;In this article I define a 1-5 rating scale for books in order to be consistent across my evaluations. Given that rating books is somewhat subjective, introducing some amount of standardization on how I rate them should help with &lt;a href=&#34;https://tomrochette.com/processes/managing-your-reading/&#34; &gt;managing my reading&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Format of presentation:&lt;/p&gt;&#xA;&lt;p&gt;Score (from 1 to 5) Representative emoji&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Satisfaction&lt;/li&gt;&#xA;&lt;li&gt;Words expressing the level of satisfaction&lt;/li&gt;&#xA;&lt;li&gt;Strength of recommendation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;1 🤮&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;unsatisfactory&lt;/li&gt;&#xA;&lt;li&gt;very bad, horrible, boring, repetitive, disagreeable to read, waste of time, can&amp;rsquo;t force myself to read&lt;/li&gt;&#xA;&lt;li&gt;strongly not recommended&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;2 ☹️&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;unsatisfactory&lt;/li&gt;&#xA;&lt;li&gt;bad&lt;/li&gt;&#xA;&lt;li&gt;not recommended&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;3 😐&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;satisfactory&lt;/li&gt;&#xA;&lt;li&gt;neutral&lt;/li&gt;&#xA;&lt;li&gt;might want to read&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;4 ☺️&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;satisfactory&lt;/li&gt;&#xA;&lt;li&gt;good&lt;/li&gt;&#xA;&lt;li&gt;recommended&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;5 😍&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;satisfactory&lt;/li&gt;&#xA;&lt;li&gt;very good, great, amazing, exciting, intriguing, fascinating, full of new knowledge, can&amp;rsquo;t stop reading&lt;/li&gt;&#xA;&lt;li&gt;strongly recommended&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://readingbookslikeaboss.com/review-rating-scale/&#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=readingbookslikeaboss.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://readingbookslikeaboss.com/review-rating-scale/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.writoscope.com/reading/how-rate-book-rating-system/&#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=www.writoscope.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.writoscope.com/reading/how-rate-book-rating-system/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The meaning of life</title>
      <link>https://tomrochette.com/the-meaning-of-life/</link>
      <pubDate>Sat, 24 Jul 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/the-meaning-of-life/</guid>
      <category>philosophy</category><category>thoughts</category>
      <description>&lt;p&gt;Life doesn&amp;rsquo;t have a meaning.&#xA;You define the meaning of your life.&#xA;What is a reasonable meaning to give to your life?&#xA;From an utilitarian perspective it should be about reducing pain or increasing pleasure for the largest population.&#xA;It&amp;rsquo;s not clear which one is preferable.&#xA;If both are considered to be on the same axis, then it is a matter of identifying the changes that will lead to the largest relative increase.&#xA;Similarly to any optimization problem there are things that are easier than others to optimize and to improve, while others are neglectable in terms of improvement.&#xA;With this line of reasoning one would think the best they can do is to help those that have the least: food, shelter, education, happiness, freedom.&#xA;But is it worthwhile to improve the life of those people if they still die young or are unable to benefit from what you provided them?&#xA;Why should we care about most of the population?&#xA;Given our capitalistic environment, we want as many individuals as possible to accomplish work. The purpose of that work is meaningless, but in the grand scheme of things it is about survival.&#xA;We evolved from nothing, to atoms, then molecules, then in/organic compounds, then collections of molecules, proteins, RNA, DNA, cells, organs, humans.&#xA;At the electron, proton and neutron level we don&amp;rsquo;t observe any specific goal other than reaching some level of stability within atoms through the different electronic shell levels.&#xA;Should we see structure as an indication of some type of implicit &amp;ldquo;design goal&amp;rdquo;, i.e., structure implies intent?&#xA;Once we reach a certain complexity level we nowadays consider &amp;ldquo;life&amp;rdquo;, we start using energy as a way to interact with the environment around us.&#xA;Eating is the foundation. Eating is how we acquire energy. We need to eat to have energy to accomplish anything.&#xA;Sleep is necessary as a mean to conserve energy.&#xA;We need energy for the sole purpose of looking for more energy. From this perspective we&amp;rsquo;re engaged in a vicious useless cycle of finding energy, storing it, and using it to find more energy.&#xA;Energy used to achieve movement produces some heat due to friction with the environment.&#xA;As long as the environment we live in can self-sustain itself, that is, it can produce consumable sources of energy faster than they are consumed by those inhabiting it, we can live in that environment. When it ceases to be the case, the organisms that rely on this property being true are at risk of dying.&#xA;In our society, it&amp;rsquo;s easy to have access to food and thus fulfill this need.&lt;/p&gt;&#xA;&lt;p&gt;Procaryote cells separate themselves from their environment through a lipid bilayer. We can see this as being similar to a human being living in their own home.&lt;/p&gt;&#xA;&lt;p&gt;Why did atoms turn into more complex molecules, which in turn, after many steps, turned into cells?&#xA;Why did this complexity arise instead of staying at very simple atomic levels?&#xA;In many cases different atoms aggregate together to form a molecule because this assembly is structurally more stable.&#xA;Why does the environment want more stable molecules over less stable ones?&#xA;Why are there atoms to begin with an not just soups of electrons, protons and neutrons?&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Exponential growth software company</title>
      <link>https://tomrochette.com/exponential-growth-software-company/</link>
      <pubDate>Mon, 21 Jun 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/exponential-growth-software-company/</guid>
      <category>software-development</category><category>company-growth</category>
      <description>&lt;p&gt;In this article I want to explore different aspects of scaling a company that need to be taken into account if you&amp;rsquo;re trying to grow exponentially. Generally when discussing about growth we consider revenue growth to be the metric we&amp;rsquo;re measuring. One thing that is important, and that is considered throughout the article, is to be a profitable company. There&amp;rsquo;s no point in growing exponentially if it is unsustainable or your expenses are always going to be superior to your profits.&lt;/p&gt;&#xA;&lt;p&gt;In the best scenario, your business grows exponentially without requiring any additional human power. The second best case is that it grows sublinearly, meaning that as demand grows, the amount of people required to support the company grows slower than the demand itself. Past this point, growth either matches with how many people need to be hired, or worse, growth is slower as you hire more people. Here you may have exponential human power growth to get linear (or sublinear) revenue growth.&lt;/p&gt;&#xA;&lt;p&gt;When hiring people, you need to be able to onboard them while having as little impact as possible on the existing employees. If existing employees need to spend time onboarding new employees, then nobody is working on product development or support during that period. Here again, you want the number of people responsible to onboard and train new employees to be smaller than the number of people being onboarded. In other words, you want the ratio of onboarded to onboarders to be higher than 1 to 1.&lt;/p&gt;&#xA;&lt;p&gt;When a company grows exponentially, every time the company effectively double due to new hires, the culture is now at risk of instability. If for instance 100% of the existing employees were following the existing culture, and 100% of the new hires have a different culture, then there will be a culture clash with no specific half of the company being in control of culture. Unless culture continues to be managed through the process of onboarding, the initial group of people and their culture will rapidly become diluted.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;re not made to interact with dozen or hundreds of peers. As such, it is close to impossible for an individual to work with more than let say 10 direct peers. This means that teams or groups need to be created. This also means that interaction between teams needs to be managed somehow. Having multiple people from a team interact with another team leads to the implicit creation of a larger 20 people team, which does not work very effectively. On the other hand, having single points of contact between teams is a surefire way to have single points of failure. In this specific instance it is definitely necessary to have at least 1 or 2 redundancies.&lt;/p&gt;&#xA;&lt;p&gt;It is also important to keep the people that have been at the company the longest. As the doubling period effectively divides by two the average duration an employee was with the company, losing those senior employees will speed up the drop in employee average tenure. This means that a lot of institutional knowledge will be lost along the way. This would also mean that you should possibly prefer to keep a senior employee at the cost of hiring a new employee, unless you believe that the amount of time necessary to onboard and be effective is lower than the average employee tenure.&lt;/p&gt;&#xA;&lt;p&gt;The process of onboarding should be optimized as much as possible.&lt;/p&gt;&#xA;&lt;p&gt;Anything that requires human power to scale linearly or superlinearly with itself needs to be optimized so that it grows sublinearly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Follow-up: &lt;a href=&#34;https://tomrochette.com/scaling-the-llm-agent-company/&#34; &gt;Scaling the LLM Agent Company&lt;/a&gt; explores how these constraints change when the workforce is entirely composed of LLM agents.&lt;/em&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>One on one</title>
      <link>https://tomrochette.com/processes/one-on-one/</link>
      <pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/one-on-one/</guid>
      <category>processes</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Define and agree on the purpose of the one on one&lt;/li&gt;&#xA;&lt;li&gt;Define the topics to be discussed prior to meeting&lt;/li&gt;&#xA;&lt;li&gt;Track and update metrics that you care about every time you meet&#xA;&lt;ul&gt;&#xA;&lt;li&gt;e.g., Predictability, Ownership, Purpose, Progress, Belonging&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Discuss the status of those metrics if necessary&lt;/li&gt;&#xA;&lt;li&gt;Write in a shared document (between the two of you) what is discussed&lt;/li&gt;&#xA;&lt;li&gt;If any action items are defined during those meetings, use a task tracking system to keep each other accountable&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Always define a deadline on tasks to indicate when the task should be revisited&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Avoid using one on one for status updates&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://web.archive.org/web/20211112152135/https://www.impraise.com/blog/1-on-1s-for-engaged-employees-how-good-managers-run-them&#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=web.archive.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://web.archive.org/web/20211112152135/https://www.impraise.com/blog/1-on-1s-for-engaged-employees-how-good-managers-run-them&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://getlighthouse.com/blog/questions-ask-one-on-ones-manager/&#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=getlighthouse.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://getlighthouse.com/blog/questions-ask-one-on-ones-manager/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://about.gitlab.com/handbook/leadership/1-1/&#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=about.gitlab.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://about.gitlab.com/handbook/leadership/1-1/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Answering coding interview questions</title>
      <link>https://tomrochette.com/processes/answering-coding-interview-questions/</link>
      <pubDate>Sat, 01 May 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/answering-coding-interview-questions/</guid>
      <category>processes</category><category>programming</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Read the problem statement&lt;/li&gt;&#xA;&lt;li&gt;Look at any provided unit tests&lt;/li&gt;&#xA;&lt;li&gt;Add any unit tests you think might be relevant and not currently covered&lt;/li&gt;&#xA;&lt;li&gt;Order the unit tests from easiest to hardest&lt;/li&gt;&#xA;&lt;li&gt;Ask questions to confirm your understanding of the problem and verify edge cases&lt;/li&gt;&#xA;&lt;li&gt;Think of a possible approach to solve the problem&lt;/li&gt;&#xA;&lt;li&gt;Share your approach with the interviewers and get their buy-in&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You may do this by writing pseudo-code as you are explaining your thought process&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Implement your solution&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you encounter any difficulties, state them and explain what you are thinking&lt;/li&gt;&#xA;&lt;li&gt;Make use of preconditions/early exit if possible to handle empty cases&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Run your code frequently, even if it is not fully working&lt;/li&gt;&#xA;&lt;li&gt;Discuss any follow-up questions with the interviewers&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Managing your reading</title>
      <link>https://tomrochette.com/processes/managing-your-reading/</link>
      <pubDate>Wed, 21 Apr 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/managing-your-reading/</guid>
      <category>general</category><category>processes</category><category>reading</category>
      <description>&lt;p&gt;The process described below attempts to optimize reading quality books and enjoying the reading experience. As such, it promotes book exploration (discovery of new books) and reading books which have a high rating according to your own taste. Books which receive lower ratings (compared to other books) are moved down the reading priority list and will not be read until books that have higher priority (i.e., rating) either are finished reading or their rating decreases such that other books are now high priority.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pick highly read books (use a site like goodreads to identify those books).&lt;/li&gt;&#xA;&lt;li&gt;When reading a book, record the page you start and stop reading on, the time you start and stop reading and emit a rating for what you&amp;rsquo;ve read.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You can decide to optimize whether you want to optimize per page rating or per duration rating, that is, get the most value per page or by time spent reading.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Add new books to your reading list regularly. Those books are considered as having the highest priority and are then added to the prioritized list of books according to its rating.&lt;/li&gt;&#xA;&lt;li&gt;When not reading a new book, read the books in order of priority and by interest at the time of reading.&lt;/li&gt;&#xA;&lt;li&gt;From time to time you may look at your list of prioritized books and decide whether the books with the lowest priority should ever be finished. In some cases it is reasonable to decide that certain books will never be read completely.&lt;/li&gt;&#xA;&lt;li&gt;As an alternative approach, one can use &lt;a href=&#34;https://en.wikipedia.org/wiki/Multi-armed_bandit&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;multi-armed bandits algorithms&lt;/a&gt; to decide which book to read next. Given that we can convert multi-armed bandits problem into the problem of selecting which book to read next given a sequence of readings and associated rating (&amp;ldquo;rewards&amp;rdquo;), the various algorithms (such as Epsilon-greedy or UCB1) will provide us with the next book we should read.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Interestingly enough, an algorithm like UCB1 will promote reading books we&amp;rsquo;ve never read first over reading books we&amp;rsquo;ve already started reading.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;My reading strategy&#xA;    &lt;div id=&#34;my-reading-strategy&#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;#my-reading-strategy&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Read partially any book for which you haven&amp;rsquo;t given any rating&lt;/li&gt;&#xA;&lt;li&gt;Rate what you have read on a 1 to 5 scale, 1 being very bad and 5 being very good (see &lt;a href=&#34;https://tomrochette.com/processes/book-rating/&#34; &gt;book rating&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Compute the weighted rating of the book (the sum of rating times # of page associated to the reading divided by the total # of pages read so far for the book)&lt;/li&gt;&#xA;&lt;li&gt;Sort books by weighted rating (descending), then average estimated amount of time left to complete (ascending)&lt;/li&gt;&#xA;&lt;li&gt;If you have books that you haven&amp;rsquo;t read yet, go back to the first step. If not, then pick the book at the top of the list computed in the previous step, then continue from step 2&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Heuristics&#xA;    &lt;div id=&#34;heuristics&#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;#heuristics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s better to read a good book than to finish a bad book&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/06/&#34; &gt;How to prioritize which book to read&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/02/18/&#34; &gt;Tracking my readings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/03/01/&#34; &gt;Read more books&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/03/17/&#34; &gt;Reading fiction books&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/03/18/&#34; &gt;Reading technical books&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/03/21/&#34; &gt;Why I avoid reading books&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/book-rating/&#34; &gt;Book rating&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://juvoni.com/reading-multiple-books&#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=juvoni.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Reading Multiple Books at a Time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Adding a class alias at boot time in Laravel</title>
      <link>https://tomrochette.com/adding-a-class-alias-at-boot-time-in-laravel/</link>
      <pubDate>Sun, 28 Mar 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/adding-a-class-alias-at-boot-time-in-laravel/</guid>
      <category>programming</category><category>php</category><category>laravel</category>
      <description>&lt;p&gt;When I work with the &lt;a href=&#34;https://www.exolnet.com/en/blog/what-is-laravel-modern-php-framework&#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=www.exolnet.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Laravel framework&lt;/a&gt;, I make extensive use of the &lt;a href=&#34;https://github.com/barryvdh/laravel-debugbar&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Laravel Debugbar&lt;/a&gt; to track performance of parts of my application. I sprinkle calls to &lt;code&gt;Debugbar::startMeasure&lt;/code&gt; and &lt;code&gt;Debugbar::stopMeasure&lt;/code&gt; to track the duration of certain segments of my code. However, when this code goes into production, this dependency isn&amp;rsquo;t present. This causes the code to break since it cannot find &lt;code&gt;Debugbar&lt;/code&gt; anymore.&lt;/p&gt;&#xA;&lt;p&gt;To solve this issue, I thought I would create a dummy &lt;code&gt;Debugbar&lt;/code&gt; class and have it added as an alias, so that any code depending on &lt;code&gt;Debugbar&lt;/code&gt; would still work, but end up as a &amp;ldquo;no operation&amp;rdquo;. I found the article &lt;a href=&#34;https://laracasts.com/discuss/channels/laravel/dynamic-class-aliases-in-package&#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=laracasts.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Dynamic class aliases in package&lt;/a&gt; which introduced the necessary piece of information to accomplish this.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Illuminate\Foundation\AliasLoader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;My\SuperPackage\FooBar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ServiceProvider&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;\Illuminate\Support\ServiceProvider&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;$this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;booting&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;$loader&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;AliasLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;$loader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;alias&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;FooBar&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;In my desired use case, I simply implemented the following changes:&lt;/p&gt;&#xA;&lt;p&gt;In &lt;code&gt;app/Providers/DebugbarServiceProvider.php&lt;/code&gt; (a new file)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;App\Providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Illuminate\Foundation\AliasLoader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Illuminate\Support\ServiceProvider&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;DebugbarServiceProvider&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ServiceProvider&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;class_exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Debugbar&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;$loader&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;AliasLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;$loader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;alias&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Debugbar&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;NullDebugbar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;NullDebugbar&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;fm&#34;&gt;__callStatic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;array&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$arguments&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// Do nothing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;In &lt;code&gt;app/config/app.php&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// under the &amp;#39;providers&amp;#39; key, add&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;providers&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// This will take care of loading the service provider defined above&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;App\Providers\DebugbarServiceProvider&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;With those two changes, it is now possible to make use of &lt;code&gt;Debugbar&lt;/code&gt; in most places and have it work even without the Laravel Debugbar dependency installed.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://laracasts.com/discuss/channels/laravel/dynamic-class-aliases-in-package&#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=laracasts.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://laracasts.com/discuss/channels/laravel/dynamic-class-aliases-in-package&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Achieving goals</title>
      <link>https://tomrochette.com/achieving-goals/</link>
      <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/achieving-goals/</guid>
      <category>goals</category><category>partially-ai-generated</category><category>ai-feedback</category><category>llm=gpt-oss-120b</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It&amp;rsquo;s important to know what your goals are.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It&amp;rsquo;s important to understand why they are your goals.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It&amp;rsquo;s important to determine which goals are more important than others (goals priority).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It&amp;rsquo;s important to know which goals are dependent on other goals (goals decomposition and dependency).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;To reach a goal, you must first acquire the tools (knowledge, resources) to get to your objective.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It&amp;rsquo;s important to know when to drop/abandon goals.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Sources of inefficiency&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Repeating the same task without sufficient experience.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Always try to figure out the most optimal path toward a goal&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Observe others successful at achieving the goal you want to achieve.&lt;/li&gt;&#xA;&lt;li&gt;Determine the differences between your state and theirs (what they know, what resources are available to them, etc.).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;How to determine when it is not possible to reach a goal at a given moment in time?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Not enough time available&lt;/li&gt;&#xA;&lt;li&gt;Too costly&lt;/li&gt;&#xA;&lt;li&gt;Dependencies not resolved/ready&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Advertising yourself</title>
      <link>https://tomrochette.com/advertising-yourself/</link>
      <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/advertising-yourself/</guid>
      <category>self-promotion</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Produce content worth sharing&lt;/li&gt;&#xA;&lt;li&gt;Get feedback from peers&lt;/li&gt;&#xA;&lt;li&gt;Be vocal about your opinion&lt;/li&gt;&#xA;&lt;li&gt;Have expertise on what you share your opinion about&lt;/li&gt;&#xA;&lt;li&gt;Make yourself seen&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reddit&lt;/li&gt;&#xA;&lt;li&gt;Twitter&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Closing tabs</title>
      <link>https://tomrochette.com/closing-tabs/</link>
      <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/closing-tabs/</guid>
      <category>browser</category><category>tabs</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Why tabs are kept open&#xA;    &lt;div id=&#34;why-tabs-are-kept-open&#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;#why-tabs-are-kept-open&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Want to read but&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Too long -&amp;gt; Transfer to pocket&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Want to watch but&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Too long -&amp;gt; Add to a youtube watchlist (which I&amp;rsquo;ll never watch)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;I need them open to quickly enter data&lt;/li&gt;&#xA;&lt;li&gt;I want to watch them again and again&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Download with youtube-dl and watch using VLC&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Would maybe read one day, but definitely not now (very low priority)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Transfer to pocket&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Rules&#xA;    &lt;div id=&#34;rules&#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;#rules&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If a tab is scanned more than 5/10 times, it goes into the backlog bin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Generic landing page</title>
      <link>https://tomrochette.com/generic-landing-page/</link>
      <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/generic-landing-page/</guid>
      <category>landing-page</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Company name&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Product name&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;What problem we are trying to solve&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;How we are solving it&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Why should you trust if vs our competitors&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;List what it can already do&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;List what we expect to be able to do&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Link to our bug tracker&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Subscribe to our mailing list&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Become an alpha tester&lt;/li&gt;&#xA;&lt;li&gt;Early access program&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Email to contact for any question&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;A/B testing of the price&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Testimonials&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Full website&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Packages/Pricing/Plans&lt;/li&gt;&#xA;&lt;li&gt;Feature list&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;On signing&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Send an email to a small survey&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Establish the price range people would be willing to pay&lt;/li&gt;&#xA;&lt;li&gt;Establish the type of model they&amp;rsquo;d be willing to accept&lt;/li&gt;&#xA;&lt;li&gt;Check what feature they&amp;rsquo;re the most interested in&lt;/li&gt;&#xA;&lt;li&gt;Check which feature they&amp;rsquo;d like to see in the future&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Events tracking&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Seen sections of the landing page/&lt;/li&gt;&#xA;&lt;li&gt;Mouse movement/heatmap/session recording (viewport + mouse position)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;TODO&#xA;    &lt;div id=&#34;todo&#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;#todo&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Define the information you want to collect/know more about&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Extracted from articles&#xA;    &lt;div id=&#34;extracted-from-articles&#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;#extracted-from-articles&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Unique Selling Proposition&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Hero shot&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Benefits of your offering&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Social proof&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Call-To-Action (single conversion goal)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The headline should inform the user what the product or service is all about&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://unbounce.com/landing-pages/7-elements-of-a-winning-landing-page/&#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=unbounce.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://unbounce.com/landing-pages/7-elements-of-a-winning-landing-page/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.kissmetrics.com/beginners-guide-to-landing-pages/&#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=blog.kissmetrics.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://blog.kissmetrics.com/beginners-guide-to-landing-pages/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.hubspot.com/marketing/landing-page-examples-list&#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=blog.hubspot.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://blog.hubspot.com/marketing/landing-page-examples-list&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://thelandingpagecourse.com/landing-page-101-intro/&#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=thelandingpagecourse.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://thelandingpagecourse.com/landing-page-101-intro/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.crazyegg.com/2014/10/07/landing-page-essentials/&#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=blog.crazyegg.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://blog.crazyegg.com/2014/10/07/landing-page-essentials/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.crazyegg.com/2016/03/18/6-laws-of-landing-page-optimization/&#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=blog.crazyegg.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://blog.crazyegg.com/2016/03/18/6-laws-of-landing-page-optimization/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.codeinwp.com/blog/landing-page-basics-you-should-know/&#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=www.codeinwp.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.codeinwp.com/blog/landing-page-basics-you-should-know/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.weidert.com/whole_brain_marketing_blog/bid/206472/7-basic-landing-page-guidelines-that-make-or-break-conversions&#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=www.weidert.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.weidert.com/whole_brain_marketing_blog/bid/206472/7-basic-landing-page-guidelines-that-make-or-break-conversions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Improve part-time productivity</title>
      <link>https://tomrochette.com/improve-part-time-productivity/</link>
      <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/improve-part-time-productivity/</guid>
      <category>productivity</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s difficult to remember/know the current state of a project&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Keep notes of the work that has been done, what is left to do&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create a to do list first, then proceed from that to do list&lt;/li&gt;&#xA;&lt;li&gt;Update the to do list as you notice things that should be/not be done&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Process&#xA;    &lt;div id=&#34;process&#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;#process&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Determine what was worked on last time&lt;/li&gt;&#xA;&lt;li&gt;Determine what needs to be worked on now (priorities)&lt;/li&gt;&#xA;&lt;li&gt;Establish the current state of the project&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Look at the state of tasks in the issues tracker&lt;/li&gt;&#xA;&lt;li&gt;Ask others about the status of the project&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Principles</title>
      <link>https://tomrochette.com/principles/</link>
      <pubDate>Thu, 31 Dec 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/principles/</guid>
      <category>principles</category><category>partially-ai-generated</category><category>llm=glm-5.3-flash</category>
      <description>&lt;p&gt;Principle: a fundamental truth or proposition that serves as the foundation for a system of belief or behavior or for a chain of reasoning.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Mindset and life&#xA;    &lt;div id=&#34;mindset-and-life&#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;#mindset-and-life&#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;Always improve.&lt;/li&gt;&#xA;&lt;li&gt;Always adapt.&lt;/li&gt;&#xA;&lt;li&gt;Accept that nothing is perfect.&lt;/li&gt;&#xA;&lt;li&gt;Know what you want and don&amp;rsquo;t want.&lt;/li&gt;&#xA;&lt;li&gt;Always remain positive.&lt;/li&gt;&#xA;&lt;li&gt;Surround yourself with positive people.&lt;/li&gt;&#xA;&lt;li&gt;Avoid spending your time on negative thoughts.&lt;/li&gt;&#xA;&lt;li&gt;Spend no time complaining.&lt;/li&gt;&#xA;&lt;li&gt;Spend time working on interesting things.&lt;/li&gt;&#xA;&lt;li&gt;Spend your time with happiness generators, stay away from happiness drainers.&lt;/li&gt;&#xA;&lt;li&gt;Always limit how much time you spend dwelling on problems and mistakes.&lt;/li&gt;&#xA;&lt;li&gt;Do not spend too much time thinking about hypothetical situations.&lt;/li&gt;&#xA;&lt;li&gt;Do not invent problems that do not need solving.&lt;/li&gt;&#xA;&lt;li&gt;Be proactive rather than reactive.&lt;/li&gt;&#xA;&lt;li&gt;Minimize your regret.&lt;/li&gt;&#xA;&lt;li&gt;Overcome fear by doing the thing you fear.&lt;/li&gt;&#xA;&lt;li&gt;Constraints force creativity.&lt;/li&gt;&#xA;&lt;li&gt;Stay humble; any edge you have is small and temporary.&lt;/li&gt;&#xA;&lt;li&gt;You define the meaning of your own life.&lt;/li&gt;&#xA;&lt;li&gt;Tolerating bad behavior harms the good.&lt;/li&gt;&#xA;&lt;li&gt;When the assumptions behind a trusted practice change, reevaluate the practice itself, not just how you execute it.&lt;/li&gt;&#xA;&lt;li&gt;Effort cannot close a gap between two different capacity categories.&lt;/li&gt;&#xA;&lt;li&gt;Feeling informed is not being informed.&lt;/li&gt;&#xA;&lt;li&gt;Work you did not choose takes longer because nothing pulls you through it.&lt;/li&gt;&#xA;&lt;li&gt;Do not set your standards by the behavior of the people around you.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Focus and attention&#xA;    &lt;div id=&#34;focus-and-attention&#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;#focus-and-attention&#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;Effectiveness over efficiency.&lt;/li&gt;&#xA;&lt;li&gt;Work on things that matter.&lt;/li&gt;&#xA;&lt;li&gt;Work on fewer things to get them to completion.&lt;/li&gt;&#xA;&lt;li&gt;Focus on input, not output.&lt;/li&gt;&#xA;&lt;li&gt;Stop starting, start finishing.&lt;/li&gt;&#xA;&lt;li&gt;Focus on the critical path and let minor tasks wait.&lt;/li&gt;&#xA;&lt;li&gt;Put your time where you get rewarded for the effort.&lt;/li&gt;&#xA;&lt;li&gt;Periodically measure and review how you spend your time.&lt;/li&gt;&#xA;&lt;li&gt;For each recurring activity, explicitly decide whether to cut, reduce, keep, increase, or add it.&lt;/li&gt;&#xA;&lt;li&gt;Curating the right input is not enough; ensure the consumer actually attends to it.&lt;/li&gt;&#xA;&lt;li&gt;When a recipient ignores information it was already given, the fix is subtraction, restructuring, or repositioning, never more volume.&lt;/li&gt;&#xA;&lt;li&gt;Context-switching carries a save/restore cost proportional to task complexity; chunk long-horizon work to shrink the cost of re-entering it.&lt;/li&gt;&#xA;&lt;li&gt;Optimize for signal, not coverage; filtering is designable where reading speed is fixed.&lt;/li&gt;&#xA;&lt;li&gt;Focus defends itself on work you want to do; distractions win only on work you resent.&lt;/li&gt;&#xA;&lt;li&gt;Treat attention, not generation, as the scarce resource.&lt;/li&gt;&#xA;&lt;li&gt;Parallelize generation, serialize judgment.&lt;/li&gt;&#xA;&lt;li&gt;The number to watch is not how much you delegate but where the freed time lands.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Decisions and prioritization&#xA;    &lt;div id=&#34;decisions-and-prioritization&#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;#decisions-and-prioritization&#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;Priority, priority, priority.&lt;/li&gt;&#xA;&lt;li&gt;Say no early and often.&lt;/li&gt;&#xA;&lt;li&gt;If everything is top priority, nothing is.&lt;/li&gt;&#xA;&lt;li&gt;When working on projects with unclear objectives, always define your KPIs.&lt;/li&gt;&#xA;&lt;li&gt;Order your backlog; do not merely prioritize it.&lt;/li&gt;&#xA;&lt;li&gt;Priority describes what a task is, not when you will get to it; separate classification from scheduling.&lt;/li&gt;&#xA;&lt;li&gt;Allocate capacity across priority levels rather than only ever working the single top item.&lt;/li&gt;&#xA;&lt;li&gt;Apply the 80/20 rule: identify the few inputs that produce most of the results and plan around them.&lt;/li&gt;&#xA;&lt;li&gt;Build funnels, not lists: discard most candidates at the cheap stages, confidently and without guilt.&lt;/li&gt;&#xA;&lt;li&gt;Prioritization frameworks are a forcing function for conversation, not an oracle; the value is in the disagreement they surface, not the score they produce.&lt;/li&gt;&#xA;&lt;li&gt;Every item you keep carries a cognitive tax; a small, well-ordered list beats a large one, so archive aggressively.&lt;/li&gt;&#xA;&lt;li&gt;Treat urgency as a hypothesis from someone with an incentive to inflate it, not as a fact.&lt;/li&gt;&#xA;&lt;li&gt;Filters decay; periodically re-audit what you discarded and what you kept.&lt;/li&gt;&#xA;&lt;li&gt;When overwhelmed, discard your list and rebuild it fresh from your own judgment of what matters most.&lt;/li&gt;&#xA;&lt;li&gt;Do not delay difficult decisions indefinitely.&lt;/li&gt;&#xA;&lt;li&gt;Prefer action over a perfect decision.&lt;/li&gt;&#xA;&lt;li&gt;Know when to abandon goals.&lt;/li&gt;&#xA;&lt;li&gt;Spend your best energy on your most important decisions.&lt;/li&gt;&#xA;&lt;li&gt;Batch similar decisions to stay in one cognitive mode and reduce switching cost.&lt;/li&gt;&#xA;&lt;li&gt;How you decide matters more than what you decide; the meta-process compounds while the specific answer does not.&lt;/li&gt;&#xA;&lt;li&gt;Do not relitigate settled decisions under pressure; defer to a written process.&lt;/li&gt;&#xA;&lt;li&gt;Convert &amp;ldquo;impossible&amp;rdquo; into a priced menu of options; never present a refusal without the cost of overcoming it.&lt;/li&gt;&#xA;&lt;li&gt;Invert, always invert.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Spend less time trying to be brilliant and more time trying to avoid obvious stupidity.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://fs.blog/2013/10/inversion/&#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=fs.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://fs.blog/2013/10/inversion/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Use analogies when reasoning about complex ideas.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sometimes equivalents make it easier to reason about a problem when translated into a different domain.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Understand the root cause; do not brute-force solutions.&lt;/li&gt;&#xA;&lt;li&gt;Judge changes by their consequences and reversibility, not by their category.&lt;/li&gt;&#xA;&lt;li&gt;Prefer feedback from reality over prediction.&lt;/li&gt;&#xA;&lt;li&gt;Prefer the right information over more information.&lt;/li&gt;&#xA;&lt;li&gt;Be adaptive to relevant change and robust against irrelevant change.&lt;/li&gt;&#xA;&lt;li&gt;The cost of gathering information is always less than the cost of building the wrong thing.&lt;/li&gt;&#xA;&lt;li&gt;Consistently wrong is worse than inconsistently right.&lt;/li&gt;&#xA;&lt;li&gt;Activity is not progress; do not confuse motion with movement.&lt;/li&gt;&#xA;&lt;li&gt;The skill is in choosing the right work, not in doing the work.&lt;/li&gt;&#xA;&lt;li&gt;Observed behavior reveals process better than stated process; read the artifact over the doc.&lt;/li&gt;&#xA;&lt;li&gt;Between two failure modes, choose the cheaper to recover from.&lt;/li&gt;&#xA;&lt;li&gt;Define success criteria before the experiment starts, not after.&lt;/li&gt;&#xA;&lt;li&gt;Truthful labeling forces truthful conversations about what you are explicitly not doing.&lt;/li&gt;&#xA;&lt;li&gt;A backlog is a commitment queue, not a wish list.&lt;/li&gt;&#xA;&lt;li&gt;Every item must trace to a parent goal; orphaned work is bloat.&lt;/li&gt;&#xA;&lt;li&gt;Never inflate priority labels; inflation destroys the meaning of every label.&lt;/li&gt;&#xA;&lt;li&gt;Distribute reversible decisions; give irreversible ones a single owner.&lt;/li&gt;&#xA;&lt;li&gt;When acting becomes cheap, deciding must become more careful; being wrong has not gotten cheaper.&lt;/li&gt;&#xA;&lt;li&gt;Start cheap and escalate on failure signals; pay premium prices only on the hard tail.&lt;/li&gt;&#xA;&lt;li&gt;When attempts are cheap, race them and keep the winner.&lt;/li&gt;&#xA;&lt;li&gt;Prefer risks you can audit over risks you must take on faith.&lt;/li&gt;&#xA;&lt;li&gt;Some work is faster done than delegated.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Planning and estimation&#xA;    &lt;div id=&#34;planning-and-estimation&#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;#planning-and-estimation&#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;Always plan, even if you don&amp;rsquo;t end up using the plan.&lt;/li&gt;&#xA;&lt;li&gt;Begin with the end in mind, then plan backwards.&lt;/li&gt;&#xA;&lt;li&gt;Define what &amp;ldquo;done&amp;rdquo; looks like before you start.&lt;/li&gt;&#xA;&lt;li&gt;Plan with the most realistic scenario in mind.&lt;/li&gt;&#xA;&lt;li&gt;Plan by preventing the worst scenarios from happening.&lt;/li&gt;&#xA;&lt;li&gt;Reduce risks and unknowns early in your projects.&lt;/li&gt;&#xA;&lt;li&gt;Separate discovery (figuring out what to do) from delivery (doing it); unrefined items do not get scheduled.&lt;/li&gt;&#xA;&lt;li&gt;Set a fixed time budget (appetite) that defines scope, rather than estimating an unbounded duration.&lt;/li&gt;&#xA;&lt;li&gt;Eliminate work by specifying better, not by running more of it.&lt;/li&gt;&#xA;&lt;li&gt;Separate the vision (direction) from the commitment (contract); never conflate them.&lt;/li&gt;&#xA;&lt;li&gt;Quantify everything you can, then measure it.&lt;/li&gt;&#xA;&lt;li&gt;Calibrate your estimates against your past performance.&lt;/li&gt;&#xA;&lt;li&gt;Keep buffers for when estimates are wrong.&lt;/li&gt;&#xA;&lt;li&gt;Use relative comparisons when absolute estimates are too hard.&lt;/li&gt;&#xA;&lt;li&gt;Prefer coarse discrete scales over false precision.&lt;/li&gt;&#xA;&lt;li&gt;Schedule the longest task first to minimize total completion time.&lt;/li&gt;&#xA;&lt;li&gt;Use robust statistics (median over mean) when measurements may be contaminated by outliers.&lt;/li&gt;&#xA;&lt;li&gt;Predictability is worth more than heroism.&lt;/li&gt;&#xA;&lt;li&gt;Track throughput and stability as independent axes; speed without stability is a house of cards.&lt;/li&gt;&#xA;&lt;li&gt;Fast feedback beats comprehensive feedback.&lt;/li&gt;&#xA;&lt;li&gt;Divergent estimates signal unspecified scope, not bad estimators.&lt;/li&gt;&#xA;&lt;li&gt;The serial fraction of your process caps all parallel speedup.&lt;/li&gt;&#xA;&lt;li&gt;Shrink long-term problems into chunks you can start and finish quickly.&lt;/li&gt;&#xA;&lt;li&gt;Technical debt has no natural advocate; fund it by fixed allocation.&lt;/li&gt;&#xA;&lt;li&gt;Manage the outcome, not the activity; effort signals die when execution is cheap.&lt;/li&gt;&#xA;&lt;li&gt;A delegable outcome names what becomes true, how it will be checked, and what it may cost.&lt;/li&gt;&#xA;&lt;li&gt;When exploration is nearly free, the failure mode is premature documentation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Leverage and compounding&#xA;    &lt;div id=&#34;leverage-and-compounding&#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;#leverage-and-compounding&#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;Separate activities into compounding and depreciating; protect compounding work and delegate or automate depreciating work.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use the two-year test: ask whether continuing an activity leaves future you more or less valuable.&lt;/li&gt;&#xA;&lt;li&gt;Overweight durable activities; underweight ephemeral ones.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Invest effort where the blast radius is largest, not where the noise is loudest.&lt;/li&gt;&#xA;&lt;li&gt;The constraint never disappears; it just moves.&lt;/li&gt;&#xA;&lt;li&gt;Move with the bottleneck as it shifts.&lt;/li&gt;&#xA;&lt;li&gt;The binding constraint is usually the layer you are not looking at.&lt;/li&gt;&#xA;&lt;li&gt;Continuously optimize.&lt;/li&gt;&#xA;&lt;li&gt;Periodically simplify; do not only add.&lt;/li&gt;&#xA;&lt;li&gt;Have people depend on you less and less.&lt;/li&gt;&#xA;&lt;li&gt;Avoid repeating yourself constantly.&lt;/li&gt;&#xA;&lt;li&gt;Prefer standard solutions for solved problems; spend your energy where it differentiates.&lt;/li&gt;&#xA;&lt;li&gt;Anything that scales with size must be optimized to grow slower than size.&lt;/li&gt;&#xA;&lt;li&gt;Make yourself unnecessary at the layer you occupy.&lt;/li&gt;&#xA;&lt;li&gt;Improving anything other than the binding constraint is theater.&lt;/li&gt;&#xA;&lt;li&gt;Automation relocates work to a different layer; it does not remove it.&lt;/li&gt;&#xA;&lt;li&gt;Per-unit effort cannot match entropy that is produced faster than you can process it; operate on the system that produces the units, not the units.&lt;/li&gt;&#xA;&lt;li&gt;Specification compounds; review is a non-compounding backstop.&lt;/li&gt;&#xA;&lt;li&gt;Delegation is not free even when the delegate is free; delegating a compounding activity forgoes the practice that built the judgment to evaluate it.&lt;/li&gt;&#xA;&lt;li&gt;Produce work that is cheap to accept, not merely plentiful.&lt;/li&gt;&#xA;&lt;li&gt;Unaccepted work is inventory; it rots the longer it waits.&lt;/li&gt;&#xA;&lt;li&gt;Discipline buys a constant factor; only replication buys a curve.&lt;/li&gt;&#xA;&lt;li&gt;Point surplus capacity at lightening the constraint, not at feeding it.&lt;/li&gt;&#xA;&lt;li&gt;When you cannot add capacity at the bottleneck, choke the demand arriving at it.&lt;/li&gt;&#xA;&lt;li&gt;The durable asset is the system that produces the work, not the work it produces.&lt;/li&gt;&#xA;&lt;li&gt;Every check you write is attention you never have to spend again.&lt;/li&gt;&#xA;&lt;li&gt;Audit the rules rather than each output; a bad rule produces bad outputs forever.&lt;/li&gt;&#xA;&lt;li&gt;Promote experts from reviewing outputs to owning the rules.&lt;/li&gt;&#xA;&lt;li&gt;The line between compounding and depreciating moves; re-sort it regularly.&lt;/li&gt;&#xA;&lt;li&gt;Delete scaffolding when the capability it propped up arrives.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learning and knowledge&#xA;    &lt;div id=&#34;learning-and-knowledge&#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;#learning-and-knowledge&#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;Learn new things everyday.&lt;/li&gt;&#xA;&lt;li&gt;There are no shortcuts to mastery; learn the fundamentals.&lt;/li&gt;&#xA;&lt;li&gt;Specialize first, then generalize.&lt;/li&gt;&#xA;&lt;li&gt;Deliberately practice the things you are weak at.&lt;/li&gt;&#xA;&lt;li&gt;Study failures, not just successes.&lt;/li&gt;&#xA;&lt;li&gt;Answering your own questions exposes what you do not yet understand.&lt;/li&gt;&#xA;&lt;li&gt;Learn from prediction errors (surprise), not just from outcomes.&lt;/li&gt;&#xA;&lt;li&gt;Build the mental model before you need it under pressure; you cannot grow one on demand.&lt;/li&gt;&#xA;&lt;li&gt;Reading is cheaper than writing; it transfers everywhere and builds the model without demanding fluency.&lt;/li&gt;&#xA;&lt;li&gt;Survey many sources in parallel, not sequentially, to surface cross-cutting patterns.&lt;/li&gt;&#xA;&lt;li&gt;Consume on demand, not on schedule; knowing where to find something when you need it beats knowing it now.&lt;/li&gt;&#xA;&lt;li&gt;Every new source or commitment should displace an existing one, not stack on top.&lt;/li&gt;&#xA;&lt;li&gt;Copy, transform, combine.&lt;/li&gt;&#xA;&lt;li&gt;Model those who have already achieved what you want and identify the gap between your state and theirs.&lt;/li&gt;&#xA;&lt;li&gt;You cannot prompt a mental model into existence under time pressure; foundation knowledge cannot be acquired just-in-time.&lt;/li&gt;&#xA;&lt;li&gt;Honest failures teach; soft failures train nothing and accumulate until they become outages.&lt;/li&gt;&#xA;&lt;li&gt;Transfer reasoning, not conclusions; your map expires, the navigation does not.&lt;/li&gt;&#xA;&lt;li&gt;Parallel consumption surfaces patterns that sequential decay hides.&lt;/li&gt;&#xA;&lt;li&gt;The last non-delegable job is articulating taste, what the automation is for.&lt;/li&gt;&#xA;&lt;li&gt;Only people can tell you that you are wrong; every other system replays decisions you already made.&lt;/li&gt;&#xA;&lt;li&gt;Judgment is grown by contact with consequences, not transferred by explanation.&lt;/li&gt;&#xA;&lt;li&gt;Judgment does not persist without exercise.&lt;/li&gt;&#xA;&lt;li&gt;Automating junior work cuts the input to the pipeline that produces senior engineers.&lt;/li&gt;&#xA;&lt;li&gt;When automation removes the struggle, the learning must become deliberate.&lt;/li&gt;&#xA;&lt;li&gt;When automation removes a learning channel, rebuild it deliberately off the critical path.&lt;/li&gt;&#xA;&lt;li&gt;Generation is free; understanding is not, and it is the part that appreciates.&lt;/li&gt;&#xA;&lt;li&gt;Maintain living knowledge, not snapshots; put recurring questions on a loop.&lt;/li&gt;&#xA;&lt;li&gt;A strong practice preference is scar tissue from a real failure somewhere else.&lt;/li&gt;&#xA;&lt;li&gt;Study how others reason about problems, not just their solutions.&lt;/li&gt;&#xA;&lt;li&gt;Much of what we call judgment is undocumented procedure, discoverable by attempting to automate it.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Memory and notes&#xA;    &lt;div id=&#34;memory-and-notes&#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;#memory-and-notes&#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;Always write down why.&lt;/li&gt;&#xA;&lt;li&gt;Externalize your memory: write down what is in your head.&lt;/li&gt;&#xA;&lt;li&gt;Capture first, organize later; keep a low-friction buffer separate from structured notes.&lt;/li&gt;&#xA;&lt;li&gt;Notes you never review are wasted; build a review loop into your information system.&lt;/li&gt;&#xA;&lt;li&gt;Memory of past interactions is signal to be retained, not bias to be eliminated.&lt;/li&gt;&#xA;&lt;li&gt;An unwritten decision&amp;rsquo;s half-life is one new person; write decisions down to make them travel.&lt;/li&gt;&#xA;&lt;li&gt;A meeting that ends without a written decision will have to be held again.&lt;/li&gt;&#xA;&lt;li&gt;Record rationale at decision time; a decision record written after the fact is fiction.&lt;/li&gt;&#xA;&lt;li&gt;A wrong claim in a durable document grows authority every day it survives.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Communication and writing&#xA;    &lt;div id=&#34;communication-and-writing&#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;#communication-and-writing&#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;Do not engage in fruitless debates or one-sided confrontations.&lt;/li&gt;&#xA;&lt;li&gt;It is more important to have support for your ideas than for them to be perfect or right.&lt;/li&gt;&#xA;&lt;li&gt;Use progressive disclosure: lead with a summary, offer detail only on request.&lt;/li&gt;&#xA;&lt;li&gt;Writing does not degrade as it passes through people; speech does, so write decisions down.&lt;/li&gt;&#xA;&lt;li&gt;Make stakeholders co-authors of decisions so they defend them rather than overturn them.&lt;/li&gt;&#xA;&lt;li&gt;Distribution is half the work of production; effort spent producing is wasted without matching effort on distribution.&lt;/li&gt;&#xA;&lt;li&gt;Be a source, not an echo.&lt;/li&gt;&#xA;&lt;li&gt;Proof of work is the signal that survives: show costly effort, not assertion.&lt;/li&gt;&#xA;&lt;li&gt;Narrow beats broad; specificity is what cannot be synthesized.&lt;/li&gt;&#xA;&lt;li&gt;Stories transfer; advice without context does not.&lt;/li&gt;&#xA;&lt;li&gt;Candor earns authority; admitting error builds trust faster than defending perfection.&lt;/li&gt;&#xA;&lt;li&gt;A fast, clear no is a kindness; silence is the answer that swells the queue.&lt;/li&gt;&#xA;&lt;li&gt;When instructions fail, the fix is usually subtraction; over-specification is the common decay.&lt;/li&gt;&#xA;&lt;li&gt;Writing exposes the gaps that live conversation silently repairs.&lt;/li&gt;&#xA;&lt;li&gt;Arrive with proposals others can amend, not verdicts they can only review.&lt;/li&gt;&#xA;&lt;li&gt;Answer the argument, not the volume.&lt;/li&gt;&#xA;&lt;li&gt;Demonstrate the hardest case, not the happy path; edge examples carry the most information.&lt;/li&gt;&#xA;&lt;li&gt;The judgment behind the words is the product; the prose is the cheap part.&lt;/li&gt;&#xA;&lt;li&gt;Fluency without experience produces echo.&lt;/li&gt;&#xA;&lt;li&gt;Factor ideas like code; extract and reuse instead of rewriting duplicates.&lt;/li&gt;&#xA;&lt;li&gt;Write ideas self-contained so they survive outside their original context.&lt;/li&gt;&#xA;&lt;li&gt;Volume makes you more of the flood, not more visible within it.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Systems and automation&#xA;    &lt;div id=&#34;systems-and-automation&#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;#systems-and-automation&#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;Have a structured process for everything you do that is written down and updated as it changes.&lt;/li&gt;&#xA;&lt;li&gt;Use checklists for routine critical tasks.&lt;/li&gt;&#xA;&lt;li&gt;Establish a manual process before automating it.&lt;/li&gt;&#xA;&lt;li&gt;When you repeatedly catch the same issue, automate the check.&lt;/li&gt;&#xA;&lt;li&gt;If you can describe a problem precisely, you can automate it.&lt;/li&gt;&#xA;&lt;li&gt;Engineer workflows around your own cognitive limits instead of trying to power through them.&lt;/li&gt;&#xA;&lt;li&gt;Use tools to amplify your judgment, not replace it.&lt;/li&gt;&#xA;&lt;li&gt;Distinguish between friction that wastes time and friction that prevents mistakes.&lt;/li&gt;&#xA;&lt;li&gt;The metric you optimize determines the system you get.&lt;/li&gt;&#xA;&lt;li&gt;Encode your judgment into the layer everything passes through; your leverage scales with encoded surface area, not hours.&lt;/li&gt;&#xA;&lt;li&gt;Encode standards as gates and defaults, not as opinions; a standard runs whether or not anyone agrees with it.&lt;/li&gt;&#xA;&lt;li&gt;Make the right behavior the path of least resistance: tax what you want less of, subsidize what you want more of.&lt;/li&gt;&#xA;&lt;li&gt;Convert preferences into machine-checkable invariants where possible.&lt;/li&gt;&#xA;&lt;li&gt;Grant autonomy gradually, based on accumulated evidence of reliability, not optimism.&lt;/li&gt;&#xA;&lt;li&gt;Make systems slow learners, not judges; require accumulated evidence before changing state.&lt;/li&gt;&#xA;&lt;li&gt;Bound autonomous systems on two independent axes: cost (budget) and capability (least privilege).&lt;/li&gt;&#xA;&lt;li&gt;Make operations idempotent so they are safe to re-trigger.&lt;/li&gt;&#xA;&lt;li&gt;Make failures visible; silent failures are worse than no automation at all.&lt;/li&gt;&#xA;&lt;li&gt;Design systems so that gaming them produces the behavior you wanted anyway.&lt;/li&gt;&#xA;&lt;li&gt;A system people do not trust is a system that does not run, regardless of how well it verifies.&lt;/li&gt;&#xA;&lt;li&gt;Make every automated decision legible: which rule fired, what it checked, who owns it.&lt;/li&gt;&#xA;&lt;li&gt;Keep a kill switch; the cost of not having one is an unconstrained runaway.&lt;/li&gt;&#xA;&lt;li&gt;When a measure becomes the target, it ceases to be a good measure.&lt;/li&gt;&#xA;&lt;li&gt;Drift rate must stay below the cleanup rate for a system to stay net-positive over time.&lt;/li&gt;&#xA;&lt;li&gt;Triage before review: decide whether something deserves your attention before you evaluate it.&lt;/li&gt;&#xA;&lt;li&gt;Use AI to triage AI.&lt;/li&gt;&#xA;&lt;li&gt;Variability is the enemy of scale.&lt;/li&gt;&#xA;&lt;li&gt;A system is a decision made once.&lt;/li&gt;&#xA;&lt;li&gt;A process that only works when nothing ever goes wrong is not a process, it is a countdown.&lt;/li&gt;&#xA;&lt;li&gt;An overloaded gate fails silently: rubber-stamped work feels reviewed without being reviewed.&lt;/li&gt;&#xA;&lt;li&gt;A queue grows without bound whenever intake outpaces processing.&lt;/li&gt;&#xA;&lt;li&gt;Every fixed cost at a gate incentivizes batching, and batching makes changes riskier.&lt;/li&gt;&#xA;&lt;li&gt;A human gate is also a human attack surface.&lt;/li&gt;&#xA;&lt;li&gt;Never let a system approve changes to itself; someone must audit the auditors.&lt;/li&gt;&#xA;&lt;li&gt;Either read a change deliberately or merge it on signals; do not fake the reading.&lt;/li&gt;&#xA;&lt;li&gt;Measure the gap between what a process claims to do and what its participants actually do.&lt;/li&gt;&#xA;&lt;li&gt;Every approval gate that adds no information is pure delay.&lt;/li&gt;&#xA;&lt;li&gt;A process earns its keep only if it forces thinking people would otherwise skip.&lt;/li&gt;&#xA;&lt;li&gt;One tool doing many jobs does each poorly; give each property its own dedicated check.&lt;/li&gt;&#xA;&lt;li&gt;Make critics adversarial and single-purpose: reward finding a failure, never approving.&lt;/li&gt;&#xA;&lt;li&gt;Defend a process with production outcomes, never with &amp;ldquo;a human looked at it&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;Separate deciding from executing, with different privileges, so neither runs away.&lt;/li&gt;&#xA;&lt;li&gt;Autonomy over an enumerated, closed list is auditable; autonomy over open-ended judgment is not.&lt;/li&gt;&#xA;&lt;li&gt;Apply the cheapest filters first; sort with cheap signals before spending deep attention.&lt;/li&gt;&#xA;&lt;li&gt;Feed every manual correction back into the artifact that produced it.&lt;/li&gt;&#xA;&lt;li&gt;Keep an exit from every dependency; switching should be a configuration change, not a rewrite.&lt;/li&gt;&#xA;&lt;li&gt;Scaling a flawed system repeats the flaw in every instance at once.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Software and code quality&#xA;    &lt;div id=&#34;software-and-code-quality&#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;#software-and-code-quality&#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;Every line of code is a liability.&lt;/li&gt;&#xA;&lt;li&gt;Invest in quality early because it compounds.&lt;/li&gt;&#xA;&lt;li&gt;The quality of the output is bounded by the quality of the input, context, or foundation that produced it.&lt;/li&gt;&#xA;&lt;li&gt;Front-load human effort where mistakes are cheapest to fix; the later you catch a defect, the more expensive it is.&lt;/li&gt;&#xA;&lt;li&gt;When a class of problem recurs, fix the source once so the correction compounds across every future occurrence.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Fix at the source once, or fix at the symptom forever.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Make quality a property of your constraints and system, not of individual reviewers.&lt;/li&gt;&#xA;&lt;li&gt;Separate the valuable act from the gating ritual; satisfy the function rigorously and let the form follow.&lt;/li&gt;&#xA;&lt;li&gt;Separate execution from review to avoid bias.&lt;/li&gt;&#xA;&lt;li&gt;When a reviewer shares the generator&amp;rsquo;s blind spots, agreement proves almost nothing; verify with independent signals.&lt;/li&gt;&#xA;&lt;li&gt;Use structurally diverse verification methods so failures do not correlate.&lt;/li&gt;&#xA;&lt;li&gt;Do not trust the output; trust the verification system behind it.&lt;/li&gt;&#xA;&lt;li&gt;Most production failures occur at integration points, not within components.&lt;/li&gt;&#xA;&lt;li&gt;Isolate components with different scaling characteristics so each can scale independently.&lt;/li&gt;&#xA;&lt;li&gt;Make coordination optional, not mandatory; components should function independently.&lt;/li&gt;&#xA;&lt;li&gt;Distinguish high-interest debt from low-interest debt; treat them differently.&lt;/li&gt;&#xA;&lt;li&gt;Defects flow downstream and multiply; fixes must flow upstream to compound.&lt;/li&gt;&#xA;&lt;li&gt;Fix the process, not the product.&lt;/li&gt;&#xA;&lt;li&gt;When the builder is a machine, code quality is bounded by specification quality.&lt;/li&gt;&#xA;&lt;li&gt;Move verification upstream to the specification; review is the latest, most expensive stage to catch an issue.&lt;/li&gt;&#xA;&lt;li&gt;Accountability lives upstream in the decisions that guided the work, not in whoever scans the diff at the end.&lt;/li&gt;&#xA;&lt;li&gt;Write the verification and acceptance criteria before the code exists.&lt;/li&gt;&#xA;&lt;li&gt;Right context, curated and ordered, beats more context; attention dilutes.&lt;/li&gt;&#xA;&lt;li&gt;Implicit assumptions are the most dangerous context gaps because you do not notice them.&lt;/li&gt;&#xA;&lt;li&gt;The value lives in the tails, not the mean; average-case metrics hide tail erosion.&lt;/li&gt;&#xA;&lt;li&gt;Keep the oracle separate from generation, and broader than the happy path.&lt;/li&gt;&#xA;&lt;li&gt;Subjective requirements are discovered by contact with the artifact, not enumerated in advance.&lt;/li&gt;&#xA;&lt;li&gt;For generated artifacts, the prompt is the source code.&lt;/li&gt;&#xA;&lt;li&gt;Maintain code as if no author can be asked.&lt;/li&gt;&#xA;&lt;li&gt;Optimize code for readability; it is read far more often than it is written.&lt;/li&gt;&#xA;&lt;li&gt;Concentrate what changes often; let what rarely changes be broad.&lt;/li&gt;&#xA;&lt;li&gt;Verification speed sets the ceiling on safe generation speed.&lt;/li&gt;&#xA;&lt;li&gt;Treat every passing test suite as a claim about coverage, not proof of correctness.&lt;/li&gt;&#xA;&lt;li&gt;Split verification (built right) from validation (right thing); they need different stages and owners.&lt;/li&gt;&#xA;&lt;li&gt;Review what a change does, not what it looks like.&lt;/li&gt;&#xA;&lt;li&gt;As generation gets cheaper, spend review on intent and substance, not style.&lt;/li&gt;&#xA;&lt;li&gt;Make reversibility a structural property of how changes are made, not a review-time judgment.&lt;/li&gt;&#xA;&lt;li&gt;Gate changes by blast radius and reversibility, not by artifact type.&lt;/li&gt;&#xA;&lt;li&gt;Write the contracts before fanning out workers; fixed interfaces make integration mechanical.&lt;/li&gt;&#xA;&lt;li&gt;Trust comes from attack, not inspection.&lt;/li&gt;&#xA;&lt;li&gt;Understand opaque artifacts by what they do, not what they are.&lt;/li&gt;&#xA;&lt;li&gt;You can own only as much code as you can understand.&lt;/li&gt;&#xA;&lt;li&gt;Keep the spec, delete the code.&lt;/li&gt;&#xA;&lt;li&gt;If you cannot answer why-questions without the tool, you generated the artifact rather than built it.&lt;/li&gt;&#xA;&lt;li&gt;Bad output is the truest signal about where the input is incoherent.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Teams and collaboration&#xA;    &lt;div id=&#34;teams-and-collaboration&#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;#teams-and-collaboration&#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;Structure (tooling, architecture, repository layout) should follow the coordination and trust structure, never lead it.&lt;/li&gt;&#xA;&lt;li&gt;The right size for any unit is the smallest that can own a coherent domain end-to-end.&lt;/li&gt;&#xA;&lt;li&gt;When something belongs to everyone, it belongs to no one; diffuse ownership causes decay.&lt;/li&gt;&#xA;&lt;li&gt;Every healthy system needs both entropy generators (visionaries) and entropy controllers (stewards).&lt;/li&gt;&#xA;&lt;li&gt;There is an optimal team size; beyond it, adding people decreases output.&lt;/li&gt;&#xA;&lt;li&gt;Push decisions down: let workers resolve their own ambiguities and escalate only above a defined threshold.&lt;/li&gt;&#xA;&lt;li&gt;Consistency beats optimality for conventions and practices.&lt;/li&gt;&#xA;&lt;li&gt;Treat practices and opinions as hypotheses to test, not identities to defend.&lt;/li&gt;&#xA;&lt;li&gt;Never discourage anyone who continually makes progress no matter how slow.&lt;/li&gt;&#xA;&lt;li&gt;Fix the system, not the person; structure determines behavior.&lt;/li&gt;&#xA;&lt;li&gt;Culture must be actively transmitted during growth; it dilutes by default.&lt;/li&gt;&#xA;&lt;li&gt;During a crisis, one person owns the response; everyone else supports.&lt;/li&gt;&#xA;&lt;li&gt;During incidents, diagnose first and assign blame never; save blame for the post-mortem.&lt;/li&gt;&#xA;&lt;li&gt;Hiding a boundary is not the same as removing it.&lt;/li&gt;&#xA;&lt;li&gt;Onboarding must scale sublinearly; keep the ratio of onboarded to onboarders above 1:1.&lt;/li&gt;&#xA;&lt;li&gt;Create new teams when the current team is at capacity, not when the project is already late.&lt;/li&gt;&#xA;&lt;li&gt;A team moves at the pace of its least coordinated member.&lt;/li&gt;&#xA;&lt;li&gt;Trust is the strongest predictor of team performance; a trusting team of mediocre engineers outperforms brilliant engineers who do not trust each other.&lt;/li&gt;&#xA;&lt;li&gt;Treat resistance as information; skeptics map where your system is weakest.&lt;/li&gt;&#xA;&lt;li&gt;The real architecture is the role structure of the contributors, not the dependency graph of the packages.&lt;/li&gt;&#xA;&lt;li&gt;Every harsh rule is a scar on reviewer time; trace each rule to the wound it prevents, and delete the ones that have none.&lt;/li&gt;&#xA;&lt;li&gt;The first disagreement a group resolves sets the template for every disagreement that follows.&lt;/li&gt;&#xA;&lt;li&gt;A team&amp;rsquo;s standard is set by whatever ships first, not by what it agrees is best.&lt;/li&gt;&#xA;&lt;li&gt;Absence of objection measures busyness, not consent.&lt;/li&gt;&#xA;&lt;li&gt;Name the cost of what you absorb, or the team learns absorption is free.&lt;/li&gt;&#xA;&lt;li&gt;People choose deferred shared costs over immediate personal ones, even when the deferred cost is larger.&lt;/li&gt;&#xA;&lt;li&gt;Tolerating post-decision overrides turns the process into veto by the most stubborn.&lt;/li&gt;&#xA;&lt;li&gt;A team directed by one person has one person&amp;rsquo;s judgment, no matter how many people it employs.&lt;/li&gt;&#xA;&lt;li&gt;Hoarding decisions manufactures the incompetence that justifies hoarding them.&lt;/li&gt;&#xA;&lt;li&gt;Name norm-violating behavior early, before it calcifies.&lt;/li&gt;&#xA;&lt;li&gt;Judge people by their total cost, not their visible output.&lt;/li&gt;&#xA;&lt;li&gt;Never reciprocate aggression; matching tone turns a disagreement into a status fight.&lt;/li&gt;&#xA;&lt;li&gt;Measure knowledge risk by re-acquisition time, not by how many heads hold the system.&lt;/li&gt;&#xA;&lt;li&gt;Treat planned absences as load tests of whether the system survives without its owner.&lt;/li&gt;&#xA;&lt;li&gt;Add a human when the context no longer fits in one head.&lt;/li&gt;&#xA;&lt;li&gt;Hire for where a person will disagree with you, not for how much they produce.&lt;/li&gt;&#xA;&lt;li&gt;The appearance of specialists marks the point where generalists can no longer cover the surface.&lt;/li&gt;&#xA;&lt;li&gt;Delegate execution without delegating ownership.&lt;/li&gt;&#xA;&lt;li&gt;A handoff is complete when the receiver can explain the work, not when the artifact runs.&lt;/li&gt;&#xA;&lt;li&gt;No owner, no merge.&lt;/li&gt;&#xA;&lt;li&gt;Before removing a role, name its function; the function survives the role.&lt;/li&gt;&#xA;&lt;li&gt;When producing is nearly free and owning is not, people produce more than they will maintain.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strategy and business&#xA;    &lt;div id=&#34;strategy-and-business&#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;#strategy-and-business&#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;When you outsource an outcome, you also outsource the decisions that produce it.&lt;/li&gt;&#xA;&lt;li&gt;Invest during good times so you can survive the bad; maintain a consistent strategy through both.&lt;/li&gt;&#xA;&lt;li&gt;Compete on what cannot be cloned.&lt;/li&gt;&#xA;&lt;li&gt;When everyone can build anything, deciding what to build becomes the differentiator.&lt;/li&gt;&#xA;&lt;li&gt;Low barriers to entry drive margins toward zero.&lt;/li&gt;&#xA;&lt;li&gt;When the cost to produce falls below the cost to consume, the consumer becomes the bottleneck.&lt;/li&gt;&#xA;&lt;li&gt;For an automated workforce, the evaluation pipeline is the critical asset, more than the agents it tests.&lt;/li&gt;&#xA;&lt;li&gt;Coherence is a job that must be owned, not a byproduct of good local decisions.&lt;/li&gt;&#xA;&lt;li&gt;A feature is a probe, not a deliverable.&lt;/li&gt;&#xA;&lt;li&gt;Trust is the slowest thing in a product to reproduce.&lt;/li&gt;&#xA;&lt;li&gt;Trust is the only distribution channel that does not saturate.&lt;/li&gt;&#xA;&lt;li&gt;Sell the outcome, not the tool.&lt;/li&gt;&#xA;&lt;li&gt;When everyone is fast, advantage shifts to the quality of the feedback signal.&lt;/li&gt;&#xA;&lt;li&gt;Make whoever creates the volume carry the cost of making it reviewable.&lt;/li&gt;&#xA;&lt;li&gt;When the cost to create falls below the cost to review, review becomes the resource to defend.&lt;/li&gt;&#xA;&lt;li&gt;Put the cost back where the benefit was captured.&lt;/li&gt;&#xA;&lt;li&gt;Build alternatives; dependence is what gives aggression its leverage.&lt;/li&gt;&#xA;&lt;li&gt;When the layer you mastered commoditizes, move your value up a layer.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Company onboarding</title>
      <link>https://tomrochette.com/processes/company-onboarding/</link>
      <pubDate>Wed, 23 Dec 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/company-onboarding/</guid>
      <category>software-development</category><category>projects</category><category>processes</category><category>work</category>
      <description>&lt;p&gt;The onboarding process described here is specific to a software engineer joining a tech company. While some/most of the items may still apply to any job where you mainly work from a computer, the assumption will be that you develop software as an individual contributor.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Week 1&#xA;    &lt;div id=&#34;week-1&#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;#week-1&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Setup laptop&lt;/li&gt;&#xA;&lt;li&gt;Access to slack&lt;/li&gt;&#xA;&lt;li&gt;Access to zoom&lt;/li&gt;&#xA;&lt;li&gt;Setup &lt;a href=&#34;https://tomrochette.com/work/calendar-reminders/&#34; &gt;calendar reminders&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Initial meeting with buddy&lt;/li&gt;&#xA;&lt;li&gt;Access to git central repository&lt;/li&gt;&#xA;&lt;li&gt;Installation of development tools/languages&lt;/li&gt;&#xA;&lt;li&gt;Request software licenses&lt;/li&gt;&#xA;&lt;li&gt;Access to CI/CD&lt;/li&gt;&#xA;&lt;li&gt;Find where task management is done&lt;/li&gt;&#xA;&lt;li&gt;Find the documentation to build projects&lt;/li&gt;&#xA;&lt;li&gt;Connect 1 on 1 with each member of the team&lt;/li&gt;&#xA;&lt;li&gt;Meet with manager 1 on 1&lt;/li&gt;&#xA;&lt;li&gt;Define a 30-60-90 days plan with manager&lt;/li&gt;&#xA;&lt;li&gt;Verify access to various systems (SSO, code repository, insurance company, payroll company, etc.)&lt;/li&gt;&#xA;&lt;li&gt;End of week meeting with buddy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Week 2&#xA;    &lt;div id=&#34;week-2&#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;#week-2&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Setup and run the one step build process&lt;/li&gt;&#xA;&lt;li&gt;Determine how are features/tasks prioritized, who prioritizes features/tasks&lt;/li&gt;&#xA;&lt;li&gt;Review the team documentation&lt;/li&gt;&#xA;&lt;li&gt;Review team practices/processes documentation (code style, code review, standups, planning, retrospective, demos)&lt;/li&gt;&#xA;&lt;li&gt;Review common vocabulary, terminology, glossary documents&lt;/li&gt;&#xA;&lt;li&gt;First PR + code review&lt;/li&gt;&#xA;&lt;li&gt;Review the career ladder of the position&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Week 3&#xA;    &lt;div id=&#34;week-3&#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;#week-3&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review user definition, use cases, requirements&lt;/li&gt;&#xA;&lt;li&gt;Read prior team meetings notes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Week 4&#xA;    &lt;div id=&#34;week-4&#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;#week-4&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Identify how deployments are done&lt;/li&gt;&#xA;&lt;li&gt;Review the team roadmap&lt;/li&gt;&#xA;&lt;li&gt;Determine where I can have the biggest impact&lt;/li&gt;&#xA;&lt;li&gt;Determine a timeline where I&amp;rsquo;ll have reached my 80/20 at the company&lt;/li&gt;&#xA;&lt;li&gt;Determine the maturity of existing projects&lt;/li&gt;&#xA;&lt;li&gt;Determine how fast can we iterate on certain aspects given the team/company composition&lt;/li&gt;&#xA;&lt;li&gt;Identify the core/principal/staff contributors and their contributions&lt;/li&gt;&#xA;&lt;li&gt;Review the architecture of the system&lt;/li&gt;&#xA;&lt;li&gt;Review the database architecture&lt;/li&gt;&#xA;&lt;li&gt;Learn about &amp;ldquo;how we got to this point&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;Determine whether the product is a monolith or micro-services&lt;/li&gt;&#xA;&lt;li&gt;Identify which (3rd party) tools are used by the team/company&lt;/li&gt;&#xA;&lt;li&gt;Determine the portfolio of STARS situations of the team/company&lt;/li&gt;&#xA;&lt;li&gt;Determine a rough estimate of the number of people in the different organizations&lt;/li&gt;&#xA;&lt;li&gt;Connect 1 on 1 with important collaborator in other teams&lt;/li&gt;&#xA;&lt;li&gt;End of first month meeting with buddy&lt;/li&gt;&#xA;&lt;li&gt;First month performance review with manager&lt;/li&gt;&#xA;&lt;li&gt;Informal 360-degree review with manager and peers on adaptation&lt;/li&gt;&#xA;&lt;li&gt;Month 1 job satisfaction review&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Week 8&#xA;    &lt;div id=&#34;week-8&#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;#week-8&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Team interaction diagram&lt;/li&gt;&#xA;&lt;li&gt;Month 2 job satisfaction review&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Week 12&#xA;    &lt;div id=&#34;week-12&#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;#week-12&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Month 3 job satisfaction review&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Day trading in Canada</title>
      <link>https://tomrochette.com/day-trading-in-canada/</link>
      <pubDate>Sun, 29 Nov 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/day-trading-in-canada/</guid>
      <category>finance</category><category>stocks</category>
      <description>&lt;p&gt;Notice/Advisory: I am not an accountant nor a day trader. The following is not advice, only notes I&amp;rsquo;ve taken for myself. Content may be wrong or inaccurate. Use at your own risk.&lt;/p&gt;&#xA;&lt;p&gt;The following is a list of items and things to think about if you would like to be a day trader. I wrote it with the intent of identifying what were the requirements to be a day trader and what would be the impacts of being considered as one vs being an investor.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Basics&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Computer or phone&lt;/li&gt;&#xA;&lt;li&gt;Internet&lt;/li&gt;&#xA;&lt;li&gt;Broker&lt;/li&gt;&#xA;&lt;li&gt;Money&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Do not do day trading in your TFSA/RRSP/RESP accounts&lt;/li&gt;&#xA;&lt;li&gt;Your gains/losses will either be categorized as capital gains (50% taxable) or business income (100% taxable) based on how you trade. In any case, since this is a day trading article, you can assume this will be business income. Here are some properties taken into account&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Volume and frequency of trading&lt;/li&gt;&#xA;&lt;li&gt;Length of ownership of securities&lt;/li&gt;&#xA;&lt;li&gt;Type of securities owned&lt;/li&gt;&#xA;&lt;li&gt;Your profession and level of stock market knowledge&lt;/li&gt;&#xA;&lt;li&gt;If trading is your main source of income or substantially supplements it&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Here it is not clear what substantially represents. I would estimate that anything below 25% of your non-trading income isn&amp;rsquo;t substantial.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If you want to day trade, you will want to have access to level 2 data, which costs money depending on your broker&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Some brokers will reimburse your data package fees if you spend a certain amount of money on commissions each month. For example, Questrade data package will cost you 90$/month, but if you spend over 400$ on commissions this fee will be rebated.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;You do not need to register with the government or any agency&lt;/li&gt;&#xA;&lt;li&gt;You do not need a minimal amount of money, although it is suggested to have a few thousands dollars otherwise you will not make a lot of profit daily and your commissions fees are likely to eat any profit you will make&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Some brokers have minimum account balance&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;You have a trading strategy&lt;/li&gt;&#xA;&lt;li&gt;Track your transactions&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Time of entry/exit&lt;/li&gt;&#xA;&lt;li&gt;Cost at entry/exit&lt;/li&gt;&#xA;&lt;li&gt;Symbol/Ticker&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://investingbasics.ca/guides/day-trading/#2--how-to-start-day-trading-&#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=investingbasics.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://investingbasics.ca/guides/day-trading/#2--how-to-start-day-trading-&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.wealthsimple.com/en-ca/learn/how-to-start-day-trading&#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=www.wealthsimple.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.wealthsimple.com/en-ca/learn/how-to-start-day-trading&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Habits</title>
      <link>https://tomrochette.com/processes/habits/</link>
      <pubDate>Sun, 15 Nov 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/habits/</guid>
      <category>processes</category><category>habits</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Decide what habit you want to have and record why you want this habit&lt;/li&gt;&#xA;&lt;li&gt;Start with the smallest amount of effort possible&lt;/li&gt;&#xA;&lt;li&gt;Increase the amount of effort regularly until you reach the desired amount of regular effort&lt;/li&gt;&#xA;&lt;li&gt;Track your habit in a habit recording system such as &lt;a href=&#34;https://play.google.com/store/apps/details?id=org.isoron.uhabits&#34;&gt;Loop Habit Tracker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Review on a regular basis (monthly) whether you want to keep this habit or not&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you decide not to keep the habit, record why you decided to drop the habit such that if you decide to pick it up again, you can determine whether you might end up dropping it again.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;It&amp;rsquo;s not a problem if you miss doing your habit, just make sure to do it when you&amp;rsquo;re supposed to&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;My habits&#xA;    &lt;div id=&#34;my-habits&#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;#my-habits&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Daily&#xA;    &lt;div id=&#34;daily&#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;#daily&#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://tomrochette.com/processes/daily-planning/&#34; &gt;Daily planning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/daily-review/&#34; &gt;Daily review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Eat/Drink&lt;/li&gt;&#xA;&lt;li&gt;Shower&lt;/li&gt;&#xA;&lt;li&gt;Wash dishes&lt;/li&gt;&#xA;&lt;li&gt;Cook&lt;/li&gt;&#xA;&lt;li&gt;Exercise&lt;/li&gt;&#xA;&lt;li&gt;Read&lt;/li&gt;&#xA;&lt;li&gt;Watch TV shows&lt;/li&gt;&#xA;&lt;li&gt;Floss&lt;/li&gt;&#xA;&lt;li&gt;Brush teeth&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Weekly&#xA;    &lt;div id=&#34;weekly&#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;#weekly&#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://tomrochette.com/processes/weekly-planning/&#34; &gt;Weekly planning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/weekly-review/&#34; &gt;Weekly review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Wash clothes&lt;/li&gt;&#xA;&lt;li&gt;Clean apartment&lt;/li&gt;&#xA;&lt;li&gt;Buy groceries&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Monthly&#xA;    &lt;div id=&#34;monthly&#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;#monthly&#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;Monthly planning&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/monthly-review/&#34; &gt;Monthly review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Pay bills&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Yearly&#xA;    &lt;div id=&#34;yearly&#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;#yearly&#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;Yearly planning&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/yearly-review/&#34; &gt;Yearly review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;My prompts&#xA;    &lt;div id=&#34;my-prompts&#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;#my-prompts&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Daily planning at 10 am&lt;/li&gt;&#xA;&lt;li&gt;Weekly planning on Mondays&lt;/li&gt;&#xA;&lt;li&gt;Monthly planning on the first of the month&lt;/li&gt;&#xA;&lt;li&gt;Pay credit card on the first of the month&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;My prompt sources&#xA;    &lt;div id=&#34;my-prompt-sources&#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;#my-prompt-sources&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Google Keep&lt;/li&gt;&#xA;&lt;li&gt;Google Calendar&lt;/li&gt;&#xA;&lt;li&gt;Google Mail&lt;/li&gt;&#xA;&lt;li&gt;Slack&lt;/li&gt;&#xA;&lt;li&gt;Daylio&lt;/li&gt;&#xA;&lt;li&gt;Notion&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Planning large software projects</title>
      <link>https://tomrochette.com/processes/planning-large-software-projects/</link>
      <pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/planning-large-software-projects/</guid>
      <category>processes</category><category>software-development</category><category>projects</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;List all the features you would like to develop&lt;/li&gt;&#xA;&lt;li&gt;Define an appetite for the task (day, week, month, quarter)&lt;/li&gt;&#xA;&lt;li&gt;Identify the features where the appetite differs between individuals and discuss them to reach consensus&lt;/li&gt;&#xA;&lt;li&gt;Define the roles necessary to complete the task&lt;/li&gt;&#xA;&lt;li&gt;Identify dependencies between features&lt;/li&gt;&#xA;&lt;li&gt;Categorize the dependencies&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Soft: somewhat depends on this other feature but isn&amp;rsquo;t blocked by its absence from the codebase&lt;/li&gt;&#xA;&lt;li&gt;Hard: depends on this other feature and is blocked by its absence from the codebase&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Prioritize the features&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://about.gitlab.com/handbook/product/product-processes/#using-the-rice-framework&#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=about.gitlab.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Use the RICE framework&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Priority can also be skipped if using ROI as prioritization metric&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Estimate the value of a features in dollars&lt;/li&gt;&#xA;&lt;li&gt;Calculate a ROI (return on investment) as the estimated value of the feature divided by the defined appetite&lt;/li&gt;&#xA;&lt;li&gt;Order tasks according to dependencies and ROI&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Test parallelism</title>
      <link>https://tomrochette.com/tests-parallelism/</link>
      <pubDate>Sat, 31 Oct 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/tests-parallelism/</guid>
      <category>software</category><category>test</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Start the longest tests first. If you have for example 2 tests, a short one and a long one, the long one will be the sequential bottleneck. If you have many additional short tests, they will run in parallel to the longer one. If you have 2 workers, 1 will be dedicated to the long task while the other will process many of the short tests. If the total execution time of the short tasks is greater than the longer task then the total execution time will be at least the duration of the long task.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If we were not to schedule the longest tests first, we run the risk of running many short tests on a worker and then running the longest test, which may be suboptimal.&lt;/li&gt;&#xA;&lt;li&gt;As you accumulate many short tests this issue is mitigated. However you have to be careful of distributing your longest tasks on separate workers as much as possible.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If you know the exact duration of a test (or an approximation of it, given a desired quantum), determine if you can solve the scheduling problem in a reasonable amount of time such that solving the scheduling and running the scheduled tests takes less time than running the tests.&lt;/li&gt;&#xA;&lt;li&gt;From the standpoint of execution, we will prefer to have the best response time possible (i.e., run the shortest tasks first to get most of the tests executed as soon as possible).&lt;/li&gt;&#xA;&lt;li&gt;As you have many short and long tests, it may make sense to run all the short tests first and keep all the long tests for the end, ignoring the heuristics that suggests running the longest tests first.&lt;/li&gt;&#xA;&lt;li&gt;Other important consideration when running tests are shared environments/resources between tests. If those take a non-neglectable amount of time to setup/teardown and could be reused, it may be beneficial to group such tests on the same worker in order to avoid paying the cost of setup/teardown.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Setup/teardown duration should be recorded and be associated to each test.&lt;/li&gt;&#xA;&lt;li&gt;Some system have different types of setup/teardown: global, per class/module/scope. Being able to be aware of whether the test system will need to re-run a set of setup/teardown functions may help with scheduling the tests.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;While we may be collecting test duration data, it is important to be aware that this data may end up being tainted if used in a continuous integration system. What this means is that we may sometimes record durations that are out of the ordinary due to a bug in the code, or because the tests execute on different hardware.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;To mitigate this issue we may use different approaches such as using the median of the recorded values (which is more robust to outliers than the mean), use a percentile (such as 95%) to determine the expected duration, record the duration of successful tests separately from failed ones, record tests in separate buckets defined by the user (e.g., defined on the CPU spec used to run the test), etc.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If the number/list of tests hasn&amp;rsquo;t changed since the last run, it would also be beneficial to store the computed schedule so that it is only computed once and reused many times, which is a common use case. The only time you may not want to do this is if computing the schedule is very cheap and represent a neglectable amount of time in the overall testing process.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Example use case - pytest-xdist&#xA;    &lt;div id=&#34;example-use-case---pytest-xdist&#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;#example-use-case---pytest-xdist&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;By default pytest does not store any prior test duration so we would have to estimate that all tests are of equal duration.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;As we run tests, we may start to collect information about the duration of parameterized tests. This may serve us to determine whether the parameterized test has the same duration over different set of parameters and serve as a base to start providing estimates for the remaining parameters combination of this test.&lt;/li&gt;&#xA;&lt;li&gt;A system similar to the cache provided by pytest may be used to record the duration of tests&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Concepts&#xA;    &lt;div id=&#34;concepts&#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;#concepts&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Scheduler: responsible for taking a set of tests with meta data and scheduling them (i.e., determine in which order they will be executed).&lt;/li&gt;&#xA;&lt;li&gt;test: the unit of code to execute.&lt;/li&gt;&#xA;&lt;li&gt;test duration: the duration of a test. Test duration may be represented as a distribution since tests generally do not complete in an exact and fixed amount of time.&lt;/li&gt;&#xA;&lt;li&gt;test unit: a collection of tests that we can assume as being the same test (e.g., parameterized tests).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Scheduling_%28computing%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Scheduling_(computing)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Queueing_theory&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Queueing_theory&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Queuing_Rule_of_Thumb&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Queuing_Rule_of_Thumb&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.pytest.org/en/latest/cache.html&#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.pytest.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://docs.pytest.org/en/latest/cache.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Decision log</title>
      <link>https://tomrochette.com/processes/decision-log/</link>
      <pubDate>Sat, 08 Aug 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/decision-log/</guid>
      <category>general</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Do you understand what is at stake?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Do you know what already exists?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Can you take an informed decision?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;What did you consider during your decision?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;What are your unknowns (things you&amp;rsquo;d need to know before your can make a decision)?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Do you have experience with the problem which needs a decision?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Indicate who has the most expertise to make the decision.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;You should be allowed to cast a vote if the decision will impact you. If it doesn&amp;rsquo;t (i.e., you&amp;rsquo;re not a stakeholder), your vote will not be counted towards  any option.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reading one book per day</title>
      <link>https://tomrochette.com/reading-one-book-per-day/</link>
      <pubDate>Mon, 27 Jul 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/reading-one-book-per-day/</guid>
      <category>reading</category><category>books</category>
      <description>&lt;p&gt;Let&amp;rsquo;s start by saying I&amp;rsquo;m not suggesting you read a full book per day. What I&amp;rsquo;m suggesting is to read at least a few pages of a book per day, reading a variety of books over the course of a week.&lt;/p&gt;&#xA;&lt;p&gt;For a while I used to start book and finish them before starting another one. I&amp;rsquo;d allow myself to read a fiction book and a technical book at the same time, but not more than that. The idea was that by reading more than one of each my brain would have trouble with context and information retention.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve recently decided to switch this approach. The main reason was that I found myself spending too much time reading articles online that I thought didn&amp;rsquo;t bring me much value over time. I always thought books were more valuable, but their biggest problem was that it required a good amount of time involvement for the value to kick in.&lt;/p&gt;&#xA;&lt;p&gt;Just like there are two strategies in learning systems, exploration and exploitation, I decided that leaning more on the exploration side might be more useful. In learning theory, &amp;ldquo;exploration&amp;rdquo; refers to trying new things or information, while &amp;ldquo;exploitation&amp;rdquo; involves deepening knowledge in known areas. Instead of spending hours on the same book over a short period of time (1-3 months), I would instead read bits of many books at once.&lt;/p&gt;&#xA;&lt;p&gt;Here are the benefits I&amp;rsquo;ve observed through this approach:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s easier to identify similar sources&lt;/strong&gt;. I would read a few books on a similar topic, and of course they would all cite the same sources. The difference between processing all those books in parallel instead of sequentially is that you notice the pattern of reuse more clearly. When reading the books sequentially, what happens is that this type of information decays over time. We start to forget what the last book was referring to, so that the next book appears to have new references.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Similar ideas can be identified and speed up reading&lt;/strong&gt;. As you identify the same ideas in different books, instead of reading the arguments careful in each book, the best argument is read thoroughly and the others quickly scanned for additional information.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;You are exposed to more variety&lt;/strong&gt;. Some people get topic fatigue, which is that you get bored of reading on the same topic. Reading on different topics avoids this issue while also stimulating you to think about many topics. This is a great way to sometimes make connections between unrelated topics.&lt;/p&gt;&#xA;&lt;p&gt;Overall I&amp;rsquo;ve been very satisfied with this experiment and I&amp;rsquo;ve been doing it for over 4 months now. I highly recommend it if you have a large list of books you haven&amp;rsquo;t started yet. See my article &lt;a href=&#34;https://tomrochette.com/questions/2020/01/06/&#34; &gt;How to prioritize which book to read&lt;/a&gt; to help you organize your reading.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Tesseract TSV format</title>
      <link>https://tomrochette.com/tesseract-tsv-format/</link>
      <pubDate>Sun, 12 Apr 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/tesseract-tsv-format/</guid>
      <category>software</category><category>ocr</category>
      <description>&lt;p&gt;&lt;a href=&#34;https://tesseract-ocr.github.io/&#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=tesseract-ocr.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Tesseract&lt;/a&gt; (an open source OCR engine) supports a &lt;a href=&#34;https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html#tsv-output-currently-available-in-305-dev-in-master-branch-on-github&#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=tesseract-ocr.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;TSV format as output&lt;/a&gt;. I looked online for some documentation about the columns but couldn&amp;rsquo;t find anything, so I looked at the &lt;a href=&#34;https://github.com/tesseract-ocr/tesseract/blob/cdebe13d81e2ad2a83be533886750f5491b25262/src/api/baseapi.cpp#L1398&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;source code&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here is a summary description of each column, what they represent, and the range of valid values they can have.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;level:&lt;/strong&gt; hierarchical layout (a word is in a line, which is in a paragraph, which is in a block, which is in a page), a value from 1 to 5&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1: page&lt;/li&gt;&#xA;&lt;li&gt;2: block&lt;/li&gt;&#xA;&lt;li&gt;3: paragraph&lt;/li&gt;&#xA;&lt;li&gt;4: line&lt;/li&gt;&#xA;&lt;li&gt;5: word&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;page_num:&lt;/strong&gt; when provided with a list of images, indicates the number of the file, when provided with a multi-pages document, indicates the page number, starting from 1&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;block_num:&lt;/strong&gt; block number within the page, starting from 0&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;par_num:&lt;/strong&gt; paragraph number within the block, starting from 0&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;line_num:&lt;/strong&gt; line number within the paragraph, starting from 0&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;word_num:&lt;/strong&gt; word number within the line, starting from 0&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;left:&lt;/strong&gt; x coordinate in pixels of the text bounding box top left corner, starting from the left of the image&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;top:&lt;/strong&gt; y coordinate in pixels of the text bounding box top left corner, starting from the top of the image&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;width:&lt;/strong&gt; width of the text bounding box in pixels&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;height:&lt;/strong&gt; height of the text bounding box in pixels&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;conf:&lt;/strong&gt; confidence value, from 0 (no confidence) to 100 (maximum confidence), -1 for all level except 5&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;text:&lt;/strong&gt; detected text, empty for all levels except 5&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here is an example of the TSV format output, for reference.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;level&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;page_num&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;block_num&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;par_num&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;line_num&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;word_num&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;left&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;top&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;width&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;height&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;conf&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;text&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1024&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;800&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;-1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;98&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;66&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;821&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;596&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;-1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;98&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;66&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;821&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;596&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;-1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;105&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;66&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;719&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;48&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;-1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;105&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;66&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;74&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;32&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;90&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;The&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;205&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;67&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;143&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;87&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;(quick)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;376&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;69&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;153&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;41&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;89&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[brown]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;559&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;71&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;105&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;89&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{fox}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;687&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;73&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;137&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;41&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;89&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;jumps!&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;104&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;115&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;784&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;51&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;-&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;104&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;115&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;96&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;33&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;91&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Over&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;224&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;117&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;60&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;32&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;89&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;the&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;310&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;117&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;224&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;39&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;88&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$43,456.78&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;561&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;121&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;136&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;42&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;92&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&amp;lt;lazy&amp;gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;722&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;123&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;70&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;32&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;92&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;#90&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;818&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;125&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;70&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;41&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;89&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;dog&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html&#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=tesseract-ocr.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Resume filtering</title>
      <link>https://tomrochette.com/questions/2020/03/31/</link>
      <pubDate>Tue, 31 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/31/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What do I look for in a resume?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start by the things I don&amp;rsquo;t look at in a resume for a position in which experience is expected:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Your university:&lt;/strong&gt; I couldn&amp;rsquo;t care less where you&amp;rsquo;ve studied. While having a university degree may sometimes tell me you&amp;rsquo;ve been serious enough to go through the pain of university, I also know it&amp;rsquo;s possible to go through university without acquiring any knowledge.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Your grades:&lt;/strong&gt; It&amp;rsquo;s great that you have A+ in so many classes. However grades do not always generalize to an effective worker. Furthermore, most of the applicants will also have high grades, which makes it a noisy/useless signal. Do understand that I also do not have the time to fact-check your grades, so you might as well have written you had a perfect score in every class. Be careful with this, as some people will see it as something to probe you on during the initial interviews, and this could backfire on you.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Your extra-curricular activities:&lt;/strong&gt; Unless you are doing extra-curricular activities that are relevant to the position you are applying for, I am not filtering for people with whom I could do things with outside of work.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The list of all your publications:&lt;/strong&gt; I work in a scientific field, and while for some publications are badges of success, I see listing articles as filler into a resume. If I want to know all the articles you&amp;rsquo;ve published, I can look it up on Google Scholar. Instead, focus on listing the areas of research you&amp;rsquo;re interested in and indicating how many papers in those areas you&amp;rsquo;ve published.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here are the things I look for:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;2-3 pages:&lt;/strong&gt; If you cannot summarize your accomplishments in less than 3 pages, then you don&amp;rsquo;t know how to summarize. I don&amp;rsquo;t want to know everything you&amp;rsquo;ve done in your professional life. I don&amp;rsquo;t want to know every single paper you&amp;rsquo;ve published, every conference/workshop you&amp;rsquo;ve attended, every grant you&amp;rsquo;ve received, every honors you have.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Relevant work experience:&lt;/strong&gt; If you&amp;rsquo;ve been working in the same position for a different company, that will generally be a good thing. It means you already have prior experience in the field, you have seen how another company has accomplished what you might still do at your new job. It means you&amp;rsquo;ll be easier to ramp up and may require less supervision/support during that period.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;List what you did:&lt;/strong&gt; If you only list the title/position you had and the company, I have no clue what you did there. You might as well not have worked there. Clearly list the big tasks/milestones you&amp;rsquo;ve worked on and what was your contribution.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;List clear and quantitative accomplishments:&lt;/strong&gt; &amp;ldquo;Increased sales by 200%&amp;rdquo;, &amp;ldquo;Largely reduced operation costs&amp;rdquo; may sound great, but without the ability to compare against something, those accomplishments do not mean much.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;List technologies you&amp;rsquo;ve used:&lt;/strong&gt; When hiring it is often common that you want your new recruits to already have some prior experience in the tools that are used at the company, especially if you need them to ramp up quickly. This is even more important when the set of tools used in your industry is common enough as it will communicate how in touch with the field you are.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Proper ordering of the sections of your resume:&lt;/strong&gt; It&amp;rsquo;s a little thing, but the ordering of the sections in your resume will communicate a lot to me. It will let me know whether you know how to prioritize, which is a critical skill. This point goes in hand with the &amp;ldquo;2-3 pages&amp;rdquo; item, as they both show that you are able to critically assess the content you produce.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;What you studied in university:&lt;/strong&gt; I expect people that apply to the positions I filter for to belong into a certain set of domains. This is generally not a very important criterion, but it gives me a better idea of your professional career.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;When you finished your degree:&lt;/strong&gt; This is used to determine how recent your education is. I consider professional experience once the degree is completed, not while it is being completed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Free of grammatical and syntactical errors:&lt;/strong&gt; Make sure your resume doesn&amp;rsquo;t have major grammatical or syntactical mistakes. Those communicate a lack of seriousness and professionalism that I would expect in your future communication with others in the company. If your resume was initially written in a different language, make sure it is thoroughly translated.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Github account:&lt;/strong&gt; If you list one, expect me to look at it. If you don&amp;rsquo;t contribute much (less than 20 contributions per year), then it&amp;rsquo;s simply better not to list it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Personal website:&lt;/strong&gt; If you list one, I will look at it as well. I have a background in web development, so I will use it as an additional way to evaluate it. Make sure it is online. A personal website that is down or for which the domain expired will lose you points.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Data profiling</title>
      <link>https://tomrochette.com/questions/2020/03/30/</link>
      <pubDate>Mon, 30 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/30/</guid>
      <category>questions</category><category>time-series</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is data profiling?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Data profiling is the process of extracting information about data. Given tabular data (think of an Excel spreadsheet), we commonly want to extract the following properties about each column:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Number of rows&lt;/li&gt;&#xA;&lt;li&gt;Number of cells without data&lt;/li&gt;&#xA;&lt;li&gt;Number of cells with a value of zero&lt;/li&gt;&#xA;&lt;li&gt;Number of distinct/unique values&lt;/li&gt;&#xA;&lt;li&gt;Number of duplicate rows&lt;/li&gt;&#xA;&lt;li&gt;Minimum, mean, median, maximum, quantiles, range, standard deviation, variance, sum&lt;/li&gt;&#xA;&lt;li&gt;Values distribution&lt;/li&gt;&#xA;&lt;li&gt;Most common values&lt;/li&gt;&#xA;&lt;li&gt;Examples of values&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The process of data profiling allows a data scientist or engineer to identify quickly potential sources of problems in the data such as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Negative numbers when numbers should all be positive&lt;/li&gt;&#xA;&lt;li&gt;Missing values which may need to be imputed or for which the row may have to be removed&lt;/li&gt;&#xA;&lt;li&gt;Issues with the distribution of values such as class imbalance if we plan to solve a classification problem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In an ideal situation, data profiling reports:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No missing cells, this way you do not have to ask if data can be filled in or you don&amp;rsquo;t need to impute the data using assumptions&lt;/li&gt;&#xA;&lt;li&gt;Proper &lt;a href=&#34;https://en.wikipedia.org/wiki/Database_normalization&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;normalization&lt;/a&gt; of the data (e.g., value separate from their unit), this way the data can be used as-is, otherwise you need to transform the column to extract the numeric value from the unit&lt;/li&gt;&#xA;&lt;li&gt;All the data in a column using the same unit, unless otherwise specified (e.g., you do not want data in meters, centimeters, feet or inches in the same column), this way your data is consistent, otherwise you need to identify the scales/units used and transform the data to use a common unit&lt;/li&gt;&#xA;&lt;li&gt;Little to no row duplication, this way you know that your data was collected without creating duplicate entries, which sometimes happen when databases are merged manually to create a data file, otherwise you may have to drop the duplicate rows or identify how many of the duplicates should be kept&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Time series forecasting projects</title>
      <link>https://tomrochette.com/questions/2020/03/29/</link>
      <pubDate>Sun, 29 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/29/</guid>
      <category>questions</category><category>time-series</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the general steps of a time series forecasting project?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Data profiling&#xA;    &lt;div id=&#34;data-profiling&#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;#data-profiling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Using a tool such as &lt;a href=&#34;https://github.com/pandas-profiling/pandas-profiling&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pandas-profiling&lt;/a&gt;, the dataset provided by the client is profiled and a variety of summary statistics produced, such as the min, mean, median, max, quartiles, number of samples, number of zeros, missing values, etc. are computed for numerical values. Other types of data also have their own set of properties computed.&lt;/p&gt;&#xA;&lt;p&gt;These summary statistics allow you to quickly have a glance at the data. You will want to look for missing values to assess whether there&amp;rsquo;s a problem with the provided data. Sometimes missing data can imply that you should use the prior value that was set. Sometimes it means that the data isn&amp;rsquo;t available, which can be an issue and may require you to do some form of data imputation down the road.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Data analysis&#xA;    &lt;div id=&#34;data-analysis&#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;#data-analysis&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Common things to look for in time series data are gaps in data (periods where no data has been recorded), the trend/seasonality/residual decomposition per time series, the autocorrelation and partial autocorrelation plots, distribution of values grouped by a certain period (by month, by week, by day, by day of the week, by hour), line/scatter plots of values grouped by the same periods.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Data cleanup&#xA;    &lt;div id=&#34;data-cleanup&#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;#data-cleanup&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Data is rarely clean and ready to be consumed. This means many things: removing invalid values, converting invalid values or values out of range into a valid range, splitting cells that have multiple values in them into separate cells (e.g., &amp;ldquo;10 cm&amp;rdquo; split into &amp;ldquo;10&amp;rdquo; and &amp;ldquo;cm&amp;rdquo;).&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Data transformation&#xA;    &lt;div id=&#34;data-transformation&#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;#data-transformation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A variety of transformations can be applied to the cleaned data, ranging from data imputation (setting values where values are missing using available data), applying a function on the data, such as power, log or square root transform, differencing (computing the difference with the prior value), going from time zoned date time to timestamps, etc.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Feature generation&#xA;    &lt;div id=&#34;feature-generation&#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;#feature-generation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Common feature generation transformations are applied, such as computing lagged values on variables, moving averages/median, exponential moving averages, extracting the latest min/max, counting the number of peaks encountered so far, etc. Feature generation is where you create additional information for your model to consume with the hope that it will provide it some signal it can make use of.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Establish a baseline&#xA;    &lt;div id=&#34;establish-a-baseline&#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;#establish-a-baseline&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before attempting to find a good model for the problem at hand you want to start with simple/naive models. The time series naive model simply predicts the future by using the latest value as its prediction.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Experiment&#xA;    &lt;div id=&#34;experiment&#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;#experiment&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;With a baseline established, you can now run a variety of experiments, which generally means trying different models on the same dataset while evaluating them the same way (same training/validation splits). In time series, we do cross-validation by creating a train/validation split where the validation split (i.e., the samples in the validation set) occurs temporally after the training split. The cross-validation split represents different points in time at which the models are trained and evaluated for their performance.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Performance analysis&#xA;    &lt;div id=&#34;performance-analysis&#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;#performance-analysis&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;After you&amp;rsquo;ve completed a few experiments you&amp;rsquo;ll have a variety of results to analyze. You will want to look at your primary performance metric, which is generally defined as an error metric you are trying to minimize. Examples of error metrics are MAE, MSE, RMSE, MAPE, SMAPE, WAPE, MASE. Performance is evaluated on your validation data (out-of-sample) and lets you have an idea of how the model will perform on data it hasn&amp;rsquo;t seen during training, which closely replicates the situation you will encounter in production.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Model selection&#xA;    &lt;div id=&#34;model-selection&#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;#model-selection&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;With many models and their respective primary metric computed, you can pick the one which has produced the lowest error on many cross-validation train/test splits.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Deployment&#xA;    &lt;div id=&#34;deployment&#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;#deployment&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Once the model has been selected, it is packaged to be deployed. This generally implies something as simple as pickling the model object and loading it in the remote environment so it can be used to do predictions.&lt;/p&gt;&#xA;&lt;p&gt;There are two modes of forecasting:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Offline: Data used for forecasting is collected during a period of time and then a scheduled task uses this newly available data to create new forecasts. This is generally used for systems with large amounts of data where the forecasts are not needed in real-time, such as forecasting tomorrow&amp;rsquo;s stock price, the minimum and maximum temperature, the volume of stocks that will be sold during the week, etc.&lt;/li&gt;&#xA;&lt;li&gt;Online: Data used for forecasting is given to the model and predictions are expected to be returned within a short time frame, on the order of less than a second to a minute.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Raw data is transformed and feature engineered, then given to the model to use to forecast.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing with simple vocabulary</title>
      <link>https://tomrochette.com/questions/2020/03/28/</link>
      <pubDate>Sat, 28 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/28/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why should I write using simple, frequently used words?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Using simple language will allow more people to understand your message.&lt;/p&gt;&#xA;&lt;p&gt;Using simple words to explain ideas that are more involved makes it easier to understand those ideas.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s also easier to identify errors in reasoning when you&amp;rsquo;re expressing yourself with simple language.&lt;/p&gt;&#xA;&lt;p&gt;Using rare words does not mean that you are more intelligent or have smart thoughts. It simply means you&amp;rsquo;re trying to conceal yourself by using words others may not understand.&lt;/p&gt;&#xA;&lt;p&gt;Like writing software, you should aim to keep your writing simple. It makes it easier on the readers that don&amp;rsquo;t have to spend their time to understand what you&amp;rsquo;re trying to say.&lt;/p&gt;&#xA;&lt;p&gt;Writing such articles is very difficult. For example, this article was written using only the 5000 most common words according to &lt;a href=&#34;https://en.wiktionary.org/wiki/Wiktionary:Frequency_lists/PG/2006/04/1-10000&#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=en.wiktionary.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Wiktionary&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>R&amp;D developer</title>
      <link>https://tomrochette.com/questions/2020/03/27/</link>
      <pubDate>Fri, 27 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/27/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How is being a R&amp;amp;D developer different than being a developer?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;R&amp;amp;D developers are not focused on shipping. While most developers will work as hard as possible to ship whatever they are building to their customers so that they can get paid, R&amp;amp;D developers focus on delivering answers to questions asked by their clients. This focus on intangible deliverables will frustrate many developers.&lt;/p&gt;&#xA;&lt;p&gt;Because R&amp;amp;D developers focus on answering questions and not building products, it is very common that code written will not make it in production. If it does, then it will generally be a catastrophe.&lt;/p&gt;&#xA;&lt;p&gt;Code quality and maintenance are not considered a priority because code is expected to be abandoned once the questions have been answered and the solution has been proven useful.&lt;/p&gt;&#xA;&lt;p&gt;R&amp;amp;D as it implies, is about finding solutions quickly to problems (research), building a solution (development) and demonstrating the value of the solution. This process is a lot more iterative than building software with (somewhat) clear requirements from the start. Given the novelty of what gets built, it is critical to get feedback early and to act on this feedback. This means that the development horizon (how far ahead things are planned) is very short. As such, you are unlikely to be able to say on what you will be working next month.&lt;/p&gt;&#xA;&lt;p&gt;Regular development is about applying existing solutions to clients problems. R&amp;amp;D is about finding those solutions and turning them into mainstream solutions.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Adding habits to your life</title>
      <link>https://tomrochette.com/questions/2020/03/26/</link>
      <pubDate>Thu, 26 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/26/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can I effectively and consistently add habits into my life?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use the &lt;a href=&#34;https://play.google.com/store/apps/details?id=org.isoron.uhabits&#34;&gt;Loop Habit Tracker&lt;/a&gt; (an android app) to track any new habit I want to have and keep. Its purpose is two-fold: to remind me through notifications that I need to do something and to observe how consistent I am with the habit.&lt;/p&gt;&#xA;&lt;p&gt;When adding new habits, I&amp;rsquo;ve found I was more successful by creating transition habits, that is, start with something that is easily achievable and is similar to the habit I want to have, then slowly transition the habit to be closer and closer to the habit I want to have. An example of this might be that I want to do 20 minutes of jogging daily, but since I&amp;rsquo;ve never done jogging consistently in the past, I should start with 1 minute instead of 20 and do it consistently. After a week of consistently jogging 1 minute per day, I can increase the habit to be 2 minutes. Each week that goes by the amount of jogging that is done is increasing while the habit is in its formation phase.&lt;/p&gt;&#xA;&lt;p&gt;It may take up to 20 weeks to do 20 minutes consistently every day, which is preferable to me to trying to do 20 minutes of jogging right from the start and giving up after a few times because my body is not accustomed to such effort.&lt;/p&gt;&#xA;&lt;p&gt;This same metaphor can be applied to mental efforts. If you&amp;rsquo;re not used to spending hours of focused effort on a task, trying to do it right away is likely to be very difficult. But if you slowly transition from doing none of it, to doing it a little bit, then more and more, until you reach your target, it will make something that initially appeared impossible manageable.&lt;/p&gt;&#xA;&lt;p&gt;As you add more and more habits into your life, it may become difficult to keep doing all of them regularly without missing them. That is why an application such as &lt;a href=&#34;https://play.google.com/store/apps/details?id=org.isoron.uhabits&#34;&gt;Loop Habit Tracker&lt;/a&gt; will help you remember to do the habits you want to have.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Tech lead</title>
      <link>https://tomrochette.com/questions/2020/03/25/</link>
      <pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/25/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Do you need a tech lead in your team?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start with definitions of the tech lead role.&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;A Tech Lead is a software engineer, responsible for leading a development team, and responsible for the quality of its technical deliverables.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Source: &lt;a href=&#34;https://www.thekua.com/atwork/2014/11/the-definition-of-a-tech-lead/&#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=www.thekua.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.thekua.com/atwork/2014/11/the-definition-of-a-tech-lead/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;ul&gt;&#xA;&lt;li&gt;Guiding the project technical vision;&lt;/li&gt;&#xA;&lt;li&gt;Analyzing risks and cross-functional requirements;&lt;/li&gt;&#xA;&lt;li&gt;Coaching less experienced people;&lt;/li&gt;&#xA;&lt;li&gt;Bridging communication between stakeholders and the team.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Source: &lt;a href=&#34;http://vvgomes.com/we-dont-need-tech-leads/&#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=vvgomes.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://vvgomes.com/we-dont-need-tech-leads/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;ul&gt;&#xA;&lt;li&gt;Lead with company values&lt;/li&gt;&#xA;&lt;li&gt;Deliver value to customers&lt;/li&gt;&#xA;&lt;li&gt;Keep the dream alive&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Source: &lt;a href=&#34;https://hackernoon.com/whats-the-role-of-a-tech-lead-7725b47104b7&#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=hackernoon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://hackernoon.com/whats-the-role-of-a-tech-lead-7725b47104b7&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I am of the opinion that the distribution of responsibility is likely the best way to get resilience in your system. But with it comes the cost of delays before eventual consistency.&lt;/p&gt;&#xA;&lt;p&gt;Thus I am more likely to adopt a position where having or not a tech lead will depend on the situation of your team.&lt;/p&gt;&#xA;&lt;p&gt;Do you need to make quick decisions? Either have a tech lead for that or limit the amount of time allocated for a group of individuals to make decisions.&lt;/p&gt;&#xA;&lt;p&gt;Do you need accountability? Either have a tech lead that is accountable or have important decisions assessed as a group and the results of the decision written with the name of those that participated in that decision.&lt;/p&gt;&#xA;&lt;p&gt;Do you need to have a technical vision? Either have a tech lead responsible for defining that vision with the team or have the team work as a whole to define this vision.&lt;/p&gt;&#xA;&lt;p&gt;Tech leads should have a high-level overview of the pieces that need to be built and an idea of how to get there and when. As individuals, this would require coordinating between individuals with different opinions about those topics.&lt;/p&gt;&#xA;&lt;p&gt;I work in AI, and this problem makes me think of having a single model (tech lead) vs an ensemble model (group of contributors). If your single model generally predicts the same thing your ensemble model would predict, then the single model is more efficient. On the other hand, if there&amp;rsquo;s no single model that can perform as well as the ensemble, then you should go with the ensemble model.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.thekua.com/atwork/2014/11/the-definition-of-a-tech-lead/&#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=www.thekua.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.thekua.com/atwork/2014/11/the-definition-of-a-tech-lead/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.thekua.com/atwork/2015/06/tech-lead-circles-of-responsibility/&#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=www.thekua.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.thekua.com/atwork/2015/06/tech-lead-circles-of-responsibility/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.thekua.com/atwork/2014/10/do-we-need-a-tech-lead/&#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=www.thekua.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.thekua.com/atwork/2014/10/do-we-need-a-tech-lead/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hackernoon.com/whats-the-role-of-a-tech-lead-7725b47104b7&#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=hackernoon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://hackernoon.com/whats-the-role-of-a-tech-lead-7725b47104b7&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://vvgomes.com/we-dont-need-tech-leads/&#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=vvgomes.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://vvgomes.com/we-dont-need-tech-leads/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Documenting a process</title>
      <link>https://tomrochette.com/questions/2020/03/24/</link>
      <pubDate>Tue, 24 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/24/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do you document a process?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;A process is composed of a few things: inputs (dependencies), outputs and the steps to transform inputs into outputs.&lt;/p&gt;&#xA;&lt;p&gt;Generally a new process will be created from a need (an output to be produced). For example, a client will come to you and ask to have software that does Y. Your output in this case as a software company is software that does Y. For the customer, the process they need you to develop is one where X (some unknown set of inputs) will be transformed to produce Y.&lt;/p&gt;&#xA;&lt;p&gt;As a software developer, your task is two-fold.&lt;/p&gt;&#xA;&lt;p&gt;First, you must develop a process for yourself to take client requirements (your input X) and convert them into software (your output Y), which means figuring out what needs to be done to go from X to Y (the transformation steps). Examples of those steps are requirements gathering, specification, design, architecture, implementation, testing, debugging, deployment, maintenance.&lt;/p&gt;&#xA;&lt;p&gt;Second, you must develop a process for your client&amp;rsquo;s requirements, that is, one that converts some input information into their desired ability to produce Y. Examples of steps that would be in this process are uploading document A, B, C, processing the documents to extract specific information, produce report D.&lt;/p&gt;&#xA;&lt;p&gt;When documenting processes, the steps will themselves become processes, that is, they will have a set of inputs and a set of outputs. A process will generally evolve into a complex graph of inputs, processes and outputs.&lt;/p&gt;&#xA;&lt;p&gt;Processes are also generally accomplished by someone or something. In process modeling we refer to those as roles. Examples of roles are user, customer support agent, clerk, engineer, analyst, software system.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a very simple template that you can use to define your processes&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Inputs: What do you need for the process to take place?&lt;/li&gt;&#xA;&lt;li&gt;Processes: What actions are taken on the inputs to transform them into outputs?&lt;/li&gt;&#xA;&lt;li&gt;Outputs: What is produced when the process is completed?&lt;/li&gt;&#xA;&lt;li&gt;Roles: What roles are required to accomplish the actions of the process?&lt;/li&gt;&#xA;&lt;li&gt;Average duration: How long is a process taking to complete in general?&lt;/li&gt;&#xA;&lt;li&gt;Mandatory/Optional: Is this process mandatory or optional in the accomplishment of the higher-level process?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/02/05/&#34; &gt;How do I improve my processes?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Recognizing processes to follow</title>
      <link>https://tomrochette.com/questions/2020/03/23/</link>
      <pubDate>Mon, 23 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/23/</guid>
      <category>questions</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Given a library of processes, how can you determine which process you should be following?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Make a list of all the processes you have. Link to all the procedures to follow in each case. Some processes you will use so frequently that you will learn them.&lt;/p&gt;&#xA;&lt;p&gt;Processes have starting points, that is, a trigger that initiates them. For example, if you have a process for code reviews, the starting point is the creation of a pull request by someone else. Another trigger might be the beginning of a new project. You should look for and recognize those triggers. If possible, when you document your processes, indicate what will trigger the instantiation of one of these projects.&lt;/p&gt;&#xA;&lt;p&gt;Try to frequently look at the list of triggers and think about what you are working on or will be working on. This will allow you to catch processes that should have been started and followed, as well as let you prepare for processes that are about to start.&lt;/p&gt;&#xA;&lt;p&gt;As you accumulate more and more processes, you will observe that there is a hierarchical organization to them. As one process starts, you can already prepare a list of processes you may have to follow soon.&lt;/p&gt;&#xA;&lt;p&gt;You will also observe that the completion of a process often will lead to the start of another one. Once you&amp;rsquo;ve established enough chains (sequences of processes), it will be easier to identify and do the processes.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/03/12/&#34; &gt;How can I be systematic in applying processes?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Superficial loss rule</title>
      <link>https://tomrochette.com/questions/2020/03/22/</link>
      <pubDate>Sun, 22 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/22/</guid>
      <category>questions</category><category>finances</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is the superficial loss rule applied to stocks and how does it impact me?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The superficial loss rule states:&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;A superficial loss can occur when you dispose of capital property for a loss and both of the following conditions are met:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You, or a person affiliated with you, buys, or has a right to buy, the same or identical property (called &amp;ldquo;substituted property&amp;rdquo;) during the period starting 30 calendar days before the sale and ending 30 calendar days after the sale.&lt;/li&gt;&#xA;&lt;li&gt;You, or a person affiliated with you, still owns, or has a right to buy, the substituted property 30 calendar days after the sale.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;What this effectively does is that it prevents you from selling at a loss and rebuying the same stock within a 30 days period (before or after the transaction) for the purpose of tax harvesting during that year. This however does not prevent you from claiming the loss when you finally sell the stock.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s important to note that there is interactions between non-registered and registered accounts. Buying the stocks in one account and selling in another account will still be considered as if they were under the same account. The most important thing to understand is that if you have stocks in your registered accounts (TFSA/RRSP), that you buy/sell in these accounts within the 30 days window in a non-registered account, you will not be able to claim your adjusted cost base. This will result in a permanent loss of this taxable loss. As a simple advice, in other words, do not trade the stocks you have in your TFSA/RRSP in your non-registered accounts. It will simplify your life.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.adjustedcostbase.ca/blog/what-is-the-superficial-loss-rule/&#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=www.adjustedcostbase.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.adjustedcostbase.ca/blog/what-is-the-superficial-loss-rule/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.canada.ca/en/revenue-agency/services/tax/individuals/topics/about-your-tax-return/tax-return/completing-a-tax-return/personal-income/line-127-capital-gains/capital-losses-deductions/what-a-superficial-loss.html&#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=www.canada.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.canada.ca/en/revenue-agency/services/tax/individuals/topics/about-your-tax-return/tax-return/completing-a-tax-return/personal-income/line-127-capital-gains/capital-losses-deductions/what-a-superficial-loss.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://canadiancouchpotato.com/2020/10/22/how-to-avoid-superficial-losses/&#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=canadiancouchpotato.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://canadiancouchpotato.com/2020/10/22/how-to-avoid-superficial-losses/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Why I avoid reading books</title>
      <link>https://tomrochette.com/questions/2020/03/21/</link>
      <pubDate>Sat, 21 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/21/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why do I avoid reading books sometimes?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The most common reason for me to avoid reading a book is that I see reading as an investment. I can&amp;rsquo;t spend only 5 minutes reading a book there and there. I need to focus on reading for at least 15 minutes, otherwise I cannot enjoy the story or understand the technical book I&amp;rsquo;m reading.&lt;/p&gt;&#xA;&lt;p&gt;This creates a problem. For me to read, I need to have enough time to read for at least 15 minutes. 15 minutes is a considerable amount of time to allocate vs no time allocation to simply browse content online. Thus a barrier is created, making it harder to read books.&lt;/p&gt;&#xA;&lt;p&gt;Similarly, there are times where I don&amp;rsquo;t want to read a book because I want to process a unit of the story or a chapter of the book in one reading. It is similar to not wanting to start a tv show episode knowing that you might stop watching it in the middle. I don&amp;rsquo;t like that.&lt;/p&gt;&#xA;&lt;p&gt;Reading technical books is mentally draining. Sometimes I&amp;rsquo;m simply brain dead and reading books is simply not possible.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Dealing with negatives thoughts</title>
      <link>https://tomrochette.com/questions/2020/03/20/</link>
      <pubDate>Fri, 20 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/20/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do you deal with negative thoughts?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My approach to dealing with negative thoughts used to be to let my brain think about it for as long as it needed until it was satisfied with some sort of solution or it had moved on due to more urgent matters (or because I fell asleep).&lt;/p&gt;&#xA;&lt;p&gt;More recently my approach has evolved. Having spent a large portion of the last few years thinking about artificial general intelligence, I&amp;rsquo;ve come to see myself as a machine, similar to a computer. I enjoy taking computer science theory and applying it as a way of life.&lt;/p&gt;&#xA;&lt;p&gt;For instance, in the case of negative thoughts, I see them as being a process that is running in my brain and is using computing resources. Like any process, the operating system allocates it an amount of &lt;a href=&#34;https://en.wikipedia.org/wiki/Preemption_%28computing%29#Time_slice&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;quantum&lt;/a&gt; (a period of time) before it is preempted and replaced by another process. As such, I now timebox the amount of time I allocate to a negative thought before I actively repress thinking about it.&lt;/p&gt;&#xA;&lt;p&gt;This might mean to consciously say to myself &amp;ldquo;I am not thinking about problem X anymore, time is up&amp;rdquo; or &amp;ldquo;Your time allocation for thinking about Y is now completed, please move on&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Such active and conscious effort to stop thinking about those negative thoughts has paid quite a lot. I spend a lot less time reflecting on those thoughts and find it easier to move on.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Data used to do time series forecasting</title>
      <link>https://tomrochette.com/questions/2020/03/19/</link>
      <pubDate>Thu, 19 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/19/</guid>
      <category>questions</category><category>time-series</category><category>machine-learning</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What data do I need to do time series forecasting?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;There are three values that you must know for each data point of your time series:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;its entity, which represents a unique value identifying the time series (e.g., a product SKU). Without this information, it is not possible to construct a sequence of points since there&amp;rsquo;s no logical grouping between the points.&lt;/li&gt;&#xA;&lt;li&gt;its timestamp, which represents the moment in time the data point was recorded. Without this information, it is not possible to construct a sequence of points since there&amp;rsquo;s no sequential ordering between the points.&lt;/li&gt;&#xA;&lt;li&gt;its target, which represents the measurement of the data point itself that we want to predict. Without this information, we have effectively nothing to base ourselves on.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Such information would look as follow when organized in a table:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Entity&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Timestamp&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Target&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;13&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;27&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;55&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Additionally, you may also have recorded additional values at the same time, which can be a useful source of information when trying to predict a time series.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Entity&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Timestamp&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Target&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Value 1&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;13&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;47&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;27&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;33&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;55&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Let see what happened if we removed each of these columns to illustrate their necessity.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Removing the entity column&#xA;    &lt;div id=&#34;removing-the-entity-column&#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;#removing-the-entity-column&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Timestamp&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Target&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;13&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;27&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;55&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Removing the entity effectively leaves us with two values for the same timestamp. If the data was in this format and we were told that each time the timestamp goes below its previous value a new entity was defined, we would be able to reconstruct the initial table with its entity column.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Removing the timestamp column&#xA;    &lt;div id=&#34;removing-the-timestamp-column&#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;#removing-the-timestamp-column&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Entity&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Target&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;13&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;27&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;55&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Removing the timestamp gives us the values the entity may take, but we don&amp;rsquo;t know when. Again, if we&amp;rsquo;re told that the rows have been kept in some order, we could reconstruct the timestamp column.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Removing the target column&#xA;    &lt;div id=&#34;removing-the-target-column&#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;#removing-the-target-column&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Entity&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Timestamp&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;B&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Removing the target column makes this problem impossible to solve. We&amp;rsquo;re left with only the entities that were measured and the time of measurement, but no measurement, which makes the two other values useless.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reading technical books</title>
      <link>https://tomrochette.com/questions/2020/03/18/</link>
      <pubDate>Wed, 18 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/18/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why should you read technical books?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Because they can teach you. Good technical books will expand your understanding of the topic covered in the book. It will clarify concepts you had trouble grasping before, allowing you to make good use of this newly acquired knowledge.&lt;/p&gt;&#xA;&lt;p&gt;Because they give you more abilities. As you acquire new knowledge, you can make use of it. This lets you do things you could not do before because of this lack of knowledge.&lt;/p&gt;&#xA;&lt;p&gt;Because they can change you. If you read about someone else&amp;rsquo;s approach to problem solving, you may come to prefer their way of solving problems. By being convinced by the author, you may be led to change how you write code, what you think is important about building software, how you prioritize your work, etc.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reading fiction books</title>
      <link>https://tomrochette.com/questions/2020/03/17/</link>
      <pubDate>Tue, 17 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/17/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why should you read fiction books?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Because they can motivate you. An exciting story to which you can relate may motivate you to try and emulate it.&lt;/p&gt;&#xA;&lt;p&gt;Because they can make you think. Some authors have been alive for a lot longer than you have and they&amp;rsquo;ve had longer to think about certain topics to which you never really dedicated any time. Some may have acquired a deeper and broader understanding of a certain domain they can then use to turn fiction into an epic story.&lt;/p&gt;&#xA;&lt;p&gt;Because they can help you be more creative. Creativity is in my opinion simply the ability to take what one already knows and arrange it in a way that is novel. Seeing how others arrange things they know in a new and interesting way can help you recognize where you may be too rigid and help you relax when being creative.&lt;/p&gt;&#xA;&lt;p&gt;Because they can help you disconnect. Reading about someone else&amp;rsquo;s story is a great way to disconnect from our day to day life. If you take the bus, the subway or the train to go to work and back home, it is a great opportunity to spend some time disconnecting. The creation of a buffer where you are immersed in a different realm has had very calming properties on me.&lt;/p&gt;&#xA;&lt;p&gt;Suggested series: All of the Warcraft/World of Warcraft books, The Three-Body Problem trilogy&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Timestamping all the things</title>
      <link>https://tomrochette.com/questions/2020/03/16/</link>
      <pubDate>Mon, 16 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/16/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is the value of timestamping all the things?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Adding a temporal reference to everything allows us to contextualize this information. It allows us to better remember the exact moment we took a note, which may in turn help us remember why we took that note.&lt;/p&gt;&#xA;&lt;p&gt;Timestamping also allows us to have a better idea of how things have come into being sequentially. If you have notes you wrote in different locations and they all have their timestamp, you can gather them and organize them by their timestamp.&lt;/p&gt;&#xA;&lt;p&gt;Having a creation timestamp on tasks is useful to track how long a task has been opened. It&amp;rsquo;s also useful to determine the recency of a task, as recent tasks generally have more urgency than older tasks, as proven by the fact that the task has aged and is not completed. Having a timestamp on the last modification date allows us to know when it was last updated, giving us a sign this task has been seen and hasn&amp;rsquo;t been discarded yet. Having a completion timestamp allows us to measure how long it takes for tasks to go from creation to completion. Having timestamps on all the events related to the task allows us to know how many task management tasks are necessary for a task to be completed.&lt;/p&gt;&#xA;&lt;p&gt;Timestamping is useful to predict events. If you have a system (e.g., a store, a computer, a company) and you do a lot of different actions, being able to forecast when is the next time a specific event will occur is useful. It also allows you to forecast events volume (e.g., number of sales, number of actions per employee)&lt;/p&gt;&#xA;&lt;p&gt;Note: This question was timestamped 2018-04-21 22:14:52.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Selling stocks during a crisis</title>
      <link>https://tomrochette.com/questions/2020/03/15/</link>
      <pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/15/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Should I sell my stocks during the coronavirus crisis?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Most advise that one should invest for the long term and that they should have a diversified portfolio. They mention that many studies demonstrate that it&amp;rsquo;s not possible to time the market.&lt;/p&gt;&#xA;&lt;p&gt;However, when a crisis as big as the coronavirus hits, it&amp;rsquo;s important to assess its impact on your portfolio as a whole. What kind of assets are you holding? In what industries? What are the impacts the coronavirus might have on that business? How long have these businesses taken to recover from prior crashes (given more weight to the recent ones)? How likely am I wrong in my assessments of the situation?&lt;/p&gt;&#xA;&lt;p&gt;I currently hold stocks in airline companies. I would assess that air traveling is likely going to take a large hit for most of March and April. Except if the governments were to step in to reduce the bleeding of those companies, I would press the eject button and save whatever money I have left in those stocks. It took about 5 years for airline companies to recover from the 2007-2009 crash. Some companies almost went bankrupt. They definitely recovered and some went to make 4000% from their lowest value.&lt;/p&gt;&#xA;&lt;p&gt;If you kept your money in those stocks, you would have spent about 7 years of time returning you nothing (ignoring dividends here). Instead, if you sold at any point during the downward movement and bought the stocks at the same price you sold them when they went back, you would have avoided going further down. Furthermore, if you had decided to purchase those stocks at a lower point, it would have taken you less time to make your money back.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s an example:&lt;/p&gt;&#xA;&lt;p&gt;In January 2007 you buy 10 stocks for 60 CAD each, totaling 600 CAD. One year later the stock is worth only 20 CAD. You sell them all. You now have suffered a loss of (60 - 20) x 10 = 400 CAD and have 200 CAD left. Half a year later the stock is now worth 2 CAD. If you had instead decided to sell then, you would have 2 x 10 = 20 CAD, suffering a loss of 580 CAD.&lt;/p&gt;&#xA;&lt;p&gt;Now, let&amp;rsquo;s see what happens when the stock starts to go up again. Five years later, the stock went from 2 CAD to 20 CAD. Had you sold the stock at 20 CAD, there would be no difference for you. Had you sold the stock at 2 CAD you would have &amp;ldquo;suffered&amp;rdquo; the opportunity cost of (20 - 2) x 10 = 180 CAD. If at any point (having sold the stock at 20 CAD) you had decided to buy back the stock, you would be making money, or should I say, recovering from your loss. As an example, if you had bought 20 shares at 10 CAD (for a total of 200 CAD), you would now have 400 CAD. You would still be 200 CAD down the drain from your initial investment, but you would be on your way to recovery.&lt;/p&gt;&#xA;&lt;p&gt;Three years later the stock price has recovered back to 60 CAD. If you had never sold, investing in this stock would have been a cost of opportunity in investing in other stocks. If you had sold at 20 CAD and started investing when it reached 20 CAD again, you would have made 10 x (60 - 20) = 400 CAD. You would be back to square 1, without any gain or loss. The benefit you would have had during the period you had sold your stock is that you wouldn&amp;rsquo;t have to check if the stock was going lower. Had you however invested your 200 CAD to buy 20 stocks at 10 CAD, you would now have 20 x 60 = 1200 CAD. You would have doubled your money!&lt;/p&gt;&#xA;&lt;p&gt;In summary, staying in the market during the crash means that you will not make any money while the market recovers, which can take months if not years. If you instead get out at a loss and wait for it to go down, then buy in (let&amp;rsquo;s say after a 10% drop in the price you sold)&lt;/p&gt;&#xA;&lt;p&gt;This is obviously the optimistic scenario. In the pessimistic case, as you sold your stocks, the stocks would go on to recover immediately and make enormous gains.&lt;/p&gt;&#xA;&lt;p&gt;My assessment of the options I have and their associated risks:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Staying in the market and having to wait for months or years for the stocks I own to return to their original value, which implies years of wasted potential for profits on this original investment while at best receiving dividends from companies that have them.&lt;/li&gt;&#xA;&lt;li&gt;Leaving the market, at the cost of a loss (which half of it can be used toward your taxes if you live in Canada), at the risk of the market going up again and potentially reducing my loss, or in the worst case, going above my prior profits.&lt;/li&gt;&#xA;&lt;li&gt;Reducing my position in stocks that are highly likely to be very impacted by the coronavirus, being a half-half position, where stocks that are expected to still perform during the downward period are kept and those that are too volatile and negative trending are sold as soon as possible.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This is not actual advice. This is only me trying to reason about the situation.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Apparition of language</title>
      <link>https://tomrochette.com/questions/2020/03/14/</link>
      <pubDate>Sat, 14 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/14/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When did language appear?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;According to articles cited on Wikipedia, language would have first evolved around 50,000 to 150,000 years ago.&lt;/p&gt;&#xA;&lt;p&gt;Given how we&amp;rsquo;ve evolved from single cells into multicellular organisms, there is likely a point we reached where communication between cells had to occur in order to get things done (e.g., survive).&lt;/p&gt;&#xA;&lt;p&gt;As we got more and more complex, some specialized communication developed itself (e.g., nerves) so that some cells were responsible for decision and communication while others were responsible for doing.&lt;/p&gt;&#xA;&lt;p&gt;With the apparition of the brain, decision making centralized in a single location away from the parts it controls.&lt;/p&gt;&#xA;&lt;p&gt;For a while those systems might have been reactive, animating us but not giving us any control over those actions.&lt;/p&gt;&#xA;&lt;p&gt;We reached a stage where large multi-cellular organisms were living together and still had to communicate with one another. Using chemical/electrical signaling was not an option anymore, so we made use of gestures and sound.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Origin_of_language&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Origin_of_language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Internal voice</title>
      <link>https://tomrochette.com/questions/2020/03/13/</link>
      <pubDate>Fri, 13 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/13/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why do we have an internal voice?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;A study found that this internal voice is reported most frequently for self-regulation (e.g., planning and problem solving), self-reflection (e.g., emotions, self-motivation, appearance, behavior/performance, and autobiography), and critical thinking (e.g., evaluating, judging, and criticizing).&lt;/p&gt;&#xA;&lt;p&gt;This inner dialogue is a form of internal collaboration with oneself.&lt;/p&gt;&#xA;&lt;p&gt;Neural imaging seems to support Vygotsky&amp;rsquo;s theory that when individuals are talking to themselves, they are having an actual conversation.&lt;/p&gt;&#xA;&lt;p&gt;I would be tempted to say that we have an internal voice because language is our way to survive. It allows us to process information coming from the world and turning it into actions. Although our ancestors most likely did not have advanced language as we do today, they had some form of language they could use to communicate. Much like cells in the body communicate with each other through chemical/electrical signaling, this internal voice is our way to communicate with ourself.&lt;/p&gt;&#xA;&lt;p&gt;Note: Not everyone has an internal monologue.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Internal_monologue&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Internal_monologue&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doi.org/10.1002%2Facp.3404&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Self‐reported inner speech use in university students&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://news.ycombinator.com/item?id=22193451&#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=news.ycombinator.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://news.ycombinator.com/item?id=22193451&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Systematically apply processes</title>
      <link>https://tomrochette.com/questions/2020/03/12/</link>
      <pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/12/</guid>
      <category>questions</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can I be systematic in applying processes?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The first step is to always make your processes explicit. Write the various steps you go through while doing something. First, simply write down those steps as you do them. Then indicate the dependencies between the steps. You may notice that some steps can be done earlier in the process if all their dependencies are already completed.&lt;/p&gt;&#xA;&lt;p&gt;As you write down more and more of your processes, make sure that you can easily refer to them. If possible, keep them in a centralized location where it is easy for you to edit them. In my case, I write &lt;a href=&#34;https://tomrochette.com/processes/&#34; &gt;my processes&lt;/a&gt; in this blog.&lt;/p&gt;&#xA;&lt;p&gt;When you begin doing something which you&amp;rsquo;ve never done before, create yourself a document and write down the steps you are doing as you do them. Once you are done with the task, save your document.&lt;/p&gt;&#xA;&lt;p&gt;When you begin doing something for which you already have a process in place, open up your process document and quickly glance at it. Start going through the process without using the document and jot down what you do. After you are done, look at what you did and compare it against the existing process. Is it the same or has something changed? Did you forget to do something? Did you do something new? Did you change the order of some of the steps? Apply the changes you think are useful to your process and repeat this discovery phase a few times.&lt;/p&gt;&#xA;&lt;p&gt;After you&amp;rsquo;ve established a process, you can simply open the process document and follow it. If you notice that some steps are still missing, do add them to the document. If you version control your processes, you will be able to observe how it evolves over time.&lt;/p&gt;&#xA;&lt;p&gt;One benefit of making your processes explicit is that it allows you to stop doing them for an extended period of time. When you need to do them again, you can simply look at them again and know what you need to do. It is also beneficial if you work in a team where you could delegate some of those processes to other people.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/03/08/&#34; &gt;Reducing your error rate&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Tools I use at work</title>
      <link>https://tomrochette.com/questions/2020/03/11/</link>
      <pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/11/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What tools do I use daily at work?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://notion.so/&#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=notion.so&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Notion.so&lt;/a&gt; I use Notion.so to track my day to day tasks and their progress. I also use it to write down any idea I have during the day that I would like to explore at some point in the future. I&amp;rsquo;ve described &lt;a href=&#34;https://tomrochette.com/processes/task-management/&#34; &gt;my task management system in more details&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.atlassian.com/software/jira&#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=www.atlassian.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;JIRA&lt;/a&gt; I work in a corporate environment, which means that we need to track tasks and assignments through a shared system. That system is JIRA. I don&amp;rsquo;t particularly like JIRA after having used &lt;a href=&#34;https://redmine.org/&#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=redmine.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;redmine&lt;/a&gt; for 5+ years and liking it. JIRA is slow, complex and cumbersome, which makes me avoid it at all costs. It&amp;rsquo;s a shame, given that task management is one of the most important things in a software development business.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Visual Studio Code&lt;/a&gt; I use &lt;a href=&#34;https://tomrochette.com/problems/2020/03/02/&#34; &gt;VS Code to take notes&lt;/a&gt; throughout the day as well as to edit files from time to time.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.jetbrains.com/pycharm/&#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=www.jetbrains.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PyCharm&lt;/a&gt; My current job is mostly about writing python code, and PyCharm is the best IDE to do that. I use it to implement new functionality, write tests and debug issues. It is highly customizable which makes using it a joy. I also make use of the run/debug configurations regularly to test a variety of cases over the lifetime of the projects I work on. Finally, because I&amp;rsquo;ve used PHPStorm in the past, transitioning from PHPStorm to PyCharm was easy and painless.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.iterm2.com/&#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=www.iterm2.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;iTerm2&lt;/a&gt; I spend a good part of my day interacting with various CLIs. I use a Mac and the terminal simply doesn&amp;rsquo;t cut it for me and I prefer interacting with GUI tabs over having a tmux.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.google.com/chrome/&#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=www.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Chrome&lt;/a&gt; Anyone doing software development spends a large portion of their time online looking for solutions to their problems/questions. I use Chrome mostly to use the Google suite, to use Jira/Confluence or to look at reports generated by the tool I work on.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gsuite.google.com/&#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=gsuite.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google suite (Gmail, Docs, Sheets, Slides)&lt;/a&gt; I work in a collaborative environment which means writing and reading documents to share ideas, data, requirements and notes with others.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.com/&#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=slack.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Slack&lt;/a&gt; Working with others means communicating with others. While it&amp;rsquo;s possible to talk directly to my teammates, sometimes it is more respectful to simply send them an instant message asking them to come to see you when they are available. Slack also allows communication with people in other teams, as well as people that are in separate offices.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;GitHub&lt;/a&gt; We use git exclusively at work as a way to do version control. We use GitHub as our central location to share our repository, as well as to do code reviews.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/drone/drone&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Drone&lt;/a&gt; Whenever I push code to GitHub, Drone makes sure that a variety of tasks are executed to ensure code quality: linting, code formatting, type checking, unit/function/integration tests and documentation building. Having a build system reduces the time between faulty code is pushed to GitHub and the code being fixed.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/task-management/&#34; &gt;Task management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/problems/2020/03/02/&#34; &gt;Quickly recording notes using VS Code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/30/&#34; &gt;Tools I use daily and can contribute to&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing articles</title>
      <link>https://tomrochette.com/processes/writing-articles/</link>
      <pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/writing-articles/</guid>
      <category>processes</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Define what is it you want to communicate&lt;/li&gt;&#xA;&lt;li&gt;Define why it is you want to communicate what you want to communicate&lt;/li&gt;&#xA;&lt;li&gt;Define who you are communicating to&lt;/li&gt;&#xA;&lt;li&gt;Write down all the topics you want to cover&lt;/li&gt;&#xA;&lt;li&gt;Organize the topics in a structured manner (i.e., an outline)&lt;/li&gt;&#xA;&lt;li&gt;Write a draft&lt;/li&gt;&#xA;&lt;li&gt;Expand the points of the draft&lt;/li&gt;&#xA;&lt;li&gt;Review the grammar with LLMs&lt;/li&gt;&#xA;&lt;li&gt;Use keywords services to find topics that may be related and interesting to cover&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Wearing a face mask against COVID-19</title>
      <link>https://tomrochette.com/questions/2020/03/10/</link>
      <pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/10/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Should I wear a face mask against COVID-19 if I&amp;rsquo;m not sick?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Protecting yourself vs protecting others&#34;&#xA;    width=&#34;1400&#34;&#xA;    height=&#34;645&#34;&#xA;    src=&#34;https://tomrochette.com/questions/2020/03/10/images/mask_hu_48ceb51edf8159ed.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/questions/2020/03/10/images/mask_hu_48ceb51edf8159ed.png 800w, https://tomrochette.com/questions/2020/03/10/images/mask_hu_9fbb24a4b3e1a9ae.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/questions/2020/03/10/images/mask.png&#34;&gt;&lt;/figure&gt;&#xA;&#xA;Source: &lt;a href=&#34;https://medium.com/@Cancerwarrior/covid-19-why-we-should-all-wear-masks-there-is-new-scientific-rationale-280e08ceee71&#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=medium.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://medium.com/@Cancerwarrior/covid-19-why-we-should-all-wear-masks-there-is-new-scientific-rationale-280e08ceee71&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you have masks already, wear one. It will protect you from others and others from you.&lt;/p&gt;&#xA;&lt;p&gt;The official answer from the &lt;a href=&#34;https://www.canada.ca/en/public-health/services/diseases/2019-novel-coronavirus-infection/prevention-risks.html#wm&#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=www.canada.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Government of Canada&lt;/a&gt; and the &lt;a href=&#34;https://www.cdc.gov/coronavirus/2019-ncov/about/prevention.html&#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=www.cdc.gov&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;CDC&lt;/a&gt; is that wearing a face mask is not an effective solution to protect yourself against the virus.&lt;/p&gt;&#xA;&lt;p&gt;If you are sick and you need to go out in public, wearing a face mask will help reduce the chances of spreading the virus to others.&lt;/p&gt;&#xA;&lt;p&gt;If you want to avoid being ill due to the virus, the best way to do so is to avoid being exposed to the virus. This means staying at home in isolation.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.canada.ca/en/public-health/services/diseases/2019-novel-coronavirus-infection/prevention-risks.html#wm&#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=www.canada.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.canada.ca/en/public-health/services/diseases/2019-novel-coronavirus-infection/prevention-risks.html#wm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.theguardian.com/world/2020/mar/15/can-a-face-mask-stop-coronavirus-covid-19-facts-checked&#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=www.theguardian.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.theguardian.com/world/2020/mar/15/can-a-face-mask-stop-coronavirus-covid-19-facts-checked&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.livescience.com/face-mask-new-coronavirus.html&#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=www.livescience.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.livescience.com/face-mask-new-coronavirus.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://time.com/5794729/coronavirus-face-masks/&#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=time.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://time.com/5794729/coronavirus-face-masks/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.businessinsider.com/wuhan-coronavirus-face-masks-not-entirely-effective-2020-1&#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=www.businessinsider.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.businessinsider.com/wuhan-coronavirus-face-masks-not-entirely-effective-2020-1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cdc.gov/coronavirus/2019-ncov/about/prevention.html&#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=www.cdc.gov&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.cdc.gov/coronavirus/2019-ncov/about/prevention.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Criteria for using a library in a project</title>
      <link>https://tomrochette.com/questions/2020/03/09/</link>
      <pubDate>Mon, 09 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/09/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What do I look for in a library before using it in a project?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;It has to be maintained so that I know that issues are addressed.&lt;/p&gt;&#xA;&lt;p&gt;It has to be supported so that I know I&amp;rsquo;ll get help if needed.&lt;/p&gt;&#xA;&lt;p&gt;It has to be highly used compared to other solutions to ensure it&amp;rsquo;s more feature complete and of good quality compare to other libraries.&lt;/p&gt;&#xA;&lt;p&gt;It has documentation so that I don&amp;rsquo;t have to read the documentation to know how to use the library for common cases.&lt;/p&gt;&#xA;&lt;p&gt;It has to have a simple API that does what I need so that I don&amp;rsquo;t have to deal with weird/incomplete API that do half of what I need.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reducing your error rate</title>
      <link>https://tomrochette.com/questions/2020/03/08/</link>
      <pubDate>Sun, 08 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/08/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can I reduce my error rate when using my skills?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When using skills in which you can make mistakes, it is important to monitor what you do and where you make your mistakes. Like any performance optimization problem, you want to figure out where you make the most mistakes and where you&amp;rsquo;ll benefit the most from fixing those mistakes. If you make the same mistakes 100 times at the cost of a minute each time, that may be preferable to making 1 mistake that cost 100 minutes to fix, given that once the mistake happens, the cost stays the same.&lt;/p&gt;&#xA;&lt;p&gt;Document your skills. Write down what you do, when you do it (triggers) and what kind errors you make during those steps. Evaluate how many times you make that mistake and how long it costs to fix. Then when you use your skills, track when you make mistakes and how long it takes you to fix the mistake.&lt;/p&gt;&#xA;&lt;p&gt;As an example, think of a software engineer doing &lt;a href=&#34;https://tomrochette.com/processes/reviewing-code/&#34; &gt;code reviews&lt;/a&gt;. Reviewing code requires going through a variety of checks: is the build passing? is the functionality properly implemented? are there tests? are the new files in the proper location? Without a list, the engineer is left looking at the code without any clear checklist. If he is methodical he will have a list he goes through in his head. If not, then he will most likely only look at the code and give it a summary opinion, that is, whether he likes what he sees, or not.&lt;/p&gt;&#xA;&lt;p&gt;Given a non-explicit methodology it is hard to assess where the mistakes are made and which mistakes cost the most to fix. If you don&amp;rsquo;t check that tests were written for the new functionality or changes, what impact will it have in the future? Depending on how likely the code is to change, the likelihood that something gets broken may be significant. While adding a test may require a few minutes, one has to judge how much time would be wasted if a bug were introduced in the piece of code. As code complexity increases, so does the cost of fixing issues in that code.&lt;/p&gt;&#xA;&lt;p&gt;With an explicit checklist you will be able to track the things that you want to verify before code is merged. As your checklist covers more and more cases, this list will reduce the likelihood that the person who wrote code made a mistake that gets to production. By the same token it will increase your effectiveness as a software engineer to produce quality code.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Extracting someone&#39;s beliefs from their writings</title>
      <link>https://tomrochette.com/questions/2020/03/07/</link>
      <pubDate>Sat, 07 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/07/</guid>
      <category>questions</category><category>machine-learning</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Is it possible to extract someone&amp;rsquo;s beliefs by reading their writings?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Yes.&lt;/p&gt;&#xA;&lt;p&gt;If someone has written a blog for example, it is possible to figure out a variety of information about them simply based on what is written in those articles.&lt;/p&gt;&#xA;&lt;p&gt;If someone writes about a specific software, we may not be able to infer right away what they think about said software, but we know that they&amp;rsquo;ve spent enough time to learn a bit about this specific software. If we know all the other alternatives in this category of software, we could infer that the user believes that this software is possibly better than the alternatives, otherwise why would they have picked it?&lt;/p&gt;&#xA;&lt;p&gt;If the writer writes a lot on a topic, that is also a clue about their beliefs. They probably think that this topic is important, hence why they write about it. Maybe they write about this topic because it is lucrative to them.&lt;/p&gt;&#xA;&lt;p&gt;What the writer doesn&amp;rsquo;t write about is also informative. If they write mostly about technology, maybe they don&amp;rsquo;t care about politics or sports?&lt;/p&gt;&#xA;&lt;p&gt;It is possible to extract if-then rules from their writings, which generally expresses some form of believe that &lt;strong&gt;if&lt;/strong&gt; something &lt;strong&gt;then&lt;/strong&gt; something else. There are other variants where only &lt;strong&gt;if&lt;/strong&gt; is provided (&lt;strong&gt;if&lt;/strong&gt; something, something else, or something else, &lt;strong&gt;if&lt;/strong&gt; something).&lt;/p&gt;&#xA;&lt;p&gt;A writer may use certain adjectives to describe things as &amp;ldquo;easy&amp;rdquo;, &amp;ldquo;simple&amp;rdquo;, &amp;ldquo;straightforward&amp;rdquo;, &amp;ldquo;difficult&amp;rdquo;, &amp;ldquo;impossible&amp;rdquo;, &amp;ldquo;hard&amp;rdquo;, etc. Those are also useful of indicators of the writer&amp;rsquo;s beliefs.&lt;/p&gt;&#xA;&lt;p&gt;Nowadays with LLMs it&amp;rsquo;s easy to provide a prompt such as &amp;ldquo;What beliefs are expressed in the following text&amp;rdquo; or &amp;ldquo;Extract the beliefs in the following text&amp;rdquo;. With a bit of scripting we can extract everything available on the blog and feed it to a LLM to let it extract the beliefs for us.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Assessing a dataset quality</title>
      <link>https://tomrochette.com/problems/2020/03/06/</link>
      <pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/06/</guid>
      <category>problems</category><category>machine-learning</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been given a dataset and I need to assess its quality.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Use &lt;a href=&#34;https://github.com/pandas-profiling/pandas-profiling&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Pandas Profiling&lt;/a&gt; to quickly generate a document that will provide you with a first overview of the data.&lt;/p&gt;&#xA;&lt;p&gt;Your first step should be to look for warnings and messages at the top of the document. Look for entries about missing values, those will point you to variables that may need attention during the data cleaning and data imputation phases of your machine learning problem. As you are doing an assessment, simply indicate that data is missing in these variables and then see if you can determine why by looking at a few examples by loading the data in a pandas dataframe.&lt;/p&gt;&#xA;&lt;p&gt;Are there a lot of duplicated rows? Depending on the data you&amp;rsquo;ve been provided, this may help you identify whether or not something is wrong with the data you were provided. If all entries are supposed to be unique because they represent a single (entity, timestamp, target) tuple, then you should ask yourself why it isn&amp;rsquo;t the case. Is it possible that the dataset was created by appending a collection of other documents, leading to duplicate lines? If so, you may have to do some dataset preprocessing in order to get rid of duplicate rows.&lt;/p&gt;&#xA;&lt;p&gt;Look for variables that are indicated as highly correlated with other variables. High correlation means that it may be possible that one variable has exactly (or almost) the same values as the other variable, which would provide little information to a machine learning model. It would also mean that picking one variable out of two correlated variables would avoid the cost of storing both.&lt;/p&gt;&#xA;&lt;p&gt;Look at each variable in turn and view its details.&lt;/p&gt;&#xA;&lt;p&gt;Look at the distribution of values. Are they uniformly distributed, normally distributed, binomially distributed, etc.?&lt;/p&gt;&#xA;&lt;p&gt;If there are only two possible values for a variable, are those values approximately the same or one value is dominant compared to the other? Were you to try and predict this variable, you would have to deal with class imbalance.&lt;/p&gt;&#xA;&lt;p&gt;Are the values of the variables sensible to you? Are variables composed of multiple information, such as the value and the unit used for the measurement? You would generally prefer composite values to be separated into different variables as it will be easier to process using machine learning models.&lt;/p&gt;&#xA;&lt;p&gt;When looking at numbers distribution, are there outliers (values that are either a lot smaller or larger than the rest)? It is sometimes important to ask those who provided you with the data if they can explain those outliers. In general you will want to ignore outliers during training as they may skew your model toward them, resulting in less than ideal results for all the other data points.&lt;/p&gt;&#xA;&lt;p&gt;The quality of a dataset is inversely proportional to the number of operations you need to apply to it to make it a clean dataset. That is to say that if you don&amp;rsquo;t need to do anything on the data provided to you, then it is a good dataset.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Skills most used at work</title>
      <link>https://tomrochette.com/questions/2020/03/06/</link>
      <pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/06/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;As an AI developer, what skills do I use the most at work?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The following list is ordered according to the importance I give to those skills in my success at work.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Analysis/understanding the problems:&lt;/strong&gt; There&amp;rsquo;s no point in doing work if you don&amp;rsquo;t know why you&amp;rsquo;re doing it. Understanding why you are solving a specific problem will give you insights on the best way to solve the problem itself using the right approach.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Programming:&lt;/strong&gt; I&amp;rsquo;m a software developer, so I spend most of my time (or hope I am) on writing code. That also includes reading code written by others.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Prioritization:&lt;/strong&gt; I need to decide what tasks are more important than other tasks and organize the list of tasks from most to least important. At my current job, it&amp;rsquo;s everyone&amp;rsquo;s responsibility to decide what is important to build.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Time management:&lt;/strong&gt; I have a variety of responsibilities so I need to juggle between them and the time I allocate to them. I also need to accomplish certain tasks according to deadlines, so it is important to properly manage my time, what gets done and when it gets done.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Design/code organization:&lt;/strong&gt; Programming is more than science. You also need to think about how the different parts of the code interact with each other and how to organize the code so that it is easy for others to understand the code and to participate in its development.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Negotiation:&lt;/strong&gt; Working in an organization means negotiating with others to make your ideas heard, accepted and developed. Not everyone will agree with your ideas, so you need to spend time and effort to convince others that your idea is the best.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Scheduling:&lt;/strong&gt; While time management is about making sure that you&amp;rsquo;re spending your time on a task at the right moment, scheduling is about organizing your use of time with others in the company. It is about scheduling meetings and or events.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Delegation:&lt;/strong&gt; Being able to offload work to others is important. It is however a difficult skill because you need to be able to properly communicate with others what needs to be done and the expectations that you have (or that others have) regarding the completion of the task.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; I love playing detective when there are issues in the code I maintain. I&amp;rsquo;ve acquired over the years a good ability to understand a system and to quickly pinpoint the cause of a bug or low performing system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Communication:&lt;/strong&gt; Work is largely exchanging information and aligning with your coworkers. The most important skill of communication is listening because you want to understand first before saying anything.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Adding tests to a project with no tests</title>
      <link>https://tomrochette.com/problems/2020/03/05/</link>
      <pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/05/</guid>
      <category>problems</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;There are no tests on the project I joined. How do I get started?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When joining a new project without tests, here is the value you need to provide through the addition of tests:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;the application works and doesn&amp;rsquo;t crash&lt;/li&gt;&#xA;&lt;li&gt;the application works and supports a few input cases&lt;/li&gt;&#xA;&lt;li&gt;the application works and supports a variety of input cases&lt;/li&gt;&#xA;&lt;li&gt;the application works and is robust to most input cases&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Start by finding the main entrypoint of the program and call it in a test. Your test doesn&amp;rsquo;t have to do much, other than ensuring you can start the program and possibly exit. Your goal should not be to assert anything yet, but to exert the code. Create a few tests that do very few things other than starting and terminating the program. Once you&amp;rsquo;ve covered a few use cases, you can use those tests to ensure that the application can start, do a few things, then terminate without crashing.&lt;/p&gt;&#xA;&lt;p&gt;Start unit testing the various parts of the code that are critical. To determine what is critical, you&amp;rsquo;ll have to dig into the code. With the tests you initially wrote you will get a sense of the &amp;ldquo;critical&amp;rdquo; pieces, simply due to the fact that they are executed whenever the program starts and stops, which are two things you always want to work.&lt;/p&gt;&#xA;&lt;p&gt;When writing unit tests, always aim to write a test case that covers the happy path first. You want to demonstrate that the functionality a class or function is supposed to provide is there first and foremost. Then you want to test its robustness and its ability to handle a variety of input cases. Given a large codebase, start by covering most of the code with the happy paths before you start to dig into the special cases.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/writing-tests/&#34; &gt;Writing tests&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Making others more productive</title>
      <link>https://tomrochette.com/questions/2020/03/05/</link>
      <pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/05/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you make people more productive?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Start by asking your teammates to assess whether they are at their peak productivity or not. If they already are, ask them what you could do to help them be more productive. If they are not at their peak productivity, ask them what is making them unproductive. Make it your goal to help your teammates be as productive and efficient as possible.&lt;/p&gt;&#xA;&lt;p&gt;Being unproductive is like slow software. If you want to improve it, you have first to start with profiling the program to have an idea of what is making it slow. Once you have a general idea of the cause of the slowness, you will want to focus on your biggest sources of slowness because they are likely to be the ones you can help improve.&lt;/p&gt;&#xA;&lt;p&gt;In software development, the biggest source of productivity loss is meetings. Meetings break the flow of developers, they consume time and are generally easy to replace with a properly written document. If you can act as the proxy for multiple members of your team so that they do not have to attend all the same meetings you are attending, you can help them reduce this meeting fatigue.&lt;/p&gt;&#xA;&lt;p&gt;Another source of ineffectiveness is back and forth code reviews. If you need to do multiple iterations of review to close a PR, this PR was too big. If you also end up having to do more than two back and forth, you should simply reach out to the author of the PR and do a pair programming session with them to resolve most of the issues you have with the PR in a single session.&lt;/p&gt;&#xA;&lt;p&gt;Code depends on other code. It should be your first priority to make sure that code that is developed by others is not stuck in the PR queue for a long period of time because the author might be building on that code. The code in that PR may actually be used by code the author is already writing while waiting for the PR to be reviewed. If he needs to go back and fix things because of delays in the PR, this will make his whole development process inefficient. Having to wait or being blocked is an important source of productivity loss.&lt;/p&gt;&#xA;&lt;p&gt;Help others avoid working on too many tasks at once. The brain does not handle multitasking very well and it generally leads to lower performance and higher error rate.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>List outdated packages using poetry</title>
      <link>https://tomrochette.com/problems/2020/03/04/</link>
      <pubDate>Wed, 04 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/04/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use poetry as my python package manager and I&amp;rsquo;d like to know the packages that I depend on that are currently outdated.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;An easy way to get this list is to run &lt;code&gt;poetry show --outdated&lt;/code&gt;. This will return you a list of all the packages that are outdated, their current version, the latest version, as well as a description of the package.&lt;/p&gt;&#xA;&lt;p&gt;There are in my opinion three missing features here:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;having the command respect the semantic versioning constraint and only letting you see the latest version according to those constraints&lt;/li&gt;&#xA;&lt;li&gt;having a flag to switch between showing the latest version available without semantic versioning constraint vs the latest version constrained by semantic versioning&lt;/li&gt;&#xA;&lt;li&gt;having a flag to list only the packages that are direct dependencies (listed in the &lt;code&gt;pyproject.toml&lt;/code&gt; file)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://python-poetry.org/docs/cli/#show&#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=python-poetry.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Poetry show command&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The most important part of a meeting</title>
      <link>https://tomrochette.com/questions/2020/03/04/</link>
      <pubDate>Wed, 04 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/04/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is the most important part of a meeting?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The agenda.&lt;/p&gt;&#xA;&lt;p&gt;If you get invited to a meeting that only has a title, ask for an agenda. If the agenda is only the title of the meeting, ask for a detailed agenda.&lt;/p&gt;&#xA;&lt;p&gt;If people cannot prepare an agenda for a meeting, then there is no point in meeting. A meeting with no preparation will generally be ineffective simply because it will be spent either sharing information, something that could have been done without meeting, or actually doing preparatory work for something that would deserve to be done in a group, but not as a meeting in itself.&lt;/p&gt;&#xA;&lt;p&gt;If you need to make some decisions with a few people, then prepare the list of decisions that will be made during the meeting.&lt;/p&gt;&#xA;&lt;p&gt;Make sure that your meetings have an agenda. You will get a lot more out of your meeting because you will know the outcome you expect out of them.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/meetings/&#34; &gt;Meetings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/02/11/&#34; &gt;What does a productive meeting look like?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Mypy and implicit namespaces</title>
      <link>https://tomrochette.com/problems/2020/03/03/</link>
      <pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/03/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use mypy but it doesn&amp;rsquo;t seem to scan all my files. Why?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You might be using implicit namespaces in your code (see &lt;a href=&#34;https://www.python.org/dev/peps/pep-0420/&#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=www.python.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PEP 420&lt;/a&gt;). Support for implicit namespaces in &lt;code&gt;mypy&lt;/code&gt; is rather flaky as of 2020-03-03.&lt;/p&gt;&#xA;&lt;p&gt;One solution for the moment is to add &lt;code&gt;__init__.py&lt;/code&gt; and make all your namespaces explicit.&lt;/p&gt;&#xA;&lt;p&gt;Another solution is to replace your calls to &lt;code&gt;mypy some-path&lt;/code&gt; with &lt;code&gt;mypy $(find some-path -name &amp;quot;*.py&amp;quot;)&lt;/code&gt;.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Useful code refactoring</title>
      <link>https://tomrochette.com/questions/2020/03/03/</link>
      <pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/03/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you tell between noisy and useful code refactoring?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The classical adage in software development is that &amp;ldquo;if it ain&amp;rsquo;t broke, don&amp;rsquo;t fix it&amp;rdquo;. Code may not be in an ideal state, but you should not focus on refactoring it if you aren&amp;rsquo;t working to change it to do something else or so that it can be used in other parts of the code. It is fine to do code refactoring from time to time, especially if you have free cycles and know about a few pieces of code that have been bothersome. However, spending time refactoring systems that are already working but a bit clunky may not be the best use of time, especially if you or your team don&amp;rsquo;t have free cycles to spare to review your changes. A better use of time may for example to help others on their tasks or to prepare future work so it goes smoothly.&lt;/p&gt;&#xA;&lt;p&gt;In a business environment, a refactor also means implicating other developers to review your changes. As such, this introduces distractions in those developers that could be more focused.&lt;/p&gt;&#xA;&lt;p&gt;In this case, whether a refactor or other changes to the code is noisy is a matter of timing.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Quickly recording notes using VS Code</title>
      <link>https://tomrochette.com/problems/2020/03/02/</link>
      <pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/02/</guid>
      <category>problems</category><category>visual-studio-code</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I want to quickly take notes in the same file throughout the day using VS Code. How do I do that?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My approach has been to use my VS Code extension &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tomzx.run-me&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Run Me&lt;/a&gt;, which I use to bind a keyboard shortcut to one of the commands I created. In my particular case, on any VS Code window I can press &lt;kbd&gt;CTRL&lt;/kbd&gt;&lt;kbd&gt;Numpad 2&lt;/kbd&gt; and it will open a file under the following path: buffer/YYYY/MM/DD.md, where YYYY/MM/DD is replaced with the year/month/day. In this file I record all my notes within the day.&lt;/p&gt;&#xA;&lt;p&gt;I use the following snippet, which I can trigger using &lt;code&gt;dt&lt;/code&gt;, then pressing &lt;kbd&gt;TAB&lt;/kbd&gt;. This replaces the &lt;code&gt;dt&lt;/code&gt; string with a string of the form &lt;code&gt;YYYY-MM-DD HH:MM:SS&lt;/code&gt;, which is the current year-month-day hour:minute:second.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;Datetime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;prefix&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;dt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE $CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Date time&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;I also use the &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=mkloubert.vs-script-commands&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Script Commands&lt;/a&gt; extension to do something slightly more complicated, which is to create strings of the form &lt;code&gt;2020-03-02 21:19:05 [nid://952]&lt;/code&gt;, where &lt;code&gt;nid://952&lt;/code&gt; represents a unique note id (&lt;code&gt;nid&lt;/code&gt;). The number that is generated is unique and is tracked by storing the last generated number in a text file that is read/written on each call to this command. A cheaper approach could have been to simply use the timestamp as unique note id. One downside of the timestamp as note id approach is that you don&amp;rsquo;t have an idea of how many notes you&amp;rsquo;ve recorded so far, other than searching your notes and then counting the number of unique instances.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tomzx.run-me&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Visual Studio Marketplace - Run Me extension&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/02/01/&#34; &gt;Thoughts tracking&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Rough project size estimation</title>
      <link>https://tomrochette.com/questions/2020/03/02/</link>
      <pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/02/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do you estimate the size of a project roughly?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When I am asked to provide a rough estimate of the required effort on a project with a lot of requirements or user stories, I first want to make sure that my estimate is in the right order of magnitude. That means that I want to estimate a project that takes 1-10 weeks to be in that range, but not estimate less than a week or more than 10 weeks. Similarly, a project that takes one or more years should not estimated as a job of a few weeks.&lt;/p&gt;&#xA;&lt;p&gt;My orders of magnitude are as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1 day&lt;/li&gt;&#xA;&lt;li&gt;1 week (5 days)&lt;/li&gt;&#xA;&lt;li&gt;1 month (20 days)&lt;/li&gt;&#xA;&lt;li&gt;1 quarter (60 days)&lt;/li&gt;&#xA;&lt;li&gt;1 half-year (120/125 days)&lt;/li&gt;&#xA;&lt;li&gt;1 year (250 days)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;As such, when estimating a task, I will say that the task will either take 1 day, 1 week or 1 month. In general, any task that is estimated at 1 month long (or above) needs to be broken down into sub-tasks as it indicates that the task is hiding a lot of complexity.&lt;/p&gt;&#xA;&lt;p&gt;With this kind of approach, one can estimate that a developer can do approximately 250 small tasks (1 day), 50 medium tasks (5 days) or 13 large tasks (20 days) per year.&lt;/p&gt;&#xA;&lt;p&gt;Start by creating an estimate of the overall project without thinking about any of the underlying tasks. This is done to have a quick idea of the scale of the project.&lt;/p&gt;&#xA;&lt;p&gt;Then list and estimate the tasks that will need to be accomplished to complete the project. You might be forgetting a few, but it is fine at that moment. Think mostly of the most important tasks and also the riskiest.&lt;/p&gt;&#xA;&lt;p&gt;If the sum of the efforts you estimated is in the same order of your original project estimate, then you are done. If not, then you need to investigate and explain what led you to either over or under estimate. Did you forget to estimate some tasks? Did you ignore some tasks when you did your initial estimate? What were the assumptions you made that were right/wrong? Once you are satisfied with your explanation, you are done with estimating.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Read more books</title>
      <link>https://tomrochette.com/questions/2020/03/01/</link>
      <pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/03/01/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can I read more books?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Make it a priority to read books. Replace some of the existing habits you have with reading books instead.&lt;/p&gt;&#xA;&lt;p&gt;If you like to spend time reading reddit or hackernews or watching videos on youtube, replace that with reading a book. Of course, it&amp;rsquo;s easier said than done. The best way I&amp;rsquo;ve been able to transition from those activities to reading books was to progress slowly. Don&amp;rsquo;t replace reading hackernews one day by reading a book instead. Instead, simply spend 5, 10, 15 minutes reading a book, and then the remainder of the time on reading hackernews. Spend the same amount of time every day reading a book for a week. When a week has passed, increase that amount of time slightly (e.g., go from 5 minutes per day to 10 minutes per day).&lt;/p&gt;&#xA;&lt;p&gt;As you increase the amount of time you read, you will find it easier and easier to spend time reading instead of doing other activities you might consider harmful or less valuable.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Visual Studio Code templates</title>
      <link>https://tomrochette.com/problems/2020/03/01/</link>
      <pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/01/</guid>
      <category>problems</category><category>visual-studio-code</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use VS Code and I&amp;rsquo;d like to insert templates into my documents. How do I do this?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In VS Code, the concept of templates is called &lt;a href=&#34;https://code.visualstudio.com/docs/editor/userdefinedsnippets&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;snippets&lt;/a&gt;. It is fairly easy to &lt;a href=&#34;https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;create a snippet&lt;/a&gt;, so I won&amp;rsquo;t go into the details. Here&amp;rsquo;s an example of a snippet I use to insert the date and time quickly into my documents.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;Datetime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;prefix&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;dt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE $CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Date time&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;With this snippet, I only have to type &lt;code&gt;dt&lt;/code&gt; and then press &lt;kbd&gt;TAB&lt;/kbd&gt; and &lt;code&gt;dt&lt;/code&gt; gets replaced by the current date and time.&lt;/p&gt;&#xA;&lt;p&gt;I use snippets to create the template of my &lt;a href=&#34;https://tomrochette.com/questions/&#34; &gt;questions&lt;/a&gt; and &lt;a href=&#34;https://tomrochette.com/problems/&#34; &gt;problems&lt;/a&gt; articles. My current approach is to open a non-existent file by calling &lt;code&gt;code /path/to/new/file&lt;/code&gt; and VS Code opens the editor with this file. I can then write the content of this file, which will not automatically save until I manually save. Once I&amp;rsquo;m happy with the content of my article, I manually save, which means that in the future, any edit I make and then have the editor lose focus will be automatically saved and commit to git (my current workflow).&lt;/p&gt;&#xA;&lt;p&gt;One of the things I don&amp;rsquo;t particularly like with the current implementation of the snippets system is that the body needs to be a list of strings, where each item represents a new line. It is possible to create a single entry and use \n and \ to format the string, but that is not a clean approach. Those are limitations of jsonc. If it was possible to link to a file, then it would be &amp;ldquo;easy&amp;rdquo; to create a clean template.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/docs/editor/userdefinedsnippets&#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=code.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://code.visualstudio.com/docs/editor/userdefinedsnippets&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Improving the performance of a slow click CLI</title>
      <link>https://tomrochette.com/problems/2020/03/07/</link>
      <pubDate>Sat, 29 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/03/07/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My &lt;a href=&#34;https://click.palletsprojects.com/&#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=click.palletsprojects.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;click CLI&lt;/a&gt; is slow, even just to show the help. How do I make it go faster?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In most cases, the reason your click CLI is slow is that you have large imports at the top of the files where you have declared your commands.&lt;/p&gt;&#xA;&lt;p&gt;The typical pattern is as follows:&lt;/p&gt;&#xA;&lt;p&gt;cli.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;train&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;train&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;predict&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;predict&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@click.group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;cli&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cli&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;predict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cli&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;train&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;train.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;click&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;torch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@click.command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;train&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;predict.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;click&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;torch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@click.command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;predict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Notice that in both these files we import &lt;code&gt;pandas&lt;/code&gt; and &lt;code&gt;torch&lt;/code&gt;, which can account for a large chunk of script execution time simply due to importing them. You can verify that by simply running &lt;code&gt;python -X importtime train.py 2&amp;gt;tuna.log&lt;/code&gt; and using &lt;a href=&#34;https://github.com/nschloe/tuna&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tuna&lt;/a&gt; (run &lt;code&gt;tuna tuna.log&lt;/code&gt;) to inspect the results and convince yourself.&lt;/p&gt;&#xA;&lt;p&gt;The suggested pattern is to move the imports inside of the function itself, as such:&lt;/p&gt;&#xA;&lt;p&gt;train.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;click&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@click.command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;train&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;torch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;predict.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;click&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@click.command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;predict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;torch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;This will shave off a large amount of time spent importing those packages (&lt;code&gt;pandas&lt;/code&gt; and &lt;code&gt;torch&lt;/code&gt;). They will only be loaded when you need to run the command itself, not every time you invoke the CLI.&lt;/p&gt;&#xA;&lt;p&gt;Another pattern which is more complicated is to move the logic of the functions in separate files. This is done to avoid the common mistake that will happen over time that developers will add more logic in those command files, adding imports at the top of the file and slowing the CLI again. By moving the complete implementation to a separate file, you can have the imports at the top of the file and it is not possible to make this mistake again.&lt;/p&gt;&#xA;&lt;p&gt;train.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;click&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@click.command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;train&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;train_implementation&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;train&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;train&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;train_implementation.py&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;torch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;train&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;c1&#34;&gt;# Implementation is now here&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Slow python imports</title>
      <link>https://tomrochette.com/problems/2020/02/29/</link>
      <pubDate>Sat, 29 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/29/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Some imports in my python code are slow. How can I figure out which ones are the source of slowness?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Python offers a really useful functionality you can use that will list how long each import took. By passing the &lt;code&gt;-X importtime&lt;/code&gt; argument to your python command when you execute your script it will print out both the cumulative time (including nested imports) and self time (excluding nested imports) of each import.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -X importtime your-script.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Running &lt;code&gt;python -X importtime my-script.py&lt;/code&gt; on an empty script returns the following (on Windows 7, Python 3.7.5)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time: self [us] | cumulative | imported package&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        52 |         52 | zipimport&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       367 |        367 | _frozen_importlib_external&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        55 |         55 |     _codecs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       530 |        585 |   codecs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       520 |        520 |   encodings.aliases&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:      1107 |       2210 | encodings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       328 |        328 | encodings.utf_8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        39 |         39 | _signal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       357 |        357 | encodings.latin_1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        34 |         34 |     _abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       312 |        345 |   abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       474 |        819 | io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       113 |        113 |       _stat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       264 |        377 |     stat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       269 |        269 |       genericpath&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       794 |       1062 |     ntpath&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       871 |        871 |     _collections_abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       915 |       3223 |   os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       490 |        490 |   _sitebuiltins&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        57 |         57 |     _locale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       934 |        991 |   _bootlocale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       421 |        421 |   encodings.cp1252&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       472 |        472 |   types&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       394 |        394 |       warnings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       440 |        834 |     importlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       263 |        263 |       importlib.machinery&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       554 |        816 |     importlib.abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        64 |         64 |           _operator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       792 |        856 |         operator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       343 |        343 |         keyword&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        43 |         43 |           _heapq&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       405 |        447 |         heapq&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        85 |         85 |         itertools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       328 |        328 |         reprlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        69 |         69 |         _collections&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:      1460 |       3585 |       collections&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        44 |         44 |         _functools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       596 |        640 |       functools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       784 |       5008 |     contextlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       651 |       7308 |   importlib.util&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:      1095 |       1095 |   pywin32_bootstrap&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       231 |        231 |   sitecustomize&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:     10744 |      24972 | site&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;For a script with a simple &lt;code&gt;import argparse&lt;/code&gt;, I get the following output:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time: self [us] | cumulative | imported package&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        70 |         70 | zipimport&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       341 |        341 | _frozen_importlib_external&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        54 |         54 |     _codecs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       457 |        511 |   codecs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       456 |        456 |   encodings.aliases&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:      1030 |       1997 | encodings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       215 |        215 | encodings.utf_8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        38 |         38 | _signal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       268 |        268 | encodings.latin_1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        33 |         33 |     _abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       398 |        431 |   abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       311 |        741 | io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        87 |         87 |       _stat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       271 |        357 |     stat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       196 |        196 |       genericpath&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       416 |        612 |     ntpath&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       714 |        714 |     _collections_abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       610 |       2292 |   os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       229 |        229 |   _sitebuiltins&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        48 |         48 |     _locale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       246 |        293 |   _bootlocale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       217 |        217 |   encodings.cp1252&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       488 |        488 |   types&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       279 |        279 |       warnings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       461 |        740 |     importlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       269 |        269 |       importlib.machinery&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       557 |        825 |     importlib.abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        63 |         63 |           _operator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       808 |        871 |         operator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       336 |        336 |         keyword&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        41 |         41 |           _heapq&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       336 |        376 |         heapq&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        69 |         69 |         itertools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       341 |        341 |         reprlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        70 |         70 |         _collections&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:      1136 |       3197 |       collections&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        69 |         69 |         _functools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       642 |        710 |       functools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       801 |       4708 |     contextlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       688 |       6959 |   importlib.util&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       934 |        934 |   pywin32_bootstrap&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       224 |        224 |   sitecustomize&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:      9323 |      20954 | site&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       698 |        698 |     enum&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        55 |         55 |       _sre&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       417 |        417 |         sre_constants&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       372 |        789 |       sre_parse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       443 |       1286 |     sre_compile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       323 |        323 |     copyreg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       716 |       3021 |   re&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       725 |        725 |     locale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       948 |       1673 |   gettext&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       986 |       5678 | argparse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The package are listed in order that they are resolved. In &lt;code&gt;argparse&lt;/code&gt; case, &lt;code&gt;os&lt;/code&gt; and &lt;code&gt;sys&lt;/code&gt; were already loaded, so it first loads &lt;code&gt;re&lt;/code&gt;, then &lt;code&gt;gettext&lt;/code&gt;. Once both are loaded, &lt;code&gt;argparse&lt;/code&gt; has finished loading.&lt;/p&gt;&#xA;&lt;p&gt;The way the cumulative column is computed is to take all the prior self that are a level higher than the package you&amp;rsquo;re looking at. For example (if we take the io package):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:        33 |         33 |     _abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       398 |        431 |   abc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time:       311 |        741 | io&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;311 + 398 + 33 = 742&lt;/p&gt;&#xA;&lt;p&gt;We can see here that the numbers are not necessarily equal to one another, this might be due to precision used to do the computation while the rendering of numbers is rounded.&lt;/p&gt;&#xA;&lt;p&gt;Note that the load time of a package may be different depending on which script you load because dependencies of the package may have already been loaded in some cases, while in others it may have to load them.&lt;/p&gt;&#xA;&lt;p&gt;Looking at text might be your thing, but if you&amp;rsquo;re more visual, there&amp;rsquo;s a tool called &lt;a href=&#34;https://github.com/nschloe/tuna&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;tuna&lt;/a&gt; which will consume this output and create an icicle plot you can look at to find which imports are the slowest/longest.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.python.org/3/using/cmdline.html#id5&#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.python.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Python documentation on -X&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/nschloe/tuna&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/nschloe/tuna&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Smarter people than you</title>
      <link>https://tomrochette.com/questions/2020/02/29/</link>
      <pubDate>Sat, 29 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/29/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you tell when you&amp;rsquo;ve reached the top of your job and that you won&amp;rsquo;t find smarter people?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When people that challenge you bring arguments which you&amp;rsquo;ve already considered. When the suggestions of others are stale or not intriguing. When you don&amp;rsquo;t find excitement in your work. When you aren&amp;rsquo;t challenged anymore. When the problems you are facing are not solved elegantly by others. When the problems you are facing have become so niche that few people on Earth may be able to discuss them or help you solve them.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/intelligence/#relative-to-your-own&#34; &gt;Intelligence - Relative to your own&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Determining if you are a low performer</title>
      <link>https://tomrochette.com/questions/2020/02/28/</link>
      <pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/28/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you tell if you are a low performer?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I always prefer to compare myself against my prior self and not against others. Thus, I would consider myself a low performer if my throughput is lower than what it has been on average in the past. This may happen for many reasons, amongst them it would be because I&amp;rsquo;m learning something new, so I&amp;rsquo;m spending a good chunk of my time on learning and less on executing. It might be because I&amp;rsquo;m trying different ideas to find the best one because I&amp;rsquo;m working on something I&amp;rsquo;ve never worked before.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s generally easy for a programmer to tell whether he&amp;rsquo;s been more or less productive than the prior week. It is mostly based on feelings, where you feel good when you are productive and less good when you&amp;rsquo;re not making any progress or facing issues.&lt;/p&gt;&#xA;&lt;p&gt;If you think and feel that you are performing poorly, start recording more thoroughly what you are working on. Identify when you start and finish working on a task, and when you get blocked, write down why. After a few weeks, look at what you wrote and assess what might cause you to feel that you are a low performer. Is it because you&amp;rsquo;re working on a task you are not good at? Is it because of a lack of motivation on the task you&amp;rsquo;ve been assigned to?&lt;/p&gt;&#xA;&lt;p&gt;With more information in hand to determine why you feel that you are a low performer, you will be able to devise a plan so that you can once again feel like a high performer.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Pytest with tests files with similar names</title>
      <link>https://tomrochette.com/problems/2020/02/28/</link>
      <pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/28/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I have two test files with the same name and pytest complains. How do I make it work without changing the test filenames?&lt;/p&gt;&#xA;&lt;p&gt;Example directory structure&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/project/tests&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── a/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── test_a.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── b/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── test_a.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Error message:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import file mismatch:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;imported module &amp;#39;test_a&amp;#39; has this __file__ attribute:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /path/to/project/tests/a/test_a.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which is not the same as the test file we want to collect:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /path/to/project/tests/b/test_a.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Add a &lt;code&gt;__init__.py&lt;/code&gt; to each directories with tests files that have the same name. Technically, you only need to have a &lt;code&gt;__init__.py&lt;/code&gt; file in one of the two directories, so that one is in a package while the other one is in a different one. Adding it in both simply prevents this issue from occurring again if you were to add a third file &lt;code&gt;test_a.py&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/project/tests&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── a/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── __init__.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── test_a.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── b/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── __init__.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── test_a.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Identifying python files with no coverage</title>
      <link>https://tomrochette.com/problems/2020/02/27/</link>
      <pubDate>Thu, 27 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/27/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use pytest with coverage and I want to see the files that have no coverage.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;It appears that pytest and pytest-cov will not list someof the files that are under namespace packages, while it will work fine for files in regular packages (see &lt;a href=&#34;https://www.python.org/dev/peps/pep-0420/&#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=www.python.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PEP 420&lt;/a&gt; on the topic of implicit namespace packages).&lt;/p&gt;&#xA;&lt;p&gt;To fix this problem, one solution is to add &lt;code&gt;__init__.py&lt;/code&gt; files in all of your directories in order to create regular packages.&lt;/p&gt;&#xA;&lt;p&gt;If you are using PyCharm Professional, you can simply run your test with coverage. This will allow you to identify all the files that have currently no coverage as they will appear with coverage = 0%.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.jetbrains.com/help/pycharm/running-test-with-coverage.html&#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=www.jetbrains.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.jetbrains.com/help/pycharm/running-test-with-coverage.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>User demo walkthrough</title>
      <link>https://tomrochette.com/questions/2020/02/27/</link>
      <pubDate>Thu, 27 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/27/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What should be defined to make a user demo walkthrough successful?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You need to define what you want to learn from the demo walkthrough: where does the user ask questions? where does he stay stuck? what is easy/hard for him to do? what does he think about when he goes through the demo? what is/isn&amp;rsquo;t working? what frustrates him? where does the user want to have more guidance?&lt;/p&gt;&#xA;&lt;p&gt;The user doing the walkthrough should be as close as possible to the ideal user otherwise you may get feedback that is biased on their own experience. A user with too much knowledge compared to your target user will be able to do many things your target user may need help with and they may assume a lot of things because they know about them. On the other hand, a user with too little knowledge will require help in many places where the target user is expected to have knowledge, which may make the demo walkthrough slower than desired.&lt;/p&gt;&#xA;&lt;p&gt;The walkthrough should have a clear scenario. You may only give an initial setup to the user and a desired goal and let them figure everything out by themselves. You may also go with a more directed approach, where you tell them what to do and you see if the instructions are clear enough to accomplish the steps. The first approach is interesting because it allows you to observe variability in how to solve a problem.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Accelerate slow pytests</title>
      <link>https://tomrochette.com/problems/2020/02/26/</link>
      <pubDate>Wed, 26 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/26/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My pytests take a while to complete, how can I speed up the process?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;A fairly cheap solution is to use parallelization to run your tests on multiple CPUs instead of the 1 cpu used by default. To do so, you can install &lt;a href=&#34;https://github.com/pytest-dev/pytest-xdist&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;pytest-xdist&lt;/code&gt;&lt;/a&gt;. Once the extension is specified, all you need to do is add &lt;code&gt;-n auto&lt;/code&gt; when you call &lt;code&gt;pytest&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Another thing you should do that requires more effort is to investigate which of your tests are consuming a lot of CPU time to execute. To do so, use the &lt;code&gt;--durations=0&lt;/code&gt; flag when you call &lt;code&gt;pytest&lt;/code&gt;. A report will be generated after your tests have run that lists how long setting up, running and tearing down each specific test took. The list is ordered from longest to shortest durations, meaning that the tests that have the most potential for being optimized will be at the top. You should focus on these tests because the longest one will determine how long it would take to run your tests even if you had an infinite amount of CPU cores.&lt;/p&gt;&#xA;&lt;p&gt;Investigate why certain tests take a while to execute.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Are some tests computing something that takes a while and is computed exactly the same way by multiple tests? Precompute this result once and share it between the different tests (think of it as a fixture).&lt;/li&gt;&#xA;&lt;li&gt;Are calls to a slow external API done? If you are not testing that the remote API is changing, store example responses and emulate receiving them.&lt;/li&gt;&#xA;&lt;li&gt;Is there a loop in the test that runs hundreds of thousands iterations while the same test could be executed with only a thousand iterations?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/pytest-dev/pytest-xdist&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/pytest-dev/pytest-xdist&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Working on the wrong task</title>
      <link>https://tomrochette.com/questions/2020/02/26/</link>
      <pubDate>Wed, 26 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/26/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you tell when you&amp;rsquo;re working on the wrong task?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You may be working on the wrong task because priorities have changed. To determine if that is the case, you should ask yourself whether completing the task provides value, either to you or your users. If the answer is no, drop the task. If the answer is yes, you should determine if it is the utmost important task at the moment. If the answer is no, then figure out which task is. If the answer is yes, then proceed.&lt;/p&gt;&#xA;&lt;p&gt;You may be working on the wrong task because you don&amp;rsquo;t have the necessary information to complete the time in an appropriate amount of time. If you find yourself spending most of your time gathering information instead of accomplishing the task that should be done with the information you need, then it may not be the right time to do the task yet. You may have to create a prior task which is to acquire the necessary knowledge to execute the original task.&lt;/p&gt;&#xA;&lt;p&gt;If you notice that to complete your task there are pre-requisites that should have been completed, then you should work on those instead of the task with those dependencies. In some cases you may realize that you can&amp;rsquo;t accomplish a task because you don&amp;rsquo;t have the tooling necessary or the technology to accomplish the task is not available yet.&lt;/p&gt;&#xA;&lt;p&gt;As I suggest in my article &lt;a href=&#34;https://tomrochette.com/questions/2020/01/03/&#34; &gt;Given that you define a ROI on a task, when should you stop working on a task and abandon it given its cost?&lt;/a&gt;, you should estimate how long you expect for a task to take. At the half time, you should evaluate whether you&amp;rsquo;ll be able to complete the task by the estimate&amp;rsquo;s deadline. If you can&amp;rsquo;t, then you should either drop the task (if you can), or look for alternative ways to get the task completed, either by asking a more experienced person or by simplifying the task.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/03/&#34; &gt;Given that you define a ROI on a task, when should you stop working on a task and abandon it given its cost?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Introducing mypy in code with lots of issues</title>
      <link>https://tomrochette.com/problems/2020/02/25/</link>
      <pubDate>Tue, 25 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/25/</guid>
      <category>problems</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I want to include &lt;code&gt;mypy&lt;/code&gt; as part of my CI pipeline but my existing code contains a lot (&amp;gt; 100, but &amp;lt; 500) of issues. How can I get started?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Create a minimalist configuration of &lt;code&gt;mypy&lt;/code&gt; such that it will list issues that need to be fixed and return a non-zero exit code. Based on the problem definition, we assume that at this step you have more than 100 issues that are listed and that fixing those issues will take many hours you&amp;rsquo;d rather invest in improving the code than to fix typing issues.&lt;/p&gt;&#xA;&lt;p&gt;Add a step in your CI pipeline that runs &lt;code&gt;mypy&lt;/code&gt; and list all those issues. Verify that it indeed breaks the build.&lt;/p&gt;&#xA;&lt;p&gt;Once you&amp;rsquo;ve satisfied yourself that CI fails, we will &amp;ldquo;fix&amp;rdquo; the &lt;code&gt;mypy&lt;/code&gt; issues by adding the &lt;code&gt;#type: ignore&lt;/code&gt; and/or &lt;code&gt;# noqa&lt;/code&gt; comment after the offending lines with issues. This will have the effect of resolving all the currently found &lt;code&gt;mypy&lt;/code&gt; issues, such that &lt;code&gt;mypy&lt;/code&gt; should now return a zero exit code. With this, any future code that fails to pass the &lt;code&gt;mypy&lt;/code&gt; check will break the build. This will allow you to use &lt;code&gt;mypy&lt;/code&gt; from this point forward to check your types.&lt;/p&gt;&#xA;&lt;p&gt;I suggest adding an additional comment such as &lt;code&gt;# FIXME: TICKET-ID&lt;/code&gt;, where &lt;code&gt;TICKET-ID&lt;/code&gt; refers to the id of a ticket in your issue tracking system that explains that you need to take care of this technical debt.&lt;/p&gt;&#xA;&lt;p&gt;Always prefer to fix the issues instead of ignoring them. However, also consider whether fixing those issues is an appropriate use of your time when you want to introduce &lt;code&gt;mypy&lt;/code&gt; (which should be as soon as possible in my opinion).&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mypy.readthedocs.io/en/stable/common_issues.html#silencing-linters&#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=mypy.readthedocs.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://mypy.readthedocs.io/en/stable/common_issues.html#silencing-linters&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Knowing your users</title>
      <link>https://tomrochette.com/questions/2020/02/25/</link>
      <pubDate>Tue, 25 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/25/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What should I know about my users if I want to build appropriate software for them?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;If you are building technical software for your users, you need to know what their level of expertise and experience is. If you can use a job title to describe their position, that is a great start.&lt;/p&gt;&#xA;&lt;p&gt;You should define the users&amp;rsquo; strengths and weaknesses, that is, what you expect them to excel at and where they will require more of your assistance to succeed at their task.&lt;/p&gt;&#xA;&lt;p&gt;Define the scenarios in which your users use the software you will build. What information do they have available? Which information do they need to gather? What kind of decisions do they need to make? Which decisions can be automated for them? Do they need to run the software in a specific environment? Do they need access to data to do their task? How is this data made available to them? When do they use the software? How frequently do they use the software? How much of their time is spent on the task they are solving using the software you&amp;rsquo;re building?&lt;/p&gt;&#xA;&lt;p&gt;Define what the users&amp;rsquo; goals are. You might be creating a text editor, if your users&amp;rsquo; goal is to transmit information between companies, they may not care at all about making the text fancy but they might appreciate your editor helping them correct grammatical mistakes.&lt;/p&gt;&#xA;&lt;p&gt;You want to be as specific as possible when describing your users so that your decisions are guided by this persona you&amp;rsquo;re creating. What kind of company are they working in? Startups, PME, large enterprises? Do they have multiple responsibilities or are specialized?&lt;/p&gt;&#xA;&lt;p&gt;With all this information about your users you should be able to make more judicious decisions. This will help you scope your work.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.interaction-design.org/literature/article/personas-why-and-how-you-should-use-them&#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=www.interaction-design.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.interaction-design.org/literature/article/personas-why-and-how-you-should-use-them&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.agilemodeling.com/artifacts/personas.htm&#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=www.agilemodeling.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.agilemodeling.com/artifacts/personas.htm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Rotten Tomatoes ratings exporter</title>
      <link>https://tomrochette.com/problems/2020/02/24/</link>
      <pubDate>Mon, 24 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/24/</guid>
      <category>problems</category><category>php</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I have rated a lot of movies on Rotten Tomatoes and I&amp;rsquo;d like to export them to a text format. I also know PHP. How can I do that?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In 2013 I wrote &lt;a href=&#34;https://github.com/tomzx/rotten-tomatoes-exporter&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Rotten Tomatoes ratings exporter&lt;/a&gt; for the purpose of exporting the movies I had rated into a format I could read and also store.&lt;/p&gt;&#xA;&lt;p&gt;To automate the process of acquiring the ratings, I wrote a small class which needs information available in the site&amp;rsquo;s cookies once you are logged in. With this information in hand, it is then possible to fetch the ratings from the website and store them in any desired format, given that the data returned to you is a plain PHP array.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/rotten-tomatoes-exporter&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/rotten-tomatoes-exporter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>The definition of value in business</title>
      <link>https://tomrochette.com/questions/2020/02/24/</link>
      <pubDate>Mon, 24 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/24/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How is value defined in a business context?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;For a solution to be valuable it must solve an actual problem.&lt;/p&gt;&#xA;&lt;p&gt;If a need exist for the solution, then the solution must do one or many of the following:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reduce costs/time: reduce human resources needed to produce the same results&lt;/li&gt;&#xA;&lt;li&gt;Increase quality: Increase accuracy/repeatability of a process&lt;/li&gt;&#xA;&lt;li&gt;Solve a problem that could not be solved previously&lt;/li&gt;&#xA;&lt;li&gt;Have a significant impact on costs for improving an already solved problem&lt;/li&gt;&#xA;&lt;li&gt;Offer the ability to scale the process without having to scale the necessary human support linearly with the growth of the process&lt;/li&gt;&#xA;&lt;li&gt;Help with identifying the most important pieces of the business in order to follow the &lt;a href=&#34;https://en.wikipedia.org/wiki/Pareto_principle&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;80/20 principle&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing documentation</title>
      <link>https://tomrochette.com/processes/writing-documentation/</link>
      <pubDate>Mon, 24 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/writing-documentation/</guid>
      <category>software-development</category><category>processes</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Define the audience&lt;/li&gt;&#xA;&lt;li&gt;Define the purpose&lt;/li&gt;&#xA;&lt;li&gt;Define the assumptions&lt;/li&gt;&#xA;&lt;li&gt;Provide a way to contact the author&lt;/li&gt;&#xA;&lt;li&gt;Provide a way to ask additional questions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>IMDb ratings importer</title>
      <link>https://tomrochette.com/problems/2020/02/23/</link>
      <pubDate>Sun, 23 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/23/</guid>
      <category>problems</category><category>php</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I have movie ratings that I would like to import into IMDb. I also happen to know PHP. How can I do that?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In 2013 I wrote &lt;a href=&#34;https://github.com/tomzx/imdb-importer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;IMDb ratings importer&lt;/a&gt; for the purpose of importing ratings I had created in another system (Rotten Tomatoes). I wanted to import my ratings into IMDb so that I could use their statistics reporting tools, which let you see your distribution of ratings and the distribution of the release year of the movies you&amp;rsquo;ve seen. A friend of mine also had his bot send a message to our discussion channel whenever one of us would update their ratings after watching a movie.&lt;/p&gt;&#xA;&lt;p&gt;The library is pretty straightforward. It expects you to provide it with a string that uniquely identifies your cookie on the server side.  With an array of all the titles and ratings that you have, you can submit those ratings and the library&amp;rsquo;s importer will take care of calling IMDb by finding the closest movie title and assigning it the desired rating.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/imdb-importer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/imdb-importer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing good documentation</title>
      <link>https://tomrochette.com/questions/2020/02/23/</link>
      <pubDate>Sun, 23 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/23/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What do you need to know to write good documentation?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You need to know who your audience is. You need to know what they should know so that you can make assumptions about their knowledge. You should also be able to tell what they won&amp;rsquo;t know. It is mainly this lack of knowledge that you need to fill when you write your documentation.&lt;/p&gt;&#xA;&lt;p&gt;Once you have established who your audience is, you should state it clearly. This way, readers will be able to determine if they identify or not with the target audience, which can help them better frame how to read the documentation.&lt;/p&gt;&#xA;&lt;p&gt;The purpose of documentation should be clear. Is it to describe a specific use case, provide a getting started guide, answer specific questions regarding functionalities?&lt;/p&gt;&#xA;&lt;p&gt;You need to state explicitly what you will cover and not cover in the documentation. Readers may start reading your document which contains assumptions about their knowledge, but if they do not have this knowledge, they should know where to acquire it.&lt;/p&gt;&#xA;&lt;p&gt;It should be easy for readers to know where to reach the author of the documentation or people knowledgeable enough to guide them to the right people.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.divio.com/blog/documentation/&#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=www.divio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.divio.com/blog/documentation/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.sohamkamani.com/blog/how-to-write-good-documentation/&#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=www.sohamkamani.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.sohamkamani.com/blog/how-to-write-good-documentation/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Onboarding users on your library</title>
      <link>https://tomrochette.com/questions/2020/02/22/</link>
      <pubDate>Sat, 22 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/22/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you onboard users to use your library as fast as possible?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You need to make it as frictionless as possible for them to use your library.&lt;/p&gt;&#xA;&lt;p&gt;First, they need to know the value proposition of the library. They need to know why they should use your library and not find another one available online. It needs to be convincing and to touch on the tasks they need to accomplish. The closer your vocabulary is to theirs, the easier it will be.&lt;/p&gt;&#xA;&lt;p&gt;Second, the installation process needs to be as painless as possible. If you use a language with a package manager, give instructions on how to install your package using the package manager. If there are multiple popular package managers for the language in which the package was written, make sure to cover the most used ones.&lt;/p&gt;&#xA;&lt;p&gt;Third, when users do not understand how to do certain tasks using your library (when it is in its early stage of development), take note of those questions, especially the wording. You want to capture what they were trying to do, how they described what they wanted to do, and why they were trying to do it. With this information in hand it should be easy for you to determine whether your library supports (or should support) the use case they tried to accomplish. If your library is not going to support the use case, make sure to indicate it early in the documentation so that users do not have the wrong expectation that your library will help them with this use case.&lt;/p&gt;&#xA;&lt;p&gt;Finally, try to learn as much from your users as possible. Try to understand what it is they are trying to accomplish and whether it is valuable to most of them if you were to support new use cases. If you can document the most common use cases so that they can read the steps they&amp;rsquo;ll have to go through, it will be simpler for them to evaluate the process before going through it.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Visual Studio Code Emoji extension</title>
      <link>https://tomrochette.com/problems/2020/02/22/</link>
      <pubDate>Sat, 22 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/22/</guid>
      <category>problems</category><category>visual-studio-code</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use Visual Studio Code as my main editor and I am on Windows 7. I like to use emojis but those aren&amp;rsquo;t properly rendered under Windows 7. Can I have pretty emojis in Visual Studio Code somehow?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I developed an extension in 2018 called &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tomzx.emoji&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Emoji&lt;/a&gt; which uses &lt;a href=&#34;https://github.com/joypixels/emojione&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;EmojiOne&lt;/a&gt; emojis to replace their non rendered equivalent in Visual Studio Code.&lt;/p&gt;&#xA;&lt;p&gt;To do this, the extension makes use of the &lt;code&gt;createTextEditorDecorationType&lt;/code&gt; method available on the &lt;code&gt;window&lt;/code&gt; object in order to inject CSS that adds a background image where the text emoji would be rendered.&lt;/p&gt;&#xA;&lt;p&gt;The extension listens to two events to determine in which editor it needs to do the replacement: &lt;code&gt;window.onDidChangeActiveTextEditor&lt;/code&gt; and &lt;code&gt;workspace.onDidChangeTextDocument&lt;/code&gt;. In the first case we update the editor that is now the active one, in the second, we update the active document when the text content changed.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Demo&#xA;    &lt;div id=&#34;demo&#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;#demo&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Without the extension (before)&#xA;    &lt;div id=&#34;without-the-extension-before&#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;#without-the-extension-before&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Without the extension&#34;&#xA;    width=&#34;1069&#34;&#xA;    height=&#34;427&#34;&#xA;    src=&#34;https://tomrochette.com/problems/2020/02/22/images/without-extension_hu_24324adc482f5ab3.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/problems/2020/02/22/images/without-extension_hu_24324adc482f5ab3.png 800w, https://tomrochette.com/problems/2020/02/22/images/without-extension.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/problems/2020/02/22/images/without-extension.png&#34;&gt;&lt;/figure&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;With the extension (after)&#xA;    &lt;div id=&#34;with-the-extension-after&#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;#with-the-extension-after&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;With the extension&#34;&#xA;    width=&#34;1111&#34;&#xA;    height=&#34;433&#34;&#xA;    src=&#34;https://tomrochette.com/problems/2020/02/22/images/with-extension_hu_cc45048e3fddaac6.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/problems/2020/02/22/images/with-extension_hu_cc45048e3fddaac6.png 800w, https://tomrochette.com/problems/2020/02/22/images/with-extension.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/problems/2020/02/22/images/with-extension.png&#34;&gt;&lt;/figure&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tomzx.emoji&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Visual Studio Marketplace - Emoji extension&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/vscode-emoji&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Github repository - Emoji extension&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning topics that are overwhelming</title>
      <link>https://tomrochette.com/problems/2020/02/21/</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/21/</guid>
      <category>problems</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I want to learn a new topic but it feels overwhelming. How can I do it?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When I wanted to learn about artificial general intelligence (AGI), I knew almost nothing about the field. I had a background in software engineering and I was curious about intelligence as a whole, but I had no clue what I would need to know in order to work on artificial general intelligence.&lt;/p&gt;&#xA;&lt;p&gt;My initial approach was to read a lot about the topic. It allowed me to learn about a variety of concepts and the vocabulary associated with AGI. However, as I was doing that, I felt overwhelmed by the amount of information I would have to learn. In 2014 I was reading &lt;a href=&#34;https://aima.cs.berkeley.edu/&#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=aima.cs.berkeley.edu&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Artificial Intelligence: A Modern Approach&lt;/a&gt;, then in 2017 the &lt;a href=&#34;https://www.deeplearningbook.org/&#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=www.deeplearningbook.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Deep Learning book&lt;/a&gt;. It was hard to reconcile how the new concepts I was learning and how they were all connected.&lt;/p&gt;&#xA;&lt;p&gt;At the time I already knew of mind maps. I thought it would make sense to try and map out all the knowledge I had acquired so that I could make sense of it and be able to refer to it as I would work.&lt;/p&gt;&#xA;&lt;p&gt;I initially built a very large concept map using &lt;a href=&#34;https://www.yworks.com/products/yed&#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=www.yworks.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;yEd&lt;/a&gt; that included everything I could think of that touched on the topic of AGI: machine learning, mathematics, computer science, neuroscience, etc. As the map got larger and larger, I started thinking about how I would organize it so that it was clearer to understand and that it was possible to progress through it if someone else wanted to learn from my experience. Thus, I extracted the machine learning, computer science and mathematics concept maps to their own respective concept maps.&lt;/p&gt;&#xA;&lt;p&gt;The approach has been to spend time to write down what I knew, create a node in the graph with the term, then try to associate it with other terms already in the graph. As I learned new terms I would add them to the graph. I would also dedicate a bit of time during the week to try to brain dump whatever I might have learned or I knew about that could be added to the graph. This is an iterative process, so the graph itself is never really completed. However given this graph, it is now possible to know what I have already explored and the areas where I need to do more exploration because my understanding is lacking.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/my-agi-story/&#34; &gt;My AGI story&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/my-path-to-agi/&#34; &gt;My path to AGI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/agi-concept-map&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;AGI Concept Map&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Ways to measure intelligence</title>
      <link>https://tomrochette.com/questions/2020/02/21/</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/21/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the different ways to measure intelligence?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;We can measure intelligence as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;the number of CPU cycles necessary to solve a problem. Less is better.&lt;/li&gt;&#xA;&lt;li&gt;the amount of energy spent by a system to solve a problem. Less is better.&lt;/li&gt;&#xA;&lt;li&gt;the time necessary to solve a problem. Less is better.&lt;/li&gt;&#xA;&lt;li&gt;the space (memory, RAM, atoms) necessary to solve a problem. Less is better.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The benefit of all those measurements is that they are scalar and thus ordinal, creating an order between the different agents that can successfully solve the problem.&lt;/p&gt;&#xA;&lt;p&gt;Those values can be taken separately as one axis of intelligence. Taken together, they become a complex measurement of intelligence where there&amp;rsquo;s no clear ordering between the different approaches. The agent with the &amp;ldquo;highest intelligence&amp;rdquo; is defined by the requirements of the environment: if energy sources are abundant in the environment, then using little energy is less important than using less time or space.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/intelligence/&#34; &gt;Intelligence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Omnifocus &#34;ofocus&#34; format</title>
      <link>https://tomrochette.com/problems/2020/02/20/</link>
      <pubDate>Thu, 20 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/20/</guid>
      <category>problems</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use Omnifocus but I&amp;rsquo;d like to have access to the underlying data and use it in another application. How can I do that?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The first step to solve this problem is figuring out if we can access the underlying data easily. Sometimes we&amp;rsquo;re lucky and the data is just a single file with the data in a format that we need to manipulate a little. In other cases, like for the ofocus format, files are organized in a single directory that contains zip archives. Unzipping some of those files we can observe there are two kinds: a master file and many transaction files. By playing around a bit with Omnifocus, we can make all the transactions files disappear, effectively merging them into the master file.&lt;/p&gt;&#xA;&lt;p&gt;The next step is to look at the content of the master file. This file contains most of what we would expect to find when we use Omnifocus, namely contexts, folders and tasks. By inspecting multiple copies of the same type of entry it is possible to collect the different attributes that constitute them and whether some are optional while others are always present.&lt;/p&gt;&#xA;&lt;p&gt;When I tried to reverse-engineer the format of ofocus files, I used my own database which contained many entries. This allowed me to quickly find most of the attributes of each type of entry. Another approach would&amp;rsquo;ve been to start with a clean database and to create each of the types of entry and create two variants: one with all the attributes defined, the other one with the least amount of attributes necessary.&lt;/p&gt;&#xA;&lt;p&gt;Once the structure of those entries is identified, it is not too difficult to use reasoning to determine from where certain values come from. In some cases, values are references to other entries, similar to how you would have foreign keys in a database.&lt;/p&gt;&#xA;&lt;p&gt;With all this knowledge now available to us, it is easy to simply convert the XML file into a JSON file. Once the data is available in JSON, it&amp;rsquo;s slightly easier to work with it in PHP than using XML. By understanding the structure and relationships within the data, it is possible to make use of this data to build your own application that would reproduce the hierarchy of folders/tasks that are displayed inside Omnifocus.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/ofocus-format&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/ofocus-format&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing one article per day</title>
      <link>https://tomrochette.com/questions/2020/02/20/</link>
      <pubDate>Thu, 20 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/20/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the benefits of writing one article per day?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The main benefit I get from writing at least one article per day is that it forces me to spend time to think about a single question and to write down and express my thoughts clearly.&lt;/p&gt;&#xA;&lt;p&gt;It allows me to practice my writing abilities, even though I use them daily to write down notes. It forces me to ask myself whether my grammar is correct and whether what I wrote makes sense, which is something I care a lot less about when I write down notes.&lt;/p&gt;&#xA;&lt;p&gt;It lets me get into the habit of writing daily, so that writing and communicating doesn&amp;rsquo;t feel like it requires a lot of energy.&lt;/p&gt;&#xA;&lt;p&gt;I see writing one article per day as a habit to acquire in order to be able to write more effectively and communicate better. It is like exercising regularly. The purpose is to keep the muscle of writing alive and strengthening it slowly over time. By writing a lot we slowly acquire a voice that we can work to change and improve. Just like processes that are made explicit can be improved, so can communication be improved by spending time to write down what you want to share with others.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>PHP semantic versioning checker</title>
      <link>https://tomrochette.com/problems/2020/02/19/</link>
      <pubDate>Wed, 19 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/19/</guid>
      <category>problems</category><category>php</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I use &lt;a href=&#34;https://semver.org/&#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=semver.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;semantic versioning 2.0.0&lt;/a&gt; for my PHP libraries and I&amp;rsquo;d like to know when I generate breaking changes to my code. I would like to have a tool that tells me when that happens, as soon as possible so I can avoid creating backward-incompatible changes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In 2015 I was working on a lot of PHP code and releasing various libraries as well as using a lot of libraries which were not always respecting the semantic versioning 2.0.0 rules. I understood that it was difficult to keep track of all the changes done to a codebase and that you needed a certain level of expertise to tell what kind of semantic versioning impact changes had. I knew that most of the semantic versioning rules however were rules that could be codified such that you could run a program that would look at a before and after snapshot of a piece of code and tell you how it changed. Those changes could then be categorized according to what they changed, and based on the semantics of semantic versioning, a semantic versioning change could be generated for the code change itself.&lt;/p&gt;&#xA;&lt;p&gt;Thus &lt;a href=&#34;https://github.com/tomzx/php-semver-checker&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PHP Semantic Versioning Checker&lt;/a&gt; was born. It analyzes a before and after snapshot of a directory of source code and generates a report of all the changes that occurred. It is then possible to review all the changes by their type (class, function, method, trait, interface) and their semantic impact (major, minor, patch, none). It also computes a suggested versioning change, which is the highest semantic impact found amongst the different types inspected.&lt;/p&gt;&#xA;&lt;p&gt;I hope that this library and the concept of scanning source code for semantic versioning changes becomes more mainstream, such that every project runs this kind of tool as part of their CI pipeline.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/php-semver-checker&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/php-semver-checker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reading one Wikipedia article per day</title>
      <link>https://tomrochette.com/questions/2020/02/19/</link>
      <pubDate>Wed, 19 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/19/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the benefits of reading one Wikipedia article per day?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;From my experience so far with reading one Wikipedia article per day, I&amp;rsquo;ve enjoyed learning about topics I had not looked into for a long time.&lt;/p&gt;&#xA;&lt;p&gt;I find biology, and more specifically genetics, highly interesting from a programmer&amp;rsquo;s perspective because I see DNA as code and it makes me wonder how Nature developed this code.&lt;/p&gt;&#xA;&lt;p&gt;I also find astronomy and everything related with space (space travel, planets, organization of space) also deeply interesting because I rarely spend any time thinking about it, yet I used to watch a lot of TV shows on parallel universes, string theory, etc. which I found fascinating.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve spent some time reading on statistics as well since it is a tool I use daily at work and I think it is important that I master it as much as possible. Wikipedia allows me to explore and discover new topics that are related to statistics, something which might be a lot more difficult to do by simply reading books.&lt;/p&gt;&#xA;&lt;p&gt;I think that as long as you add variety in what you read, Wikipedia will provide you with a lot of information and additional references that might be interesting to investigate.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Anki recorder</title>
      <link>https://tomrochette.com/problems/2020/02/18/</link>
      <pubDate>Tue, 18 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/18/</guid>
      <category>problems</category><category>anki</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;m learning a language using Anki flash cards and I&amp;rsquo;d like to record my progress over time. I&amp;rsquo;d like to be able to hear what I sounded like when I started learning.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In 2017 I started learning Chinese. It was quite difficult for me given that I had very little prior experience with Asian languages, other than learning a bit of Japanese through a Rosetta Stone program where I couldn&amp;rsquo;t figure out what they wanted me to learn based on images alone (they were trying to teach me color, but it was not obvious).&lt;/p&gt;&#xA;&lt;p&gt;I imported the Memrise Mandarin Chinese flashcards level 1, 2 and 3 through the use of an Anki extension (&lt;a href=&#34;https://github.com/wilddom/memrise2anki-extension&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/wilddom/memrise2anki-extension&lt;/a&gt;) and I started my journey to learn. After practicing for a few weeks, I started being interested to have some form of recording of my progress, so I thought I could simply record my voice when I was asked to recall a word. Anki already had a recorder as part of its features so I simply piggy-backed on it to implement an Anki extension which I called the &lt;a href=&#34;https://github.com/tomzx/anki-recorder&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Anki recorder&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When a new card is shown to you, the recorder starts right away. As you recall the word, you have to pronounce it. Once you&amp;rsquo;ve said the word, you can then check if you were correct or not, at which point the recording is stopped. Each record is timestamped, which allows you to listen to any of the words over time. It&amp;rsquo;s rather funny to listen to yourself when you started learning a language and how you sound a few years later.&lt;/p&gt;&#xA;&lt;p&gt;With this tool I was able to record over 193k audio samples over 3 years. There&amp;rsquo;s a good chunk of those records that is only silence because it would also be triggered on cards with text only (where you had to remember how to write the word, or what the word meant).&lt;/p&gt;&#xA;&lt;p&gt;Hopefully this tool can allow you to record your language learning progression and have fun after a few months of practice!&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/anki-recorder&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/anki-recorder&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Tracking my readings</title>
      <link>https://tomrochette.com/questions/2020/02/18/</link>
      <pubDate>Tue, 18 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/18/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why do I track how much time I read and how many pages I&amp;rsquo;ve read?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;It allows me to have an idea of how long a book will take me to read. It also allows me to determine over time if I&amp;rsquo;m getting slower or faster reading books by using a website like &lt;a href=&#34;https://howlongtoread.com/&#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=howlongtoread.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How Long to Read&lt;/a&gt;. While the website says that reading a book such as &lt;a href=&#34;https://howlongtoread.com/books/191142/Deaths-End&#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=howlongtoread.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Liu Cixin&amp;rsquo;s Death&amp;rsquo;s End&lt;/a&gt; should take 10h to read to the average reader at 300 WPM, it took me more than 20h to read it, which means I&amp;rsquo;m a very slow reader and that I read at less than 150 WPM.&lt;/p&gt;&#xA;&lt;p&gt;The benefit of knowing how long a book will take me to read is that I can decide if I want to actually spend that time finishing the book or not. When a book is good, this question is not considered, but when it is bad, it is important to decide whether spending more time is a worthwhile use of my time.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>PHP code coverage verifier</title>
      <link>https://tomrochette.com/problems/2020/02/17/</link>
      <pubDate>Mon, 17 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/17/</guid>
      <category>problems</category><category>php</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I wrote some new code or edited code in my PHP application and I&amp;rsquo;d like to know if this change is covered by tests.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The approach I thought of to solve this problem was to write your change, run your tests (most likely using PHPUnit), then create a diff/patch of those changes and use this information to determine whether the lines that are part of the diff are covered. It should be relatively straightforward to automate the process of generating a patch from within a git repository as well as running PHPUnit within a project&amp;rsquo;s directory (generating a &lt;code&gt;clover.xml&lt;/code&gt; report). With this information in hand, it would be possible for a script to compute what is and isn&amp;rsquo;t covered by tests in the changes that you are about to commit.&lt;/p&gt;&#xA;&lt;p&gt;I wrote &lt;a href=&#34;https://github.com/tomzx/php-code-coverage-verifier&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PHP Code Coverage Verifier&lt;/a&gt; which takes care of reading the PHPUnit output (a &lt;code&gt;clover.xml&lt;/code&gt; file) and a generated patch file and produce a report of the lines that are and aren&amp;rsquo;t covered.&lt;/p&gt;&#xA;&lt;p&gt;An example of the script output is as follow:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;php vendor/bin/php-code-coverage-verifier verify my-clover.xml my-diff.patch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Using clover-xml file: my-clover.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;With diff file: my-diff.patch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Covered:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/admin/stocks.php line 15 - 21&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/admin/stocks.php line 91 - 97&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/search.php line 26 - 32&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/search.php line 376 - 384&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;model/user.php line 34 - 41&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;model/user.php line 44 - 51&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Not covered:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/account.php line 39 - 45&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/admin/stocks.php line 27 - 33&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/search.php line 36 - 42&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;controller/search.php line 187 - 193&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;model/user.php line 533 - 540&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ignored:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;application/composer.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Coverage: 40 covered (56.338%), 31 not covered (43.662%)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/php-code-coverage-verifier&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/php-code-coverage-verifier&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Questions and problems articles writing process</title>
      <link>https://tomrochette.com/questions/2020/02/17/</link>
      <pubDate>Mon, 17 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/17/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do I write my questions and problems articles?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The process I use to write both my &lt;a href=&#34;https://tomrochette.com/questions/&#34; &gt;questions articles&lt;/a&gt; and my &lt;a href=&#34;https://tomrochette.com/problems/&#34; &gt;problems articles&lt;/a&gt; is quite similar, so I will summarize both in this article.&lt;/p&gt;&#xA;&lt;p&gt;The process is as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Find the question or problem to cover.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;To find questions, I will look at the notes I have taken in the past and search for question marks. I answer those questions as a way to stimulate my brain to think about questions I may rarely have the time to answer.&lt;/li&gt;&#xA;&lt;li&gt;To find problems, I will look at my GitHub repositories. When I encounter a problem at work, I try to write it down so I can describe the issue in more details, which may hopefully help someone in a similar situation in the future.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Think about the question or problem for a little while, to see what I can come up with.&lt;/li&gt;&#xA;&lt;li&gt;Write a list of items that I want to cover, this acts as my plan.&lt;/li&gt;&#xA;&lt;li&gt;Describe the items in the list in more details.&lt;/li&gt;&#xA;&lt;li&gt;Reference articles I&amp;rsquo;ve already written on the same topic.&lt;/li&gt;&#xA;&lt;li&gt;Review the article using LLMs for grammatical mistakes and typos.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Chrome tabs count</title>
      <link>https://tomrochette.com/problems/2020/02/16/</link>
      <pubDate>Sun, 16 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/16/</guid>
      <category>problems</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;m a tab hoarder and I would like to keep my tab count under control. How do I do that?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In January 2015 I wrote an extension for Chrome that allowed me to track how many tabs I had open. I called it the &lt;a href=&#34;https://github.com/tomzx/chrome-tabs-count&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Chrome tabs count extension&lt;/a&gt;. It displays the number of currently opened tabs in the extension bar and when you click on the extension button itself, a chart is displayed with shows the tabs and windows count at each point a tab was opened/closed. This allows you to see the patterns of tabs creation/closing you have.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Chrome tabs count screenshot&#34;&#xA;    width=&#34;768&#34;&#xA;    height=&#34;425&#34;&#xA;    src=&#34;https://tomrochette.com/problems/2020/02/16/images/screenshot.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/problems/2020/02/16/images/screenshot.png 800w, https://tomrochette.com/problems/2020/02/16/images/screenshot.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/problems/2020/02/16/images/screenshot.png&#34;&gt;&lt;/figure&gt;&#xA;&lt;p&gt;Such a tool will not help you reduce your tab count, but awareness is the first step toward reducing the number of tabs you have open at all times.&lt;/p&gt;&#xA;&lt;p&gt;The second step is to taper (slowly reduce) the number of tabs you have open at all times. My strategy has been to reduce by 10 tabs each week the maximum number of tabs I had open. I started with over 160 tabs and I am now at 100 tabs after 6 weeks. I use the &lt;a href=&#34;https://play.google.com/store/apps/details?id=org.isoron.uhabits&#34;&gt;Loop Habit Tracker&lt;/a&gt; app to set up a daily reminder to make sure my tabs count is under the limit specified for this week and I try as hard as possible to finish the day with the number of tabs open below or at this limit.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/chrome-tabs-count&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/chrome-tabs-count&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How to lead a large AGI company</title>
      <link>https://tomrochette.com/questions/2020/02/16/</link>
      <pubDate>Sun, 16 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/16/</guid>
      <category>questions</category><category>artificial-general-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How would you lead an AGI company with 100,000 employees?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I would separate the employees into multiple smaller companies, as large companies are difficult to wield. Furthermore, I think that it is useful for different companies to work on the same problem using different approaches, which is something I would promote. I see the need for a variety of positions:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(30%) Tooling and core technologies: Building tools that are used by other employees to make progress (visualization, compilation, hardware, database, network). (Bachelor/Master/PhD)&lt;/li&gt;&#xA;&lt;li&gt;(25%) Applied research: Put the results of fundamental research into application in a variety of products. (Master/PhD)&lt;/li&gt;&#xA;&lt;li&gt;(15%) Fundamental research: Work on scientific theories in order to improve our understanding of intelligence, learning, doing science, solving problems, programming, etc. (Master/PhD)&lt;/li&gt;&#xA;&lt;li&gt;(15%) IT: Deal with infrastructure management and scaling. (Bachelor/Master/PhD)&lt;/li&gt;&#xA;&lt;li&gt;(5%) Management: Ensuring that work is going in a specific direction and is not a random walk. (Bachelor/Master/PhD)&lt;/li&gt;&#xA;&lt;li&gt;(5%) Data collector: Acquire data necessary for experiments done by fundamental researchers and applied research scientists. (Bachelor)&lt;/li&gt;&#xA;&lt;li&gt;(5%) Administrative/HR/Facility management: Deal with business related tasks such as people management, facility management/maintenance, etc. (Bachelor)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/agi/comments/aa18gn/thought_experiment_how_would_you_lead_an_agi/&#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=www.reddit.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.reddit.com/r/agi/comments/aa18gn/thought_experiment_how_would_you_lead_an_agi/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Healthy software company</title>
      <link>https://tomrochette.com/questions/2020/02/15/</link>
      <pubDate>Sat, 15 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/15/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the signs of a healthy software company?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The following signs are defined assuming a web development software company.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Projects are completed on time and under budget.&lt;/li&gt;&#xA;&lt;li&gt;Development is supported by continuous integration practices.&lt;/li&gt;&#xA;&lt;li&gt;Tests are written for the code developed.&lt;/li&gt;&#xA;&lt;li&gt;The different stages of development are not rushed so that coding happens as soon as possible.&lt;/li&gt;&#xA;&lt;li&gt;Projects are put in production and monitored.&lt;/li&gt;&#xA;&lt;li&gt;Events requiring intervention in production are handled without the presence of a large amount of stress.&lt;/li&gt;&#xA;&lt;li&gt;Employees have time to share their knowledge of the codebase with one another.&lt;/li&gt;&#xA;&lt;li&gt;Code is reviewed before being merged into the master branch.&lt;/li&gt;&#xA;&lt;li&gt;Version control is used.&lt;/li&gt;&#xA;&lt;li&gt;Processes are documented, followed, and updated when necessary.&lt;/li&gt;&#xA;&lt;li&gt;Traceability is possible from clients&amp;rsquo; requests to their deployment in a live environment.&lt;/li&gt;&#xA;&lt;li&gt;Most of the system has been designed beforehand and only minor sections of the design need to be updated during the sprint iterations.&lt;/li&gt;&#xA;&lt;li&gt;Priorities have been established and are well documented.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/&#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=www.joelonsoftware.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;The Joel Test&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Photo geolocation</title>
      <link>https://tomrochette.com/problems/2020/02/15/</link>
      <pubDate>Sat, 15 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/15/</guid>
      <category>problems</category><category>tool</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I have taken a lot of pictures and I&amp;rsquo;d like to see where they were taken on a map. I also don&amp;rsquo;t want to have to upload those pictures to a server or download some software.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve developed a simple tool called &lt;a href=&#34;https://tomzx.github.io/photo-geolocation/&#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=tomzx.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Photo geolocation&lt;/a&gt; which is a small client-side application. It uses &lt;a href=&#34;https://leafletjs.com/&#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=leafletjs.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;leaflet&lt;/a&gt; to display the images on an &lt;a href=&#34;https://www.openstreetmap.org/&#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=www.openstreetmap.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OpenStreetMap map&lt;/a&gt;. The EXIF image metadata is extracted from the image by reading the image data using &lt;a href=&#34;https://github.com/exif-js/exif-js&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;exif.js&lt;/a&gt;. From the EXIF image metadata we extract the GPS coordinates, which are then used to place a pin on the map at the appropriate location. It is possible to click on the pin to see what picture was taken at the provided location.&lt;/p&gt;&#xA;&lt;p&gt;To use the tool, simply go to the website and drag and drop your images on the page. The images will be read by your browser, the EXIF image metadata read directly by the browser (nothing being sent to a server). The images with GPS coordinates will have a pin displayed on the map at the location they were taken, while those that do not have GPS coordinates will be simply logged to the browser console and not displayed.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomzx.github.io/photo-geolocation/&#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=tomzx.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://tomzx.github.io/photo-geolocation/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Keeping a site up to date while highlighting changes</title>
      <link>https://tomrochette.com/questions/2020/02/14/</link>
      <pubDate>Fri, 14 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/14/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can you keep a website up to date and yet have previous visitors recognize new content as fast as possible?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;As I am a developer, what is the most straightforward answer to this problem is to use a tool such as diff. When I write articles on my blog, I use Visual Studio Code which I have configured to save on window getting out of focus (or the current tab of the editor being changed). With this save event, I also create a git commit automatically with a very boring message &amp;ldquo;Automated save from VS Code.&amp;rdquo;. The point is not to have a fancy commit message, but to have a trace of when the changes where made. This allows me to offer to my visitors the ability to view the history of changes that were done to an article.&lt;/p&gt;&#xA;&lt;p&gt;The downside to this approach is that it is not very easy to diff the article between two versions using the github web UI. It requires manually playing around the url, to provide the base and latest article SHA1 hash and to find the article in the list of files changed, which makes the experience rather painful and likely to lead nobody to do it.&lt;/p&gt;&#xA;&lt;p&gt;Given that the git repository is available on my server where the blog is hosted, it would be possible for me to run a &lt;code&gt;git diff&lt;/code&gt; command provided the last version seen by the visitor. This would allow me to present the changes that were done since the visitor last came. For instance, removal of sentences would be simply not displayed as removed since it is likely to be irrelevant to the visitor, however new sentences would be highlighted in green.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Vocabulary gradient</title>
      <link>https://tomrochette.com/problems/2020/02/14/</link>
      <pubDate>Fri, 14 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/14/</guid>
      <category>problems</category><category>tool</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I write a lot of articles and I want them to be understood by most people. How do I use the most common language possible?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My approach is to write whatever I want to write about using whatever language I come up with first. Then I use a tool I&amp;rsquo;ve developed which I&amp;rsquo;ve called the &lt;a href=&#34;https://github.com/tomzx/vocabulary-gradient&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;vocabulary gradient&lt;/a&gt;. It is a very simple tool where you will generally copy and paste the article you&amp;rsquo;ve written and look at the result of the analysis. The tool uses a word frequency list as specified in the README.md. This list was built using the Project Gutenberg library, which makes the word frequency list a bit outdated.&lt;/p&gt;&#xA;&lt;p&gt;The report generated by the tool presents the minimum, average, maximum and standard deviation of the index of the words used in the text you provided. Those numbers give you a rough overview of the difficulty of your text based on word frequency alone. The lower your average and maximum is, the simpler the article should be to understand An histogram is also generated, where the bins are based again on the index of the word in the frequency list. Finally, the provided text is rendered with each word index as a subscript. Words that are unknown are highlighted in yellow, while words for which the index is high are shaded with a darker shade of gray as their index increases.&lt;/p&gt;&#xA;&lt;p&gt;With this information in hand, you can spot the words that have high word frequency indexes and try to replace them with lower index words.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/vocabulary-gradient&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/vocabulary-gradient&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Data anonymizer</title>
      <link>https://tomrochette.com/problems/2020/02/13/</link>
      <pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/13/</guid>
      <category>problems</category><category>data</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I want my clients to share with me confidential data without revealing what the exact values are so that I can train machine learning models on this data.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I wrote &lt;a href=&#34;https://github.com/tomzx/data-anonymizer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;a simple python package&lt;/a&gt; that uses &lt;a href=&#34;https://pandas.pydata.org/&#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=pandas.pydata.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pandas&lt;/a&gt; and &lt;a href=&#34;https://scikit-learn.org/stable/&#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=scikit-learn.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;scikit-learn&lt;/a&gt; to apply some simple transforms to the data. Some transforms that are applied to the dataset can change the distribution of the data, changing its statistical properties, while others preserve them but simply rescale the domain.&lt;/p&gt;&#xA;&lt;p&gt;Given an anonymizer dataset using this tool, it is possible to do a preliminary data audit and possibly train machine learning models on the data to give a quick idea to clients whether their data looks promising or not without actually revealing the true numbers (except if desired).&lt;/p&gt;&#xA;&lt;p&gt;The main concern with this approach is that most clients are not technical, and thus having them anonymize their data is generally not easy, if not impossible. Thus it means that such a tool is currently not applicable in the desired context.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/data-anonymizer&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/tomzx/data-anonymizer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Good execution of a project through consensus instead of leadership</title>
      <link>https://tomrochette.com/questions/2020/02/13/</link>
      <pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/13/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can a project be well executed through consensus instead of leadership?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;To properly execute a project without a leader that makes important decisions, time is one of the most critical components. Without enough time, decisions are not consensus but decisions made by the individuals available at the time the decision is required. It is also important not to rush things as it will simply lead to bigger and bigger mistakes happening more and more quickly. At one point a few or many team members will realize they&amp;rsquo;ve moved too far too fast and many of the necessary pieces are missing, which makes the work they&amp;rsquo;ve done so far either irrelevant or of low value.&lt;/p&gt;&#xA;&lt;p&gt;The team members also need to know each other well enough to know their strengths and weaknesses. Without this knowledge, weaknesses are often ignored because they are the weaknesses of everyone.&lt;/p&gt;&#xA;&lt;p&gt;Decisions need to be reviewed regularly to ensure consistency. Since there is no single leader that keeps the project in their head and wants to see it to completion, it is necessary to ensure that the work that is planned and executed is consistent towards a common vision. Not doing so can lead the team to work on features that go in opposite directions, features that are not aligned with the users the project targets. Acceptable moments to review those decisions are during the planning sessions and the review/demo sessions.&lt;/p&gt;&#xA;&lt;p&gt;Team members should often work in pairs with a different individual in the team to ensure that their understanding of the project gets discussed with different individuals with different positions. This avoids working with the same person that shares your opinion of the work to be done, while some other individuals may completely disagree with this opinion. Surfacing such differences of opinion early in the development process is critical since it can lead to work that is not aligned with the project.&lt;/p&gt;&#xA;&lt;p&gt;Overall, we want to reduce as much as possible the time between the moment an individual or group of individuals have an incorrect understanding of the project&amp;rsquo;s goals and the correction of their understanding.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doist.com/blog/asynchronous-communication/&#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=doist.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Asynchronous Communication: The Real Reason Remote Workers Are More Productive&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Measuring success</title>
      <link>https://tomrochette.com/questions/2020/02/12/</link>
      <pubDate>Wed, 12 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/12/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How will you measure your success over the next year?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Over the past few years success for me has been defined less by goals and more by being able to work continuously on a process. For example, I might want to get better at writing. My goal is not something like &amp;ldquo;write one technical book by the end of 2020&amp;rdquo; but rather &amp;ldquo;write technical content daily&amp;rdquo;. This decreases the pressure and the need to perform while allowing me to do what I want.&lt;/p&gt;&#xA;&lt;p&gt;I feel happier and more successful when I can keep doing the same thing over and over, even though I may have no motivation. It shows me that it&amp;rsquo;s possible to accomplish pretty much anything, as long as you&amp;rsquo;re willing to put in the effort.&lt;/p&gt;&#xA;&lt;p&gt;Because I evaluate success this way, it is easy for me to track if I&amp;rsquo;m successful. I use the &lt;a href=&#34;https://play.google.com/store/apps/details?id=org.isoron.uhabits&#34;&gt;Loop Habit Tracker&lt;/a&gt; (an android app) to track whether I&amp;rsquo;ve worked on something I told myself I wanted to improve. My list started small and contained very mundane things such as &amp;ldquo;Bed is done&amp;rdquo;, &amp;ldquo;Empty table&amp;rdquo;, &amp;ldquo;No dirty dishes&amp;rdquo; and started including more and more habits, such as &amp;ldquo;Read 1 wikipedia article&amp;rdquo;, &amp;ldquo;Answer 1 problem&amp;rdquo; and &amp;ldquo;Answer 1 question&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Being able to keep a good habit is what defines success to me. With the help of the app I&amp;rsquo;m able to add more and more habits without forgetting the previous ones since I&amp;rsquo;m reminded to do them at the desired weekly frequency.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Visual Studio Code Run Me extension</title>
      <link>https://tomrochette.com/problems/2020/02/12/</link>
      <pubDate>Wed, 12 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/12/</guid>
      <category>problems</category><category>visual-studio-code</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I frequently run the same commands with different parameters but I have a terrible memory. I also use Visual Studio Code a lot.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I developed an extension in 2018 called &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tomzx.run-me&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Run Me&lt;/a&gt; whose goal is to allow you to define commands that you can customize through a form, which is a series of questions that will be asked to you, before launching the command with the parameters you provided.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve used it to do all kinds of things, from launching &lt;a href=&#34;https://obsproject.com/&#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=obsproject.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;OBS&lt;/a&gt; to resetting the Windows 7 visuals when it lowers them down due to low memory. I also use it to automate various tasks such as creating new articles using a template, opening my buffer document that I use on a daily basis to write notes and more.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s an example of my configuration file which I use to start OBS and to reset the Windows 7 visuals.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;run-me&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;commands&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;identifier&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;start_obs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Start OBS x64&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;\&amp;#34;C:\\Program Files (x86)\\obs-studio\\bin\\64bit\\obs64.exe\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;working_directory&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:\\Program Files (x86)\\obs-studio\\bin\\64bit&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;identifier&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_visuals&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Reset W7 visuals&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;sc stop uxsms &amp;amp; sc start uxsms&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tomzx.run-me&#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=marketplace.visualstudio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Visual Studio Marketplace - Run Me extension&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/vscode-run-me&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Github repository - Run Me extension&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Knowing what your users need without having users</title>
      <link>https://tomrochette.com/problems/2020/02/11/</link>
      <pubDate>Tue, 11 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/11/</guid>
      <category>problems</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I need to know what the users of my library need, but I don&amp;rsquo;t have any users yet. What should I do?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When you are defining who your target audience is, it can be rather difficult to decide who your users will be. If you&amp;rsquo;ve been building capabilities in a certain domain for a while and can solve specific problems with those capabilities, then you will likely want to look for users that may have those problems. You may even end up creating personas or prototypical users who have the problems that your library might solve.&lt;/p&gt;&#xA;&lt;p&gt;Once you&amp;rsquo;ve established those prototypical users, you should try to find them in person and confirm your assumptions. You do not want to be building features that they don&amp;rsquo;t need. In the event you cannot get access to any real users, you can still make use of user proxies. User proxies are people that can somewhat act as the true end-users, but are not the true end-users, so that you have to be careful about what they tell you they need since it is likely to be biased by their actual position. Some potential user proxies are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The users&amp;rsquo; manager&lt;/li&gt;&#xA;&lt;li&gt;Salespeople&lt;/li&gt;&#xA;&lt;li&gt;Domain experts&lt;/li&gt;&#xA;&lt;li&gt;Former users&lt;/li&gt;&#xA;&lt;li&gt;Customers&lt;/li&gt;&#xA;&lt;li&gt;Trainer and technical support&lt;/li&gt;&#xA;&lt;li&gt;Business or system analysts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In User Stories Applied: For Agile Software Development, Mike Cohn suggests to use more than one user proxy to mitigate the bias from any specific user proxy. Make sure that the user proxies are of different types. This technique is comparable to using ensembling in machine learning.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/3856.User_Stories_Applied&#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=www.goodreads.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;User Stories Applied: For Agile Software Development&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Productive meetings</title>
      <link>https://tomrochette.com/questions/2020/02/11/</link>
      <pubDate>Tue, 11 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/11/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What does a productive meeting look like?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;There are a few people invited, less than 6 ideally. Everyone invited knows why they are in the meeting and will contribute to the discussion.&lt;/p&gt;&#xA;&lt;p&gt;An agenda for the meeting has been set, with a pre-determined amount of time for each item on the agenda. One person is responsible to make sure that the agenda is followed and that the time is respected.&lt;/p&gt;&#xA;&lt;p&gt;Notes are taken by the different individuals that are part of the meeting.&lt;/p&gt;&#xA;&lt;p&gt;Items that appear to require more discussion than anticipated are noted and the involved individuals may spend additional time outside of the meeting to make their point, either through another meeting or by writing a document explaining their position.&lt;/p&gt;&#xA;&lt;p&gt;A list of actionable items is defined at the end of the meeting and responsibles are assigned to those items. Deadlines are also assigned to those items so that people can expect those items to be completed by the defined date.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/meetings/&#34; &gt;Meetings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>AST in python</title>
      <link>https://tomrochette.com/problems/2020/02/10/</link>
      <pubDate>Mon, 10 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/problems/2020/02/10/</guid>
      <category>problems</category><category>software-development</category><category>python</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Problem&#xA;    &lt;div id=&#34;problem&#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;#problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I want to analyze a python script to extract something from it. How do I do that?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Solution&#xA;    &lt;div id=&#34;solution&#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;#solution&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Python has an &lt;a href=&#34;https://en.wikipedia.org/wiki/Abstract_syntax_tree&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;abstract syntax tree&lt;/a&gt; like most programming language.&lt;/p&gt;&#xA;&lt;p&gt;You can use the &lt;a href=&#34;https://docs.python.org/3/library/ast.html&#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.python.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;ast module&lt;/a&gt; to parse a string that contains the code you want to analyze.&lt;/p&gt;&#xA;&lt;p&gt;A simple example is as follow. It will read a file defined in the &lt;code&gt;file&lt;/code&gt; variable, use &lt;code&gt;ast&lt;/code&gt; to parse it, returning a &lt;code&gt;tree&lt;/code&gt; that can then be traversed using the &lt;a href=&#34;https://refactoring.guru/design-patterns/visitor&#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=refactoring.guru&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;visitor pattern&lt;/a&gt;. Defining visitors lets you separate the responsibility of each of them, making the code that analyzes code easier to understand.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;ast&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ClassVisitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ast&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NodeVisitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;visit_ClassDef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;c1&#34;&gt;# Do some logic specific to classes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generic_visit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;FunctionVisitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ast&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NodeVisitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;visit_FunctionDef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;c1&#34;&gt;# Do some logic specific to functions&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generic_visit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;visitors&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;ClassVisitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;FunctionVisitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ast&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;visitor&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;visitors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;visitor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://greentreesnakes.readthedocs.io/en/latest/index.html&#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=greentreesnakes.readthedocs.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://greentreesnakes.readthedocs.io/en/latest/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Working on the most important task</title>
      <link>https://tomrochette.com/questions/2020/02/10/</link>
      <pubDate>Mon, 10 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/10/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why aren&amp;rsquo;t we always working on the most important task?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;For bad reasons:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;We don&amp;rsquo;t want to work on the most important task.&lt;/li&gt;&#xA;&lt;li&gt;The most important task feels overwhelming.&lt;/li&gt;&#xA;&lt;li&gt;The most important task seems too risky.&lt;/li&gt;&#xA;&lt;li&gt;The most important task doesn&amp;rsquo;t seem fun to work on.&lt;/li&gt;&#xA;&lt;li&gt;We want to work on fun tasks, not hard tasks.&lt;/li&gt;&#xA;&lt;li&gt;We want to work on what interests us, not what provides the most value.&lt;/li&gt;&#xA;&lt;li&gt;We think that the task we&amp;rsquo;re working on is more important, but it isn&amp;rsquo;t.&lt;/li&gt;&#xA;&lt;li&gt;We don&amp;rsquo;t know how to solve the most important task.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For acceptable reasons:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;We don&amp;rsquo;t know what is the most important task at the moment.&lt;/li&gt;&#xA;&lt;li&gt;We don&amp;rsquo;t understand what is important to our clients.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For good reasons:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The most important task has prerequisites that need to be completed before it can be done.&lt;/li&gt;&#xA;&lt;li&gt;The most important task is being done by someone else already.&lt;/li&gt;&#xA;&lt;li&gt;The importance of tasks is likely to change soon due to a change in objectives.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>When to abandon pull requests</title>
      <link>https://tomrochette.com/questions/2020/02/09/</link>
      <pubDate>Sun, 09 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/09/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When is it appropriate to abandon a pull request?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Assuming that this is in a business context, you should abandon working on a pull request if getting the pull request merged is taking away too much time from others and it requires a lot of additional changes, creating a lot of back and forth between the creator and the reviewers.&lt;/p&gt;&#xA;&lt;p&gt;You should abandon it if the feature/bug it fixes is not important enough compared to other more important ones. One should always work on the most important task rather than to work on tasks of lower importance. Furthermore, working on low importance pull requests will also &amp;ldquo;force&amp;rdquo; your coworkers to review those low importance pull requests, reducing the overall productivity. As such, always think of the impact you will have on others.&lt;/p&gt;&#xA;&lt;p&gt;Many developers often think that bugs are of the utmost importance and should be fixed as soon as possible. However, implementing a good fix might require a lot of effort on the part of the person that will fix the issue, as well as a good amount of effort on the part of the reviewers which could have spent their time on features or bugs that are more important. Like anything else, bugs should be prioritized based on how important they are, not just that they are a bug.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reinventing the wheel</title>
      <link>https://tomrochette.com/questions/2020/02/08/</link>
      <pubDate>Sat, 08 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/08/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why do we reinvent the wheel?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;It is very common for developers to want to develop things themselves instead of reusing existing code. They prefer to know how it works so that if they need to make changes to the code, they know where to do it since they wrote it themselves. If they are lucky, they&amp;rsquo;ve been given a narrow set of initial requirements that could be fulfilled by a more complex/complete library, but they think that they can do it themselves or do it better. Thus they build themselves a &lt;a href=&#34;https://en.wikipedia.org/wiki/Reinventing_the_wheel#Related_phrases&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;square wheel&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;One of the positive sides of developing something that already exists is that you can get a good understanding of what is required without having to consider all the other parts which may be required for other use cases. You&amp;rsquo;re also free to explore the aspect of the problem that you find interesting or challenging.&lt;/p&gt;&#xA;&lt;p&gt;One of the negative sides is that if you work on your own square wheel for a while, you never end up learning a library that might prove more useful. You also do not acquire the skill of learning new libraries and their strengths/weaknesses, as well as how you could help to improve them. Sometimes however by reading an existing library you will come to the conclusion that fixing said library is likely to take you more time than writing a new one.&lt;/p&gt;&#xA;&lt;p&gt;In my experience, the main reason that has led me to write something from scratch even though I had access to code that partially did what I wanted was because:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;the library wasn&amp;rsquo;t able to sell me on the reasons I should use it instead of doing it myself, while I considered implementing the solution myself to be somewhat easy.&lt;/li&gt;&#xA;&lt;li&gt;the code (organization, style) was so messy that fixing it would require more time than rewriting it after understanding the core concepts.&lt;/li&gt;&#xA;&lt;li&gt;the library was not maintained anymore.&lt;/li&gt;&#xA;&lt;li&gt;using the library would make my workflow slower.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Reinventing_the_wheel&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Reinventing_the_wheel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Billionaire&#39;s life</title>
      <link>https://tomrochette.com/questions/2020/02/07/</link>
      <pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/07/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;If I were a billionaire, how would I live my life?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I would invest a good chunk of my money in doing research in the fields I&amp;rsquo;m interested in, namely biology, genetics, computer science, software engineering, machine learning and artificial intelligence.&#xA;I would spend my time trying defining what is the most important thing I could be working on given our current understanding and constraints in order to reach certain objectives.&#xA;I would want to get informed by the advice of the smartest people I can get.&#xA;I would pay others to help me get to my goals faster.&#xA;I would avoid having to deal with hardware constraints by simply purchasing more hardware.&#xA;I would try to trade the money I have to remove as much friction as possible in my work.&#xA;I would like to consider working on different things as having a variety of hobbies and not a variety of jobs.&#xA;I would avoid spending my time commuting.&#xA;I would eliminate the time I spend on cooking and cleaning.&#xA;I would maximize the effectiveness of my time, from the moment I wake up to the moment I go to sleep.&#xA;I would try to find ways to increase the number of people (or machines) that can help me.&#xA;I would try to find ways to make the fact that I&amp;rsquo;m a billionaire irrelevant to the accomplishment of everything I&amp;rsquo;ve stated here.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Great or acceptable software solution</title>
      <link>https://tomrochette.com/questions/2020/02/06/</link>
      <pubDate>Thu, 06 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/06/</guid>
      <category>questions</category><category>software-development</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Is it better to spend a lot of time designing a great software solution or to implement an acceptable one?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In software development, the further you go down the development pipeline, the more expensive it is to change things. Once a solution is established and is being used by other parts of the code, replacing it becomes more expensive. Thus it would make sense to spend as much time as possible planning what you&amp;rsquo;re going to develop before you develop it. Sometimes you however do not have enough information to make an informed design decision upfront and you actually need to implement something to explore and understand what will be needed to solve the problem. The exploratory implementation you do may end up being satisfactory enough that you do not see the need to redesign your solution.&lt;/p&gt;&#xA;&lt;p&gt;When you implement a solution you generally have an idea of the use cases you need to support, but sometimes certain use cases are less common and require a lot more effort to support. As such, you have the choice between implementing a solution that would support both common and uncommon use cases but would require more time, or you could implement a solution that covers the common cases. Depending on the field you are in, you will have to choose between this tradeoff.&lt;/p&gt;&#xA;&lt;p&gt;In the domains I&amp;rsquo;ve worked (game development, web development, machine learning), it has been more valuable to implement an acceptable solution that could be shown as providing value to the client vs designing a great solution until it was proven to be necessary.&lt;/p&gt;&#xA;&lt;p&gt;Always make wise use of your time and assess whether quality or quantity is needed for your software project.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Process improvement</title>
      <link>https://tomrochette.com/questions/2020/02/05/</link>
      <pubDate>Wed, 05 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/05/</guid>
      <category>questions</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do I improve my processes?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;First and foremost, to improve any process you need to start by writing the process down. All the steps or things you need to consider should be written in a document. This will allow you to review this document over time and improve it as you find ways to make the process better.&lt;/p&gt;&#xA;&lt;p&gt;When you perform the process, look at your document and see whether you are applying all of the steps you wrote down. Identify the steps that are more critical than others, in which order you complete them, how long it takes you to accomplish them, whether some steps are sometimes relevant, etc. You want to capture information about the process as you are going through it in order to identify sources of improvement. If a step takes the majority of your time in a process, ask yourself whether this is expected and whether it would be possible to optimize or automate this step in order to reduce the time spent on it.&lt;/p&gt;&#xA;&lt;p&gt;If possible, share your processes with others. Have them share with you how they would go about doing the same things you do and take notes. Some of the things that may be different between you and others are the order in which you accomplish the steps, which steps you consider critical and how much time is spent on each step.&lt;/p&gt;&#xA;&lt;p&gt;Even though some of the processes you follow on a daily basis may appear trivial to you, you might end up realizing that those processes are quite complex in nature, especially if you need to write them down.&lt;/p&gt;&#xA;&lt;p&gt;Try playing around with doing steps in parallel vs doing steps sequentially and see which one is more efficient.&lt;/p&gt;&#xA;&lt;p&gt;In order to improve your processes, you need to define what it is you want to improve. In my case, I want my processes to be efficient (doing things right) and effective (doing the right things). Compared to myself, a process is improved if I need less time to accomplish it while producing the same quality of results or if for the same amount of time I produce higher quality of results.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Fighting over code style</title>
      <link>https://tomrochette.com/questions/2020/02/04/</link>
      <pubDate>Tue, 04 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/04/</guid>
      <category>questions</category><category>programming</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why do developers fight over code style?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;We are creatures of habits. We like when our code looks like we would expect it to look and not some completely different style. When the style is too different, then it creates cognitive load, which means that we&amp;rsquo;re spending more energy than we would if the code looked the way we like it. Since we&amp;rsquo;re machines that attempt to minimize the amount of energy we spend, we see code that is not styled our way as a bad investment of our energy and that it would either be better to reformat the code our way (minimizing our energy expenditure in the future) or simply to start from scratch.&lt;/p&gt;&#xA;&lt;p&gt;As human beings, we&amp;rsquo;re able to adapt. Adapting generally requires more energy than simply using the skills we already have, and we prefer to avoid having to adapt. Thus we fight with others so that they do the effort of adapting instead of us. We see fighting as being more effective than adapting. It may be an effective approach when no existing rules exist, however, in many businesses, code standards have been established, which means that if you are a new employee, you will have to adapt to those standards. You could always try to bring back the discussion of updating the code style, but if the standards have been established a long time ago, this effort is likely to be futile.&lt;/p&gt;&#xA;&lt;p&gt;As such, even though adapting requires more of our energy, we should make that sacrifice upfront and use it on more important things, such as defining what tasks are important and which ones should be done first.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Repeating yourself</title>
      <link>https://tomrochette.com/questions/2020/02/03/</link>
      <pubDate>Mon, 03 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/03/</guid>
      <category>questions</category><category>note-taking</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;If you offload everything in your head into documents, how long does it take before you start repeating yourself?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How soon you repeat yourself will depend on how much diversity there is in your thoughts. If you always think about the same problems in the same ways, you&amp;rsquo;re likely to repeat yourself a lot. However, if you try to explore the same problems through different lenses you&amp;rsquo;ll have less chances to repeat yourself.&lt;/p&gt;&#xA;&lt;p&gt;If you spend most of your time exploring new ideas, then you may only come back to ideas you had in the past from time to time.&lt;/p&gt;&#xA;&lt;p&gt;If you work in a specialized field you may have to learn the basics multiple times in order to master them. Sometimes you will have acquired new knowledge that might challenge your existing assumptions. You will be mostly repeating yourself, but you will be making small adjustments at the same time.&lt;/p&gt;&#xA;&lt;p&gt;When we offload everything that we have in our head into documents, our goal is to have more working memory space for our current work. We want to avoid having to come back to the same topics and having to start our exploration from scratch.&lt;/p&gt;&#xA;&lt;p&gt;When we&amp;rsquo;re exploring, we want to avoid exploring the same topics without noticing. As we explore a field, we may get a sense that the field is very large and that it may take a long time to get familiar with it. By mapping the field we can get a better sense of its size while at the same time discovering the important concepts. This lets us identify when we are making use of the same concepts over and over again.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Spread of corruption</title>
      <link>https://tomrochette.com/questions/2020/02/02/</link>
      <pubDate>Sun, 02 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/02/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Should we let employees from corrupted companies apply to other companies?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I am of the opinion that it is better for corruption not to spread.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d hope that by having the (potentially) corrupted individuals join other companies, that the culture of the companies they join would prevent them from corrupting those companies. Either the corrupted individuals would have to stop being corruptors (in the future, which would be ideal), or be evicted out of the &amp;ldquo;healthy&amp;rdquo; company in order to avoid fostering this behavior.&lt;/p&gt;&#xA;&lt;p&gt;One issue with corrupted employees spreading to other companies is that it is difficult to identify them as they work in those various companies. It is possible for us to establish a blacklist of companies that exhibited bad behaviors and avoiding employing people who worked there. This approach may however punish employees that are not corrupted. As larger and larger companies exhibit behaviors that might put them on this blacklist, the number of individuals ending up on that list may be too large, reducing the pool of candidates too greatly.&lt;/p&gt;&#xA;&lt;p&gt;What companies and individuals within healthy companies need is a way to identify individuals that are likely to be corrupted or corruptible. The difficulty is however that those individuals are likely to be cunning, which means that no single technique will always succeed at identifying them.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Thoughts tracking</title>
      <link>https://tomrochette.com/questions/2020/02/01/</link>
      <pubDate>Sat, 01 Feb 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/02/01/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do I track my thoughts?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When I am on the go, I mostly rely on &lt;a href=&#34;http://keep.google.com/&#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=keep.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Google Keep&lt;/a&gt; to write down what on my mind. I use it because it loads fast, is straightforward and allows me to quickly dump my thought and go back to what I was doing. Since I&amp;rsquo;m always with my phone, it&amp;rsquo;s always within reach. It also will synchronize with Google when I&amp;rsquo;m online so it is available on any other devices. This also means that I may sometimes record things either directly from my computer, my work computer, my phone or my tablet, depending on the medium I&amp;rsquo;m using at the time (defaulting to my phone if I&amp;rsquo;m not using any device when the thought crops up).&lt;/p&gt;&#xA;&lt;p&gt;When I am at home, I&amp;rsquo;ve devised a simple system in Visual Studio Code where I use two keyboard shortcut, one that open today&amp;rsquo;s &lt;a href=&#34;https://tomrochette.com/note-taking/#my-current-system&#34; &gt;buffer&lt;/a&gt; (&lt;kbd&gt;CTRL&lt;/kbd&gt;&lt;kbd&gt;Numpad 2&lt;/kbd&gt;) and one that inserts a datetime and note id on the current line (&lt;kbd&gt;CTRL&lt;/kbd&gt;&lt;kbd&gt;Numpad 0&lt;/kbd&gt;).&lt;/p&gt;&#xA;&lt;p&gt;When I am at work, I use this same system to take notes pertaining my work. I generally try to organize my thoughts per projects so that I can go back to any specific project and re-read the notes to get back in context. I also will write down notes related to issues I&amp;rsquo;m working on and identify them using the issue ID given by JIRA.&lt;/p&gt;&#xA;&lt;p&gt;In both cases (at home and at work), I also have configured Visual Studio Code to commit automatically to git changes that are done in markdown files when the editor focus changes. This allows me to have a somewhat granular log of the changes that happen to my note files. At work, I have configured a cronjob that automatically pushes the notes to my private git repository. This allows me to pull those notes at home and read them whenever I want. I also push my personal notes to my private git repository, but I do not pull them on my work computer because I haven&amp;rsquo;t had the need for it.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/note-taking/&#34; &gt;Note taking&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Questions to think about a problem differently</title>
      <link>https://tomrochette.com/questions/2020/01/31/</link>
      <pubDate>Fri, 31 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/31/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What simple questions can be used to think about a problem differently?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve learned to solve problems by thinking about what I already knew. I would try to think of parts of the solution that might make sense and I would piece those parts together to get from the problem to the solution.&lt;/p&gt;&#xA;&lt;p&gt;While I was doing some hobbyist research on AGI, I read George Pólya classic &amp;ldquo;How to Solve It&amp;rdquo;. Pólya covers many of the questions I would ask myself implicitly, so I was glad to see that someone had taken the time to write them in a reusable format.&lt;/p&gt;&#xA;&lt;p&gt;His four steps of 1. understanding the problem, 2. devising a plan, 3. carrying out the plan and 4. looking back will lead you to ask yourself what you know and don&amp;rsquo;t know about the problem you are trying to solve. Doing so is similar to Feynman&amp;rsquo;s technique, where you attempt to teach what you know to someone else and by doing so, are discovering the parts of your explanation that needs improvement.&lt;/p&gt;&#xA;&lt;p&gt;What I liked the most about Pólya&amp;rsquo;s approach was that he was comfortable working with partial solutions. If you couldn&amp;rsquo;t figure out how to get to the end, it was still important to put forward all the tools you had at your disposition in order to attempt to solve the problem. This way you would be able to get an idea of what was lacking in your solution.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Understanding the problem&#xA;    &lt;div id=&#34;understanding-the-problem&#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;#understanding-the-problem&#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;What is not known yet?&lt;/li&gt;&#xA;&lt;li&gt;What data do you have?&lt;/li&gt;&#xA;&lt;li&gt;What conditions are there?&lt;/li&gt;&#xA;&lt;li&gt;Is it possible to satisfy all those conditions?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Devising a plan&#xA;    &lt;div id=&#34;devising-a-plan&#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;#devising-a-plan&#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;Have you seen this problem before?&lt;/li&gt;&#xA;&lt;li&gt;Have you seen a similar problem in a slightly different form?&lt;/li&gt;&#xA;&lt;li&gt;Do you know any related problems?&lt;/li&gt;&#xA;&lt;li&gt;Do you know something that could be useful to solve this problem?&lt;/li&gt;&#xA;&lt;li&gt;If you cannot solve this problem yet, can you solve a related problem?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Carrying out the plan&#xA;    &lt;div id=&#34;carrying-out-the-plan&#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;#carrying-out-the-plan&#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;Can you see clearly the steps from beginning to end?&lt;/li&gt;&#xA;&lt;li&gt;Can you prove that your approach is correct?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Looking back&#xA;    &lt;div id=&#34;looking-back&#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;#looking-back&#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;Can you check your solution?&lt;/li&gt;&#xA;&lt;li&gt;Can you get to your solution differently?&lt;/li&gt;&#xA;&lt;li&gt;Can you use your solution to solve other problems?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://furius.ca/cqfpub/doc/proofs/how-to.pdf&#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=furius.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;How To Solve It - G. Polya&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Tools I use daily and can contribute to</title>
      <link>https://tomrochette.com/questions/2020/01/30/</link>
      <pubDate>Thu, 30 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/30/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the tools I use daily that I could contribute to?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;General&#xA;    &lt;div id=&#34;general&#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;#general&#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://github.com/microsoft/vscode&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Visual Studio Code&lt;/a&gt; My text editor of choice when I don&amp;rsquo;t need an IDE. I&amp;rsquo;ve implemented a few plugins for VSC and use it daily to write personal notes as well as blog articles. I sometimes make use of its diff tool to merge changes from Sourcetree.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/JetBrains/intellij-community&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Pycharm&lt;/a&gt; My IDE of choice when I write python. Very powerful, easy to get used to if you&amp;rsquo;ve used other Jetbrains IDE (I&amp;rsquo;ve used PHPStorm for more than 5 years). Extremely useful to run a specific unit test using pytest or to debug a complex issue by putting breakpoints and investigating the internal state of the program.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/moby/moby&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Docker&lt;/a&gt; I use docker at work to containerize all of our dependencies so that it is somewhat easy to deploy what we develop in &amp;ldquo;any&amp;rdquo; environment, that is, an environment where docker (or similar, such as Kubernetes) is installed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/drone/drone&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Drone CI&lt;/a&gt; We use Drone CI at work to do continuous integration and I consider this tool to be an essential part of my daily work. When people push code to github and it fails on Drone CI, I can use this information to help them fix their issues. We also use it has part of our PR process to ensure that the PR passes all the expected tests so that we do not introduce faulty code into our master branch.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/dependabot/dependabot-core&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Dependabot&lt;/a&gt; A few months ago I had introduced dependabot into my dependency management practices. It was highly useful to get automated PRs with updates to libraries we depended on. However, since the release of poetry 1.0.0, dependabot has not been able to update my python dependencies and has been left unused. I&amp;rsquo;ve created a &lt;a href=&#34;https://github.com/dependabot/dependabot-core/pull/1621&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;PR&lt;/a&gt; which I hope will move this issue forward and get dependabot working again with poetry.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/plotly/plotly.js&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Plotly&lt;/a&gt; I used to use the highcharts plotting library until someone at work introduced me to plotly. Plotly.js is open source software and released under the MIT license, which makes it an ideal library to use in personal as well as commercial software.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Python specific&#xA;    &lt;div id=&#34;python-specific&#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;#python-specific&#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://github.com/pandas-dev/pandas&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Pandas&lt;/a&gt; I do machine learning development for a living nowadays and I depend highly on pandas. I don&amp;rsquo;t think there&amp;rsquo;s a single work day that goes by in which I don&amp;rsquo;t whip out at least one &lt;code&gt;pd.DataFrame&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/scikit-learn/scikit-learn&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Scikit-learn&lt;/a&gt; Similar to my dependency on pandas, my dependency on Scikit-learn is on a daily basis. Unlike the &lt;a href=&#34;https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyRegressor.html&#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=scikit-learn.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DummyRegressor&lt;/a&gt; documentation suggests, I use it for real problems and it&amp;rsquo;s definitely useful!&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/dask/dask&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Dask&lt;/a&gt; / &lt;a href=&#34;https://github.com/dask/distributed&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Distributed&lt;/a&gt; In order to scale both horizontally and vertically machine learning problems I&amp;rsquo;ve leaned on dask and distributed. Their use of &lt;a href=&#34;https://docs.dask.org/en/latest/delayed.html&#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.dask.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;delayed&lt;/a&gt; and &lt;a href=&#34;https://docs.dask.org/en/latest/futures.html&#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.dask.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Futures&lt;/a&gt; has made it simple to migrate simple for loops code into highly distributed tasks which can be monitored through a bokeh dashboard.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/pytest-dev/pytest&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pytest&lt;/a&gt; Who writes code without testing it? Pytest is the PHPUnit of python for me, an essential component that is used daily to ensure that code doesn&amp;rsquo;t regress more than it needs to.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/python/mypy&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;mypy&lt;/a&gt; Python typing system is pretty weak in my opinion. I miss using PHP typing system, as well as its visibility system. Mypy is similar to doing a code compilation pass and verifying that the types specified in a function signature are the types of the arguments given to that function. It is useful in order to detect mistakes in the arguments being passed to a function.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/timothycrosley/isort&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;isort&lt;/a&gt; I&amp;rsquo;m a tidy man. I like when my imports are ordered alphabetically. That&amp;rsquo;s what isort is there for.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/psf/black&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;black&lt;/a&gt; I don&amp;rsquo;t particularly like discussing code style with others because everyone has their own quirks and creating a code style that everyone agrees on is as difficult as agreeing on whether tabs or spaces should be used. black is highly opinionated and doesn&amp;rsquo;t allow for much to be tweaked, while it also has a sensible style that sometimes can make you crazy.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/PyCQA/prospector&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;prospector&lt;/a&gt; Prospector allows you to run a variety of linters on your code, which is quite useful when you like your code to be as standard and pretty as I like it. Some of the tools also look for code complexity, which helps you identify nightmares before they&amp;rsquo;re in the master branch.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/python-poetry/poetry&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;poetry&lt;/a&gt; I&amp;rsquo;ve used pip, I&amp;rsquo;ve used pipenv, requirements.txt, setup.py, etc. I didn&amp;rsquo;t like the setup.py because since I&amp;rsquo;ve used composer (for PHP), I&amp;rsquo;ve always seen dependency management as something that shouldn&amp;rsquo;t require code to define. I didn&amp;rsquo;t like the requirements.txt/.lock variants because it was never clear how those were generated and if they were kept up to date together since you could use the requirements.txt as soft dependencies and requirements.lock as hard dependencies that you had to freeze yourself (which many people didn&amp;rsquo;t know about). pipenv Pipfile was alright, but adding dependencies seemed to take longer and longer, which wasn&amp;rsquo;t a pleasant experience, especially when the package you wanted to add didn&amp;rsquo;t want to play nice with the other packages. poetry was the closest experience I got to composer.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Programmer commentary</title>
      <link>https://tomrochette.com/questions/2020/01/29/</link>
      <pubDate>Wed, 29 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/29/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Is a programmer commentary something that can provide value?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;A few years ago I was learning how to drive. One of the techniques they teach in order to learn the basics of driving and help you reduce the amount of stress related to driving is to comment on what you are doing: I&amp;rsquo;m looking at this panel that says the maximum speed is 50 km/h, I am watching in my mirror, I am signaling that I want to move to the right lane, I&amp;rsquo;m checking my right dead angle, etc. The use of this technique is that it makes what you are doing in your head explicit by saying it out loud. There&amp;rsquo;s a similar technique called &lt;a href=&#34;https://en.wikipedia.org/wiki/Pointing_and_calling&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pointing and calling&lt;/a&gt; that is used by Japanese and Chinese railways drivers in order to keep focus and attention.&lt;/p&gt;&#xA;&lt;p&gt;When we&amp;rsquo;re doing pair programming with someone else, we will often communicate with the other person what our current intent is and what we&amp;rsquo;re currently trying to write down. It may help us clarify our objectives or express clearly the various steps we&amp;rsquo;ll have to go through. In the case of pair programming, one of the benefits is that someone else is there to double-check what you are doing and what you&amp;rsquo;re about to do.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m the context where you are programming by yourself, you can still benefit from talking out loud about what you are doing. If you are willing, you can record yourself and even possibly use speech to text technologies to create a log of what you were doing at the time. This can be useful to recall what you were working on if you are interrupted at some point. It can also serve as a good way to get back context from a piece of code if you need to work on it again.&lt;/p&gt;&#xA;&lt;p&gt;Writing down comments can also be useful, however there&amp;rsquo;s a lot of thinking that goes into programming that is only transient and if it were to be written as comments, it would make the code more difficult to consume.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Pointing_and_calling&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Pointing and calling&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Using checklists to avoid mistakes</title>
      <link>https://tomrochette.com/questions/2020/01/28/</link>
      <pubDate>Tue, 28 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/28/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do checklists help to avoid mistakes?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Checklists are designed to ensure that the most important things, either it is an item or a step in a process, are not forgotten.&lt;/p&gt;&#xA;&lt;p&gt;A process checklist will list all the steps that are critical to the completion of a process. It will make clear what steps need to be done and verified in what order. Checklists are a way to communicate with new team members what the existing team processes are and what is expected of them. As steps are completed, they are checked to indicate that the task was done or verified, which can serve as a progress indicator when a process takes a while to accomplish. What is also great about checklists is that it can be shared between teams as a way to share knowledge about processes.&lt;/p&gt;&#xA;&lt;p&gt;If you often make mistakes in certain processes you do throughout the day, you can easily create a checklist that lists all the important things that you need to double-check when you do that process. You can then go through that list while completing the process or after completing it to ensure that all the important aspects of the process were correctly done.&lt;/p&gt;&#xA;&lt;p&gt;One benefit of the checklist is that it also allows you to offload information that you might have to keep in your head at all times. A checklist for a process you do very infrequently can be an amazing time-saving tool since you do not need to refresh your memory on all the important steps of that process.&lt;/p&gt;&#xA;&lt;p&gt;Anything that you can memorize, you should write down so that you can consult later and improve over time.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Library management</title>
      <link>https://tomrochette.com/questions/2020/01/27/</link>
      <pubDate>Mon, 27 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/27/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How does one keep a library organized if people are moving books improperly at a certain rate?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In order to keep the library as ordered as possible, librarian should suggest that books that have been removed from the shelves be put onto cart or tables where those will be properly shelved again. Given that an individual may think they properly shelved a book, they might have actually introduced a slight error in the ordering of the books. If there is enough disorder created through this method, then it becomes more challenging for librarians to keep the books ordered.&lt;/p&gt;&#xA;&lt;p&gt;We know from computer science that efficient sorting algorithms are of complexity O(n log n). For a nearly sorted initial order, insertion sort is considered to be the best as it will become close to O(n) complexity (while it is O(n^2) in the average/worst case).&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How I make complex decisions</title>
      <link>https://tomrochette.com/questions/2020/01/26/</link>
      <pubDate>Sun, 26 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/26/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do I make complex decisions?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When I have a decision that requires me to consider a lot of aspects, I&amp;rsquo;ve always documented my thoughts. I would first start by writing down all the things that come to mind in relation to this decision: things I want to consider, things I don&amp;rsquo;t want to forget, things that may be difficult to include as part of the decision, etc. I write as much as I can. Then I order the items I&amp;rsquo;ve listed by order of importance. What is it in all those ideas that I value the most?&lt;/p&gt;&#xA;&lt;p&gt;When I&amp;rsquo;ve created a few alternative decisions, I evaluate each of the pros and cons. I use my list of importance to determine the solution that best aligns with those values. Oftentimes I will have an acceptable decision, but there will be parts of the decision that will need to be ironed out so that it is a good decision.&lt;/p&gt;&#xA;&lt;p&gt;I always consider how important the decision is to determine how much time I will spend on that decision. There is no value in optimizing the decisions that have a negligible impact on you, but important decisions can definitely have a long term impact on your life. Note that I didn&amp;rsquo;t say that complex decisions were important decisions. Sometimes complex decisions are not important at all. In that case, it is not worth thinking about this decision for too long.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Solving problems with AI</title>
      <link>https://tomrochette.com/questions/2020/01/25/</link>
      <pubDate>Sat, 25 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/25/</guid>
      <category>questions</category><category>artificial-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Should I solve my problem with AI?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;First start with a non-AI solution, then look into AI if what you have is unsatisfactory.&lt;/p&gt;&#xA;&lt;p&gt;In this day and age, we want to make AI solve all kinds of problems, even those that don&amp;rsquo;t require AI.&lt;/p&gt;&#xA;&lt;p&gt;When you build a product, you generally have a problem you are trying to solve. With AI, companies are looking at existing problems and trying to find ways to turn them into AI problems. It is not a problem in itself to attempt the exercise, but it is a mistake to implement an AI solution where a non-AI solution would&amp;rsquo;ve been more than adequate. There is still a lot of work that needs to be done in the field of automation that does not require AI, but simpler statistical approaches.&lt;/p&gt;&#xA;&lt;p&gt;A lot of research in the field of machine learning and deep learning like to point to Occam&amp;rsquo;s razor in order to create simple models, but they sometimes seem to forget to apply the same principle to the whole solution, that is, do I need AI for this or would something simpler be as good?&lt;/p&gt;&#xA;&lt;p&gt;A problem with the current wave of AI companies is their relation to AI itself. They corner themselves into doing AI only, while AI still highly relies on programming and IT, which are still highly technical but a lot less glamorous. It is definitely exciting to sell products that have AI in them, but starting with the tool and not the problem that needs to be solved is similar to trying to find all the problems a hammer can solve instead of knowing that you need a hammer when you want to nail something.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing everything down</title>
      <link>https://tomrochette.com/questions/2020/01/24/</link>
      <pubDate>Fri, 24 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/24/</guid>
      <category>questions</category><category>note-taking</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Is there value in writing everything down?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I had this question when I started my research journey towards AGI. At one point I realized I wouldn&amp;rsquo;t be able to hold everything in my brain and that I needed to write down what I was thinking about so that I would be able to come back later, re-read what I wrote and continue making progress on what I was working on, whether it had been a day, a few weeks, or many months.&lt;/p&gt;&#xA;&lt;p&gt;There is definite value in writing everything down. It frees your mind, letting you delegate the task of remembering to the computer. A thought I might have had more than five years ago can still be accessible to me if I wrote it down, but it&amp;rsquo;s unlikely I&amp;rsquo;ll remember exactly what I was thinking five years ago by &amp;ldquo;thinking really hard&amp;rdquo;. Nowadays I have trouble even remembering what I was working on a few hours prior due to the high volume of interruption I face in my work. Writing things down allows me to keep a record of what I&amp;rsquo;m doing.&lt;/p&gt;&#xA;&lt;p&gt;One of the main concerns of writing everything down is that it can be seen as a waste of time. We often write and never read what we wrote again. As I write more and more, it becomes less and less likely that I will read what I&amp;rsquo;ve written in the past because the volume of content increases requiring more time to read. For the same amount of time spent reading, I cover the same constant amount of content, but the amount of uncovered content keeps growing, assuming I review prior content more than once.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t view writing that is not read again to be wasteful. Sometimes writing down our thoughts allows us to figure out an issue that is blocking us. Sometimes expressing what we feel makes us realize that the feelings themselves are very hard to explain. Sometimes we just need a buffer where we can jot things down and get rid of it once we&amp;rsquo;re done.&lt;/p&gt;&#xA;&lt;p&gt;Writing (and sharing) has the benefit that your thoughts can be reused by others. They can also be reused by your future self if you end up facing the same situation again.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/21/&#34; &gt;How often should I review my personal notes?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/research-methodology-and-organization/&#34; &gt;Research methodology and organization&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Complex and unpredictable binary strings</title>
      <link>https://tomrochette.com/questions/2020/01/23/</link>
      <pubDate>Thu, 23 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/23/</guid>
      <category>questions</category><category>computer-science</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is the most complex sequence that can be made from a n-long binary string?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;0&amp;hellip;.0 and 1&amp;hellip;.1 are easily compressible, thus what is the most unpredictable sequence?&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s proceed by induction.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;1-long binary string&#xA;    &lt;div id=&#34;1-long-binary-string&#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;#1-long-binary-string&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;0 and 1 have a 50% to be selected in a 1-long binary string, thus they are both the most complex examples of a 1-long binary string.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;2-long binary string&#xA;    &lt;div id=&#34;2-long-binary-string&#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;#2-long-binary-string&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;string&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;pattern&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;10&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;11&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;With two bits, we introduce two patterns: repeating and alternating. Repeating means that the bits are repeated for the complete string. Alternating means that the bits are alternating between 0 and 1 given a certain periodicity.&lt;/p&gt;&#xA;&lt;p&gt;From our initial observation we suggested that the repeating pattern was likely to be the simplest because it consists of defining the symbol (0 or 1) that is repeated and the number of repetitions. We can say that this function has two parameters: length and symbol.&lt;/p&gt;&#xA;&lt;p&gt;The same can be said about the alternating pattern. If you provide the initial symbol and the length of the pattern, you&amp;rsquo;ve defined its parameters. We can say that this function also has two parameters: length and starting symbol.&lt;/p&gt;&#xA;&lt;p&gt;Using those two descriptions, we can observe that the alternating pattern is in fact a special case of the repeating pattern, where the symbol is 2 bits instead of one.&lt;/p&gt;&#xA;&lt;p&gt;00 = repeating(2, 0)&#xA;01 = alternating(2, 0) = repeating(1, 01)&#xA;10 = alternating(2, 1) = repeating(1, 10)&#xA;11 = repeating(2, 1)&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;3-long binary string&#xA;    &lt;div id=&#34;3-long-binary-string&#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;#3-long-binary-string&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;string&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;pattern&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;000&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;001&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;010&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;011&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=1,2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=1,2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;101&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;110&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;111&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;001, 011, 100, 110 can be described as alternating and repeating, which is more complex than the previous examples as it requires the composition of two operations.&lt;/p&gt;&#xA;&lt;p&gt;4 complex examples (001, 011, 100, 110) have been introduced at this stage.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;4-long binary string&#xA;    &lt;div id=&#34;4-long-binary-string&#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;#4-long-binary-string&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;string&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;pattern&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0000&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0001&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0010&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0011&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating, periodicity=2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0101&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating, periodicity=1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0110&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;mirror&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0111&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1000&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1001&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;mirror&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1010&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating, periodicity=1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1011&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating, periodicity=2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1101&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1110&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1111&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Here we first observe the presence of the alternating pattern with a periodicity of 2. We also observe the first case of a mirror pattern with 0110 and 1001. It could be claimed that 010 and 101 is the uneven equivalent of the mirror pattern for 3-long binary strings. The remaining &amp;ldquo;complex&amp;rdquo; examples are again displaying alternating and repeating patterns at the lower level.&lt;/p&gt;&#xA;&lt;p&gt;One observation is that the complex patterns appear to be the variants where 1 bit is the opposite of the remaining bits, the only special case so far being for the 3-long binary string where the pattern is considered alternating. Instead of considering it a complex pattern, it could be described as the operation &amp;ldquo;fill X bits with 0/1, then flip by Y&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;From those few inductive iterations, we can see that the first and last string are always the repeating pattern. We also observe that the first half of the strings exhibit the same pattern of the second half of the strings, which is expected due to the binary nature of the string.&lt;/p&gt;&#xA;&lt;p&gt;At this point there is still not enough information to be able to derive an answer to the original question, given that the strings can be described using 4 patterns: repeating, alternating, mirror, and fill &amp;amp; flip.&lt;/p&gt;&#xA;&lt;p&gt;8 complex examples are found at this stage.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;5-long binary string&#xA;    &lt;div id=&#34;5-long-binary-string&#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;#5-long-binary-string&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;string&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;pattern&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00000&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;repeating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00001&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00010&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00011&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating, periodicity=3,2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00101&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or 0 and alternating, periodicity=1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00110&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;00111&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating, periodicity=2,3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01000&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01001&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or 0 and mirror&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01010&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;alternating&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01011&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or 0 and fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=1,2,2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01101&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or 0 and fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01110&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;complex, or alternating, periodicity=1,3,1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;01111&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;fill &amp;amp; flip&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;The second half of this table was not written down due to the previous observation that the patterns are the same, simply inverted.&lt;/p&gt;&#xA;&lt;p&gt;At this stage, the complex patterns that emerge are difficult to express using the prior language. Composition needs to be used, e.g. 00101 can be described as 00 then 101.&lt;/p&gt;&#xA;&lt;p&gt;14 complex examples are found at this stage.&lt;/p&gt;&#xA;&lt;p&gt;At this point in my study, I would summarize as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Repeating, alternating and fill &amp;amp; flip are low complexity. For a n-long binary string, this implies 2 repeating patterns, 2n fill &amp;amp; flip patterns, 2n alternating patterns of periodicity=1.&lt;/li&gt;&#xA;&lt;li&gt;Complexity appears to emerge from alternating patterns with varying periodicity. As we&amp;rsquo;re working with longer and longer strings, the periodic patterns will start to become periodic themselves (I believe this is leading to fractal).&lt;/li&gt;&#xA;&lt;li&gt;The fill &amp;amp; flip pattern appears to be able to cover most of the complex cases that appear as the length of the binary string increases.&lt;/li&gt;&#xA;&lt;li&gt;Some of the patterns can be expressed as a few alternatives, for example 01110 as alternating, periodicity=1,3,1, but also as 0 and fill &amp;amp; flip (or even an &amp;ldquo;odd&amp;rdquo; mirror). My intuition would lead me to think that those cases that can be expressed in multiple ways are less complex.&lt;/li&gt;&#xA;&lt;li&gt;It wasn&amp;rsquo;t done during this analysis, but it may be possible to apply operations overlayed on one another, such as two alternating patterns, one with a periodicity of 2 and one with a periodicity of 3, and use logic operators such as AND/OR/XOR (and their negative variants) to recreate the pattern&lt;/li&gt;&#xA;&lt;li&gt;The sequence of complex examples seems to be as follows: &lt;a href=&#34;https://oeis.org/search?q=0%2C4%2C8%2C14&amp;amp;sort=&amp;amp;language=&amp;amp;go=Search&#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=oeis.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;0, 4, 8, 14, &amp;hellip;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;It would be interesting to look at those strings from a logic circuit point of view. For example, 00000 can be produced from a single signal (0) routed to 5 exits, 00001 would be a single signal (0) routed to 4 exits and to one not gate which is then routed to an exit. Assuming the input signal is always 0, producing 11111 would require 1 not gate.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>What can cause learning inefficiency</title>
      <link>https://tomrochette.com/questions/2020/01/22/</link>
      <pubDate>Wed, 22 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/22/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What can cause us to learn inefficiently?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;There are many reasons which can cause someone to learn at a slower pace than what should be possible for them. This can be caused by many factors, amongst them:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning the same material under different wordings:&lt;/strong&gt; You are going through material which you&amp;rsquo;ve already read, thus this &amp;ldquo;new&amp;rdquo; material is not providing you with any fresh information.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning outdated material:&lt;/strong&gt; You are learning material that has already been replaced with better material. It may be useful to learn outdated material for the historical purpose, but you should always aim to know what is the latest material.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning incorrect material:&lt;/strong&gt; You are learning material that is effectively not providing you with the information you want to learn. It may appear like you are learning something, but learning the wrong facts is a waste of your time.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning from a source that makes the material difficult to understand:&lt;/strong&gt; Learning efficiently is about learning from the best sources. If the material you have makes it difficult to understand what you are trying to learn, you should look for content elsewhere.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning material for which we do not know the prerequisites:&lt;/strong&gt; Learning a topic when we do not have the prerequisite knowledge will generally lead to confusion and make it difficult, if not impossible to learn.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning from multiple sources with contradictory information:&lt;/strong&gt; Learning from sources that disagree on facts makes it difficult to learn because you have to either accept that both answers are true, which can be complicated when they contradict each other, or that you need to establish which answer is the correct one, which requires additional effort.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning while not being completely focused on the task:&lt;/strong&gt; When learning, it is imperative to dedicate our focus to the task. Not doing so is likely to lead to information falling through the cracks of focus, leading to gaps in understanding, leading to requiring to go through the material again.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;What is important to do while learning is to recognize when certain behaviors or circumstances make learning less efficient than desired and writing those behaviors or circumstances down so that you may have your own list of causes for learning less efficiently. As you discover those causes, make sure to put in place some contingency plans that will help you reduce their impact on your learning abilities.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How often to review your own notes</title>
      <link>https://tomrochette.com/questions/2020/01/21/</link>
      <pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/21/</guid>
      <category>questions</category><category>note-taking</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How often should I review my personal notes?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The simple answer is to do it as often as possible.&lt;/p&gt;&#xA;&lt;p&gt;The more often you can go through your notes and review them, the more they will be fresh in your mind.&lt;/p&gt;&#xA;&lt;p&gt;However, as you write more and more notes, it will be difficult to go through them all. At one point you will need to start prioritizing what you want to review and at what frequency. I see writing the same way I see programming: certain parts of the code work well and don&amp;rsquo;t need to be touched for a while, so they are left alone. However, sometimes certain parts have become neglected with time and need to be looked at again.&lt;/p&gt;&#xA;&lt;p&gt;All my notes on this blog, as well as my private project and personal notes are committed to git automatically every time I switch out of VS Code. This means that I have a very granular history of the last time a file was touched. This allows me to look back at the list of files I have and to find the files that haven&amp;rsquo;t been touched in a while. Sometimes I&amp;rsquo;ll read them again, think about them a bit, then close them if I have nothing to add. Other times I&amp;rsquo;ll write about something that I&amp;rsquo;ve learned since then. Doing this feels a lot like improving some part of a codebase after you&amp;rsquo;ve learned how a piece of code would be used.&lt;/p&gt;&#xA;&lt;p&gt;Another way you can schedule reviewing your notes would be with a spaced repetition system like Anki. It wouldn&amp;rsquo;t be too much work to have a system that automatically creates an Anki note/card with a link to the file itself. You would click on the link, which would open the file in your text editor of choice, read the note, change it if needed, then close it. You would then go back to Anki and pick between hard/good/easy to decide when is the next time you would review the note.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d suggest dedicating a small amount of your week going through what you wrote and refreshing your memory. It is definitely useful to simply write things to get them out of your mind and to attempt to express your thoughts clearly. It&amp;rsquo;s also useful to review what you thought about because your subconscious might have kept working on those thoughts well after you wrote them down and there might be more to contribute on a topic.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Why ask questions when few are answered</title>
      <link>https://tomrochette.com/questions/2020/01/20/</link>
      <pubDate>Mon, 20 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/20/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is the point of asking ourselves many questions when we only answer a few of them?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The purpose of asking yourself questions is to prompt your subconscious to look for the answer.&lt;/p&gt;&#xA;&lt;p&gt;Asking yourself questions is a way to determine if you know or do not know the answer. If you don&amp;rsquo;t know the answer, then nothing will come on the top of your head quickly. On the other hand, if you know an acceptable answer, it will show itself rather quickly.&lt;/p&gt;&#xA;&lt;p&gt;Asking yourself questions is a way to explore the domain of your knowledge and look for areas where you might need to do additional research.&lt;/p&gt;&#xA;&lt;p&gt;If you ask yourself a lot of questions on a certain topic you&amp;rsquo;re studying and you don&amp;rsquo;t know the answers, then it can let you know that your knowledge is lacking and that you need to study more.&lt;/p&gt;&#xA;&lt;p&gt;In some cases you might ask yourself questions that you don&amp;rsquo;t really want to know the answer to.&lt;/p&gt;&#xA;&lt;p&gt;One of the main reason a lot of questions remain unanswered is because asking questions is easy, but answering is hard.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/12/&#34; &gt;Answering your own questions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Belief traceability</title>
      <link>https://tomrochette.com/questions/2020/01/19/</link>
      <pubDate>Sun, 19 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/19/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is belief traceability?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In software development, is it very common to want to have traceability between things. We want to know from where a requirement came from, who created the entry, who approved that it should be supported by the software, the issues in the issue tracker that will implement the requirement, who implemented the requirement, who reviewed the implementation, etc. The goal is to be able to retell the story of this requirement from beginning to end if necessary.&lt;/p&gt;&#xA;&lt;p&gt;In the case of belief traceability, we want to be able to trace how we&amp;rsquo;ve come to believe in something. Being able to trace back to the source of our beliefs allows us to determine if we still want to believe in them. Being able to also determine how a belief affects or generates other beliefs can be quite critical when we are re-evaluating our beliefs at some points in our lives.&lt;/p&gt;&#xA;&lt;p&gt;Belief traceability starts with making a list of all the beliefs you have. Once you have made this list, you can try to determine if certain beliefs lead to other beliefs. You can also try to figure out if you have conflicting beliefs. You can attempt to associate beliefs with people, either because you think they are the ones that led you to believe something, or because they believe in that belief themselves. You may also have changed beliefs at certain points in your life. As such, it is interesting to create a timeline of your beliefs, where said beliefs are seen as being replaced or evolving over time.&lt;/p&gt;&#xA;&lt;p&gt;As you get familiar with the process of tracking your beliefs, you will want to update your belief tracking system as you acquire new beliefs. This will allow you to reflect explicitly on what you believe and help you make a thorough analysis of those beliefs.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning according to machine learning</title>
      <link>https://tomrochette.com/questions/2020/01/18/</link>
      <pubDate>Sat, 18 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/18/</guid>
      <category>questions</category><category>machine-learning</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What is learning according to machine learning?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;It is (for supervised learning) looking at numerous samples, decomposing them into input variables and their associated target variable, and deriving according to an algorithm how to predict the target variable given input variables.&lt;/p&gt;&#xA;&lt;p&gt;It is the (potentially lossy) compression of the observed samples, where the learning algorithm describes the compression/decompression algorithm. The compressed data is the information necessary for the algorithm to make predictions (decompression).&lt;/p&gt;&#xA;&lt;p&gt;It is the creation of some &amp;ldquo;memory&amp;rdquo; of the observed samples. Whereas an untrained model has no memory of the dataset since it hasn&amp;rsquo;t seen the data, a trained model has some form of memory. A simple model such as sklearn&amp;rsquo;s &lt;a href=&#34;https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyRegressor.html&#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=scikit-learn.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DummyRegressor&lt;/a&gt; will learn and memorize the mean of the target variable. It may not have learned and memorized much, but it has built its internal model of the data.&lt;/p&gt;&#xA;&lt;p&gt;It is to imitate as closely as possible the source of data it is trained on. This means that given input variables, it should produce target values that are as close as possible to those observed during training (learning).&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/learning/&#34; &gt;Learning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Picking the best material to learn a topic</title>
      <link>https://tomrochette.com/questions/2020/01/17/</link>
      <pubDate>Fri, 17 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/17/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How does one determine the best material to learn a topic?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My approach has always been based on the &lt;a href=&#34;https://en.wikipedia.org/wiki/Wisdom_of_the_crowd&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;wisdom of the crowd&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If I want to read a book on a given topic, I will first look for the books that are available and create a list. From that list I will then look at websites like &lt;a href=&#34;https://www.goodreads.com/&#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=www.goodreads.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;goodreads&lt;/a&gt; to gather people&amp;rsquo;s opinion on the book. I look for two factors: how many people read the book, and the overall rating of the book. The book should have been read by as many people as possible and have the highest rating. I will also read some of the low rating comments to get a sense of the negative feedback that has been provided on the book.&lt;/p&gt;&#xA;&lt;p&gt;If I already have some knowledge about the topic I am studying, I might be looking for specific sub-topics to be covered. I would then inspect the table of contents of the books to determine if those sub-topics are covered. I may end up reading only a chapter of a book because it addresses something I&amp;rsquo;m interested in. The topic may also only be covered in this book.&lt;/p&gt;&#xA;&lt;p&gt;In some cases, I will ask people that are more knowledgeable than I am to give me references. I use my knowledge of their expertise to determine the topics on which they can and cannot offer expertise and suggestions.&lt;/p&gt;&#xA;&lt;p&gt;If there are multiple options of equally good books, then I will skim a few of them, maybe read a few passages to get a personal impression of the book. I prefer concise and non-repetitive content.&lt;/p&gt;&#xA;&lt;p&gt;With my chosen book in hand, I will start to read through it from beginning to end. If at some point the content is less than ideal, I don&amp;rsquo;t mind skipping it and looking for additional sources (e.g., books or websites) to fill those gaps.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Identifying areas to improve</title>
      <link>https://tomrochette.com/questions/2020/01/16/</link>
      <pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/16/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can one identify the areas he needs to improve?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Through introspection.&lt;/p&gt;&#xA;&lt;p&gt;As we do things through our daily lives, there are events which we wished had unfolded better. As we realize those areas of weaknesses, it is important to write them down so that we can build a list of those areas we may want to spend time improving in the future.&lt;/p&gt;&#xA;&lt;p&gt;Another way one can identify the areas he needs to improve is to use the &lt;a href=&#34;https://fs.blog/2012/04/feynman-technique/&#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=fs.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Feynman technique&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Choose a concept&lt;/li&gt;&#xA;&lt;li&gt;Pretend you are teaching it to someone else&lt;/li&gt;&#xA;&lt;li&gt;Identify gaps in your explanation, go back and learn some more, then try explaining some more&lt;/li&gt;&#xA;&lt;li&gt;Review and simplify&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This technique can also be applied to the skills you lack. Instead of trying to teach someone else, you basically want to be able to explain the skill to someone else as accurately as possible. As you identify gaps in the description of the skill to perform, you are basically documenting what you need to work on.&lt;/p&gt;&#xA;&lt;p&gt;For example, you might want to determine which one of your programming skills are lacking. You might start by asking yourself how you would design and implement things you use in your daily life: how is a text editor implemented? what happens when I type a URL and press enter in a browser? how are files read from a disk? how is this special effect rendered in a video game?&lt;/p&gt;&#xA;&lt;p&gt;Make sure that you ask yourself questions that are relevant to areas you want to improve. If you don&amp;rsquo;t know how networking works, but it has no incidence on you, then you do not need to address this weakness. Spend time improving skills which will be useful to you in the future.&lt;/p&gt;&#xA;&lt;p&gt;Look for things that create friction in your life, those are generally places where you&amp;rsquo;ll find potential for improvement.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Feynman technique&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://fs.blog/2012/04/feynman-technique/&#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=fs.blog&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://fs.blog/2012/04/feynman-technique/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doist.com/blog/feynman-technique/&#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=doist.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://doist.com/blog/feynman-technique/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Biology and genetics for AGI researchers</title>
      <link>https://tomrochette.com/questions/2020/01/15/</link>
      <pubDate>Wed, 15 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/15/</guid>
      <category>questions</category><category>artificial-general-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Why are biology and genetics interesting to AGI researchers?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Because it may provide interesting ideas and clues that can help with the development of AGI.&lt;/p&gt;&#xA;&lt;p&gt;We currently know of a single instance of a system that is able to produce human-level intelligence: a human being. AGI researchers often try to understand how specific components such as the brain works. A lot of valuable work on the neuron has led to the creation of the deep learning field. Deep learning has definitely proven its value, but I am more interested in something else.&lt;/p&gt;&#xA;&lt;p&gt;Genetics is seen as the programming of life. What I find interesting is that we can see the current human DNA as our latest implementation of this code. Since this code did not come out of existence from out of nowhere, studying DNA&amp;rsquo;s history can give us ideas as to how a seed AI might come to be. It is also useful to understand how the environment has shaped DNA&amp;rsquo;s existence.&lt;/p&gt;&#xA;&lt;p&gt;Initially, there were only atoms and molecules. Through different physical and chemical processes, these molecules aggregated and formed more and more complicated assemblies. Through a multitude of steps, we reached the point where there were cells that contained DNA inside of them. This process might have been entirely random although the formation of complex structures happening randomly does not seem highly likely. Understanding the mechanisms or processes that helped create this order may be the equivalent of a pre-evolution natural selection.&lt;/p&gt;&#xA;&lt;p&gt;My hope is that by studying such fields it is possible to discover how DNA increased in length, what were the different steps and challenges that were encountered that forced it to increase in size, as well as the potential causes of parts of DNA changing over time.&lt;/p&gt;&#xA;&lt;p&gt;Just like a git repository, I&amp;rsquo;d like to be able to look at DNA&amp;rsquo;s history and understand what happened to its code since its &amp;ldquo;Initial commit&amp;rdquo;. It might also be interesting to figure out what kind of programmer nature is.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/seed-ai/&#34; &gt;Seed AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=EcGM_cNzQmE&#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=www.youtube.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;DNA: The Code of Life (SHA2017)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Differences between brain and CPU</title>
      <link>https://tomrochette.com/questions/2020/01/14/</link>
      <pubDate>Tue, 14 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/14/</guid>
      <category>questions</category><category>artificial-general-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What are the differences between a brain and a CPU?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The brain is extremely parallel (each neuron processing many signals), while CPUs are currently limited to a few cores.&lt;/li&gt;&#xA;&lt;li&gt;The brain appears to be able to only do a single thing at once (single process, single thread).&lt;/li&gt;&#xA;&lt;li&gt;CPUs can explicitly control their memory access while the brain memory organization and access is unclear.&lt;/li&gt;&#xA;&lt;li&gt;The brain is a lot slower in terms of sequential operations, processing at a maximum of 250-1000 Hz while current generation (2020) desktop CPUs are in the 3-5 GHz range.&lt;/li&gt;&#xA;&lt;li&gt;The brain does not have a clear instruction set.&lt;/li&gt;&#xA;&lt;li&gt;The brain consumes glucose for energy, while a CPU consumes electricity.&lt;/li&gt;&#xA;&lt;li&gt;The human brain is much larger (average 1273 cm&lt;sup&gt;3&lt;/sup&gt; for men, 1131 cm&lt;sup&gt;3&lt;/sup&gt; for women) than a CPU chip (Intel Core i7-10710U is 46mm by 24mm (height unknown but definitely less than 10 mm) which is less than 11 cm&lt;sup&gt;3&lt;/sup&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Heat dissipation is done through cerebral circulation in the brain and through a heatsink attached to a CPU.&lt;/li&gt;&#xA;&lt;li&gt;The brain is biodegradable, the CPU is not.&lt;/li&gt;&#xA;&lt;li&gt;Signal is transmitted between neurons using neurotransmitters (chemically) while CPUs transmit signals between transistors electrically.&lt;/li&gt;&#xA;&lt;li&gt;The organization of the brain evolves over time (in a single person), while a CPU chip will remain the same its whole life.&lt;/li&gt;&#xA;&lt;li&gt;We currently cannot transplant a brain from one person to another, but we can transfer a CPU from one computer to another (as long as the motherboard is compatible).&lt;/li&gt;&#xA;&lt;li&gt;The brain contains a large amount of memory, while the CPU has a small amount of memory and relies on larger memory stores (RAM, disks).&lt;/li&gt;&#xA;&lt;li&gt;It is possible to reverse engineer a CPU by trying a different combination of inputs and recording the output (immutable). Doing the same with a part of the brain may result in different results as the brain is mutable.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;To be determined&#xA;    &lt;div id=&#34;to-be-determined&#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;#to-be-determined&#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;The brain may not have different levels of memory cache (we do however talk about short and long term memory).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hypertextbook.com/facts/2001/JacquelineLing.shtml&#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=hypertextbook.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://hypertextbook.com/facts/2001/JacquelineLing.shtml&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4189373/&#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=www.ncbi.nlm.nih.gov&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4189373/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Brain_size&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Brain_size&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ark.intel.com/content/www/us/en/ark/compare.html?productIds=196448&#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=ark.intel.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://ark.intel.com/content/www/us/en/ark/compare.html?productIds=196448&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Humans modeled as computers</title>
      <link>https://tomrochette.com/questions/2020/01/13/</link>
      <pubDate>Mon, 13 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/13/</guid>
      <category>questions</category><category>artificial-general-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;What do humans modeled as computers look like?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Numerous processes all running in parallel in different regions of the body and the brain (heartbeat, breathing, sight, smell, taste).&lt;/li&gt;&#xA;&lt;li&gt;The brain runs multiple processes at once, each processing a different modal input (sight, taste, touch, hearing, smell).&lt;/li&gt;&#xA;&lt;li&gt;Those processes are buffered and a process takes care of synchronizing the different input streams to create a coherent flow of information.&lt;/li&gt;&#xA;&lt;li&gt;The spinal cord and nerves are network cables, transferring information from the limbs and other regions of the body to the main processing unit, the brain.&lt;/li&gt;&#xA;&lt;li&gt;The eyes are digital cameras that can see into the world, converting photons into bits of data.&lt;/li&gt;&#xA;&lt;li&gt;The ears are microphones that can listen to a limited range of frequencies (20-20000 Hz).&lt;/li&gt;&#xA;&lt;li&gt;The mouth act as a speaker to emit sound for others to perceive&lt;/li&gt;&#xA;&lt;li&gt;Touch is complex as it deals with textures, temperatures, moisture and pressures, however it can likely be modeled as a surface with discrete elements that measure a few things such as the force currently applied on it, the temperature, moisture.&lt;/li&gt;&#xA;&lt;li&gt;Taste and smell are also complex as they are specialized receptors that will perceive different fragrances based on the distribution of particles that are perceived and that can be recognized.&lt;/li&gt;&#xA;&lt;li&gt;The arms, legs, hands, feet are actuators used to interact with the environment.&lt;/li&gt;&#xA;&lt;li&gt;The stomach and intestine are the power supply.&lt;/li&gt;&#xA;&lt;li&gt;Neurons throughout the body act as distributed memory and storage, as well as processing units.&lt;/li&gt;&#xA;&lt;li&gt;Blood is used as a mechanism to transfer energy between components. It also acts as a heatsink for the brain.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/deconstruction-of-a-mind/&#34; &gt;Deconstruction of a mind&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/humans-as-machines/&#34; &gt;Humans as machines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/senses/&#34; &gt;Senses&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/the-brain/&#34; &gt;The brain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Answering your own questions</title>
      <link>https://tomrochette.com/questions/2020/01/12/</link>
      <pubDate>Sun, 12 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/12/</guid>
      <category>questions</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Given a continuously growing number of questions one asks himself, what is the proper procedure to answer these questions?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;There is no proper procedure per se. The most important is to get started. Write your questions down so that you have a list. When you have a new question, you can check if you have asked a similar question in the past.&lt;/p&gt;&#xA;&lt;p&gt;In their book &lt;strong&gt;Algorithms to live by&lt;/strong&gt;, Brian Christian and Tom Griffiths write (about scheduling)&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;In a thrashing state, you’re making essentially no progress, so even doing tasks in the wrong order is better than doing nothing at all. Instead of answering the most important emails first - which requires an assessment of the whole picture that may take longer than the work itself - maybe you should sidestep that quadratic-time quicksand by just answering the emails in random order, or in whatever order they happen to appear on-screen.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;A lot of what I wrote in &lt;a href=&#34;https://tomrochette.com/questions/2020/01/04/&#34; &gt;How do you prioritize things when there are so many of them competing against one another?&lt;/a&gt; and &lt;a href=&#34;https://tomrochette.com/questions/2020/01/07/&#34; &gt;How can I organize all the webpages I never read?&lt;/a&gt; applies here, namely:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Record your questions in a single location that you can search&lt;/li&gt;&#xA;&lt;li&gt;Do not spend time answering questions you don&amp;rsquo;t care about the answer&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Record under such question that you decided not to answer them due to a lack of value&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Prioritize the questions you would like to have an answer to&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Evaluate how valuable is a question&amp;rsquo;s answer to you, and how much time you would be willing to spend to answer it&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Look online for existing answers&lt;/li&gt;&#xA;&lt;li&gt;Write down the answer to the question you asked yourself, you may ask the same question again in the future&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/&#34; &gt;Answer one question per day&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I often joke around with colleagues at work that it&amp;rsquo;s easier to generate dumb questions than it is to answer them appropriately. As such, don&amp;rsquo;t spend your time on questions that are not worth answering.&lt;/p&gt;&#xA;&lt;p&gt;If you dedicate a bit of your time every day to answer one question you asked yourself, you will slowly accumulate a large list of questions you&amp;rsquo;ve spent time thinking about and answering. Those answers may be useful to others, so make sure that you share as many of your answers with others.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/25666050-algorithms-to-live-by&#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=www.goodreads.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Algorithms to live by&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Storing and updating large amounts of data</title>
      <link>https://tomrochette.com/questions/2020/01/11/</link>
      <pubDate>Sat, 11 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/11/</guid>
      <category>questions</category><category>artificial-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can an agent efficiently store terabytes of data, with hundreds of gigabytes updated daily?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This question comes from the idea that if we want to implement an artificial intelligence, it will have to be able to process a large amount of data daily, similar to how we need to process a stream of sensorial (sight, hearing, taste, touch, smell) inputs actively more than 12 hours per day.&lt;/p&gt;&#xA;&lt;p&gt;In human beings, even though we perceive a large amount of incoming data, a lot of it is compressed through differencing, that is, comparing the previous input with the new input and only storing the difference. This is similar to how video is currently encoded and compressed. To be able to accomplish this feat we however need two things: a temporary buffer to store the previous input (or sequence of inputs), and a mechanism to differentiate between the previous and the current input.&lt;/p&gt;&#xA;&lt;p&gt;That differentiation mechanism can be highly complex depending on the degree of compression desired. For example, if you shift all the pixels in an image by 1 on the x-axis, your differentiation mechanism may simply tell you that all the pixels have changed, return a delta between their previous value and new value and be done. In some cases you may be lucky and a large number of pixels have remained the same value. However, a much better differentiation mechanism would realize that everything has moved by one pixel on the x-axis and instead return to you that it detected a x+=1 transform, which compresses the transformation a lot more than by the simple pixel by pixel difference. In the case of the brain, one benefit it has is that it can correlate multiple input channels to make sense of what is happening and better compress the information. In the previous case, the eyes may perceive that all the signals are now different at each receptor. The brain however also receives information from the ears, telling it that the head moved by a certain amount, which most likely explains the transform that was applied to the eyes input.&lt;/p&gt;&#xA;&lt;p&gt;In the brain we make use of the fact that the sensory inputs are different modes. Each is compressed somewhat independently from the others. As such, we would expect information that is similar in format to be compressed together (text with text, video with video, audio with audio, etc.) as it is likely to lead to the highest compression. Furthermore, being able to make use of the structure within the data will lead to better compression than simply compressing blindly a collection of inputs as an opaque blob.&lt;/p&gt;&#xA;&lt;p&gt;I would expect such a compression system to make use of two types of compression: offline and online. Offline compression would occur during low periods of activity and would be able to offer higher levels of compression at the cost of less responsiveness during recompression. Online compression would occur when the system is actively being used and would rely mostly on fast encoding techniques to keep responsiveness high.&lt;/p&gt;&#xA;&lt;p&gt;Online compression would rely on a lookup dictionary with a most used recently retention policy to compress blocks of data that have already been seen numerous times. The quality of the online compression highly depends on the assumption that what will be observed in the future is highly likely to be like what has been observed in the past. During the day, we spend most of our time in the same environment. As such, we experience and observe the same things for an extended amount of time. Being able to determine what is similar and what is different is what will lead to the highest amount of compression.&lt;/p&gt;&#xA;&lt;p&gt;Offline compression would rely on the ability to make the most efficient use of the compute and memory available as this process would be time-constrained. It might be possible that the online and offline systems share information such that the online compressor can let the offline compressor know regions of data that might be ripe for recompression. In the case that both systems do not communicate, the offline system would likely benefit from knowing which regions have already been compressed to the fullest so that it spends most of its time processing data that was recently added. When it is done with this step, it can then attempt to increase the compression efficiency of all the data stored. Here again it should be able to make use of the differencing approach given that days will likely be highly similar. As such, we would expect the amount of space necessary to store a day to decrease drastically as more and more days of data are observed, possibly to the point where new days of data can be expressed as segments of previous days entirely.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/compression/&#34; &gt;Compression&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cs.fit.edu/~mmahoney/compression/rationale.html&#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=cs.fit.edu&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Rationale for a large text compression benchmark&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Passive vs active agent</title>
      <link>https://tomrochette.com/questions/2020/01/10/</link>
      <pubDate>Fri, 10 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/10/</guid>
      <category>questions</category><category>artificial-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Are passive or active agents more intelligent?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;A passive agent is an agent that simply does its thing but does not interact with the environment.&lt;/p&gt;&#xA;&lt;p&gt;An active agent is an agent that actively interact with the environment.&lt;/p&gt;&#xA;&lt;p&gt;Given those two definitions, we expect the active agent to appear more intelligent because it behaves according to its environment and interacts with it. A passive agent may however also behave according to its environment, it just doesn&amp;rsquo;t try to alter it.&lt;/p&gt;&#xA;&lt;p&gt;Is an agent that never says anything necessarily dumb? Such agent could be hiding all the information of the world within itself, and could potentially solve any problem thrown at him, but it simply does not offer such answers because it doesn&amp;rsquo;t interact with the world. The relationship between the agent and the world is one-sided, from the environment (on)to the agent. From the outside, the agent looks like an inanimate object that doesn&amp;rsquo;t know anything nor can it do anything. But if you are able to peek inside, you can observe the most complex processes occurring. I would suggest that such agent is highly intelligent.&lt;/p&gt;&#xA;&lt;p&gt;In the stock market, we say that an investor is active if they regularly manage their portfolio, while a passive investor is one that manages their portfolio less frequently, depends on indexes instead of individual stocks and prefer to rely on the trend of stocks to make a profit. Active management is often compared to passive management as a benchmark, that is to say, you should not get involved in active management if your strategy cannot beat a simpler passive strategy. It is often the case that we see active investors as being foolish and more likely to lose money than passive investors.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/intelligence/&#34; &gt;Intelligence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>A general characteristic of simple programs that are able to learn complex behaviors</title>
      <link>https://tomrochette.com/questions/2020/01/09/</link>
      <pubDate>Thu, 09 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/09/</guid>
      <category>questions</category><category>artificial-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Is there a general characteristic of simple programs that are able to learn complex behaviors, such as neural network or RL-based algorithms that can be implemented in less than 100-250 lines?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t know yet.&lt;/p&gt;&#xA;&lt;p&gt;This question has come after thinking about DNA as being the code of human beings. DNA is also part of other animals, even viruses. Organisms use nucleotides to store the programs that are necessary to their existence. DNA is used to produce proteins within the body that accomplish various functions such as regulating our body, controlling our mood, our attention, our hunger, etc.&lt;/p&gt;&#xA;&lt;p&gt;This code has evolved since we were non-biological. From a large amount of randomness (chemical elements), nucleotides were formed, which then somehow led to the formation of DNA itself after a likely long process. If through randomness we moved from a chaotic world to one with order and structure, and where a chain of DNA could finally emerge, it would be interesting to investigate the process in further details to determine whether it could give us clues regarding the process of creating a program that could evolve the same way DNA did.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cellular_automaton&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cellular automaton&lt;/a&gt; are also interesting to study in that aspect. By defining a small set of rules, it is possible to generate and observe complex behaviors.&lt;/p&gt;&#xA;&lt;p&gt;One common behavior of cells is that they reproduce. As such, I would expect a program that can learn complex behaviors to have some reproductive function. &lt;a href=&#34;https://en.wikipedia.org/wiki/Life#Biology&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Reproduction&lt;/a&gt; is considered as one of the traits of an entity being alive. My idea here is that exploring how we were able to massively populate the Earth may provide us with ideas on how a bit of code learned to lengthen itself, by the same process increasing the size of its host as well as the complexity and variety of cells that compose it.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/genetics-based-agi/&#34; &gt;Genetics based AGI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/books/theory-of-self-reproducing-automata/&#34; &gt;Theory of self-reproducing automata&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/seed-ai/&#34; &gt;Seed AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/RNA_world&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;RNA world&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Abiogenesis&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Abiogenesis&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cellular_automaton&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Cellular automaton&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Conway&amp;rsquo;s Game of Life&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/A_New_Kind_of_Science&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;A New Kind of Science&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://archive.org/details/theoryofselfrepr00vonn_0&#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=archive.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;John Von Neumann - Theory of self-reproducing automata&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Will an AGI be superior to a large group of individuals?</title>
      <link>https://tomrochette.com/questions/2020/01/08/</link>
      <pubDate>Wed, 08 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/08/</guid>
      <category>questions</category><category>artificial-general-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Will an AGI be superior to a large group of individuals (e.g., society or a company)?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Most likely.&lt;/p&gt;&#xA;&lt;p&gt;An AGI may be a strong single-minded entity. Unlike societies and companies that are composed of numerous individuals with different values/beliefs/opinions (VBO), an AGI is expected to have a single set of clear, concise and non-contradicting VBO. An AGI should be able to explore all potential alternatives and reason about all the potential sets of VBO in order to determine the most coherent and appropriate set to hold.&lt;/p&gt;&#xA;&lt;p&gt;Meanwhile, we as individuals hold VBO that are often inconsistent. As a group, we are heterogenous in our VBO which means that conflict will arise since some sets of VBO cannot coexist. Our biggest issue is that we are competitive by nature. People fight over resources if they are limited. Fighting leads to winners and losers. The winners may not be necessarily the individuals with the &amp;ldquo;best&amp;rdquo; set of VBO. The fact that the &amp;ldquo;fittest&amp;rdquo; VBO may end up as the winner instead of the &amp;ldquo;best&amp;rdquo; set of VBO sounds unlikely to lead us to produce the optimal solution to a desired goal.&lt;/p&gt;&#xA;&lt;p&gt;(This assumes that there is a single &amp;ldquo;best&amp;rdquo; VBO set and not various VBOs sets in the heterarchy of VBOs.)&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Organizing unread content</title>
      <link>https://tomrochette.com/questions/2020/01/07/</link>
      <pubDate>Tue, 07 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/07/</guid>
      <category>questions</category><category>task-management</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can I organize all the webpages I never read?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;TL; DR&#xA;    &lt;div id=&#34;tl-dr&#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;#tl-dr&#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;Delete articles you know you will never read&lt;/li&gt;&#xA;&lt;li&gt;Add articles you&amp;rsquo;d like to read one day in a system such as &lt;a href=&#34;https://getpocket.com/&#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=getpocket.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pocket&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Track when articles are added to your &amp;ldquo;must-read&amp;rdquo; list, after 1 year &amp;ldquo;graduate&amp;rdquo; them by deleting them from the list&lt;/li&gt;&#xA;&lt;li&gt;Estimate how long an article takes to read and how much value you expect it will bring you&lt;/li&gt;&#xA;&lt;li&gt;Use the ROI to order your reading list&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The details&#xA;    &lt;div id=&#34;the-details&#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-details&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The following method applies to content online as well as offline (magazine article, books).&lt;/p&gt;&#xA;&lt;p&gt;The first, most important, and difficult strategy, is to simply let go of those articles. Most of the time, we keep certain things out of fear of missing out. We may also think that if at some point we have free time we&amp;rsquo;ll go through them, however that never happens. We always try to find something new instead. This can be seen as a way for the mind to communicate that it doesn&amp;rsquo;t think it would be worthwhile to spend its time reading this content so it&amp;rsquo;s better not to and instead we should look for alternative content to read.&lt;/p&gt;&#xA;&lt;p&gt;Once you&amp;rsquo;ve gotten rid of all those articles you decided you would never read you can add them to tracking systems such as pocket. The idea here is that it may be possible for you to read this content, but in other contexts than when you&amp;rsquo;re in front of your computer. Maybe you&amp;rsquo;d be likelier to read the article if you&amp;rsquo;re waiting in line or waiting for your bus/subway. Maybe you&amp;rsquo;d read it if you&amp;rsquo;re on your way to work.&lt;/p&gt;&#xA;&lt;p&gt;Track when you add articles to your list. The older an article becomes, the less likely you will be to read it. As articles reach a certain age, it might be time to graduate them to the graveyard, in other words, to never read them. Mark them as read or remove them from your reading list.&lt;/p&gt;&#xA;&lt;p&gt;You should have an idea of how long an article takes to read. Pocket offers an estimate of how long it takes to read an article. Knowing how long it takes to read an article is important since one of the techniques to get rid of articles is to go through all the short articles first since the time investment may be low.&lt;/p&gt;&#xA;&lt;p&gt;As in the case of task management, the strategy we will want to adopt to organize and prioritize our reading will be related to the return on investment (ROI) metric. Each article should have an estimate of the value it will bring you to read it (e.g., how much you would have paid to acquire this knowledge), as well as an estimate of the effort (duration, e.g., how long it takes to read the article according to pocket) necessary to go through it. You can then order your reading list from articles with the highest ROI to the least ROI and feel more confident that you are reading high (expected) value content.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How to prioritize which book to read</title>
      <link>https://tomrochette.com/questions/2020/01/06/</link>
      <pubDate>Mon, 06 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/06/</guid>
      <category>questions</category><category>task-management</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How can I easily identify the next book I should read when I have over 500 to choose from?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;TL; DR&#xA;    &lt;div id=&#34;tl-dr&#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;#tl-dr&#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;Pick highly read books&lt;/li&gt;&#xA;&lt;li&gt;Determine why you want to read, this will filter out many books from your list&lt;/li&gt;&#xA;&lt;li&gt;Track how long you&amp;rsquo;ve wanted to read a book, you&amp;rsquo;re more likely to read ones you recently added to your list&lt;/li&gt;&#xA;&lt;li&gt;Fiction: pick based on your tastes of the moment&lt;/li&gt;&#xA;&lt;li&gt;Non-fiction/technical: select a few books on the same topic, skim through them, then pick the best&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The details&#xA;    &lt;div id=&#34;the-details&#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-details&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;My first heuristic when deciding which book to read is to consider how many people have already read it by using a site such as goodreads. The reason is that I want to read books that I may be able to discuss with others who will also have read the book. Reading niche books might be interesting, but it makes discussing them a lot more difficult.&lt;/p&gt;&#xA;&lt;p&gt;For fiction books, I read books from a collection I&amp;rsquo;ve enjoyed at least one book. You could basically consider it book &amp;ldquo;social&amp;rdquo; proofing. For new books that are not part of a collection and from authors I&amp;rsquo;ve never read, I mostly decide based on my interests of the moment.&lt;/p&gt;&#xA;&lt;p&gt;For non-fiction/technical books, I skim through a few books on the same topic and determine which book I feel the most confident will provide me with the most information presented in the most appropriate and succinct way.&lt;/p&gt;&#xA;&lt;p&gt;Determining why you want to read will help you figure out what the most appropriate next book might be. You may want to relax and thus reading a technical book may not be appropriate while a fiction book would be. You may want to learn a new programming language and thus reading about a programming language you already know will not achieve that goal.&lt;/p&gt;&#xA;&lt;p&gt;I suggest using a book tracker like goodreads as it will allow you to track when you added a book to your list. This will let you know how long the book has been sitting in your reading list, waiting to be read. Generally, the longer a book stays &amp;ldquo;shelved&amp;rdquo; the less likely it is you will ever read it. This generalizes to stating that most books are read in a LIFO (last in, first out) fashion.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/managing-your-reading/&#34; &gt;Managing your reading&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>AI coach for video games</title>
      <link>https://tomrochette.com/questions/2020/01/05/</link>
      <pubDate>Sun, 05 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/05/</guid>
      <category>questions</category><category>artificial-intelligence</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How would you build an AI that could offer coaching for games like StarCraft or Dota/LoL?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I see coaching as similar to the loss function of a machine learning model. I also see coaching as trying to optimize a (program&amp;rsquo;s) function by figuring out where the largest improvements can be made. In order to provide effective and useful feedback, a coach should focus on the areas where the player shows the most potential for improvement. In a game like Starcraft, that would mean first pointing out the macro level mistakes then the micro level mistakes.&lt;/p&gt;&#xA;&lt;p&gt;To coach you need to have a model of which actions have an impact on the game and how much impact they have. A learning algorithm/model like AlphaZero generally exhibits two types of learning: learning from observation and learning by playing against itself.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learning from observation&#xA;    &lt;div id=&#34;learning-from-observation&#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;#learning-from-observation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Humans&#xA;    &lt;div id=&#34;humans&#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;#humans&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The most common approach to coaching is by observing more successful players than themselves. The learners may watch better players while the better players are playing the game and commenting on their gameplay or the learners may watch someone reviewing a replay and providing their own analysis. Both of these cases can be seen as models (the players) trying to explain their internals (the logic behind their actions).&lt;/p&gt;&#xA;&lt;p&gt;Coaching generally starts by trying to reproduce the recipe of someone else. You may not understand why they are doing certain things, but you do it yourself and you observe the results. As you practice repeating those same observations =&amp;gt; actions, you try to reproduce as closely as possible what the better player would do.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;AI&#xA;    &lt;div id=&#34;ai&#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;#ai&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;In the first learning phase, the model simply observes what happens during gameplay. In competitive games such as MOBA/RTS, the only reward signal is the victory/loss at the end of a game. As human beings, we quickly learn that winning a fight/encounter is good and losing it is bad. Those give use intermediate reward signals that an AI agent may not be able to build right away since it is conceptually difficult to determine when an encounter begins and ends. The agent could however learn a simple metric such as &lt;em&gt;the sum of the health of all units&lt;/em&gt;, where keeping this value high is generally a good thing.&lt;/p&gt;&#xA;&lt;p&gt;The model will need at some point to be able to establish its own scoring system so it can give itself some intermediate rewards during a game. It will also need to learn how to segment a sequence of actions into repeatable action units such as constructing unit X, attacking player Y, defending zone Z. As such, it may deem that constructing unit X is worth 5 units of reward, attacking player Y is worth no reward and that defending zone Z is worth 30 points of reward. The value of rewards may vary based on numerous factors, such as how much time has elapsed since the beginning of the game, the known enemy army composition, existing vision, etc.&lt;/p&gt;&#xA;&lt;p&gt;Having actions such as &amp;ldquo;attack coordinate X, Y&amp;rdquo; are a too low level. Your model will have to learn hierarchically complex actions such as &amp;ldquo;attack player X&amp;rdquo;, &amp;ldquo;attack the gatherers of player X&amp;rdquo;, &amp;ldquo;attack the weak gatherers of player X&amp;rdquo;, etc. which will then translate down the hierarchy to &amp;ldquo;attack unit at coordinate X, Y&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;An AI coach may look at hundreds or thousands of replays and observe the distribution of units allocation after 1, 2, 3, 5, 10, 15, 20 minutes (or every 5 seconds) into the game and their correlation to whether the player won or lost. It may look at the items purchased by the player in a MOBA game, their timing and their correlation to whether the player won or lost. For a human being to do similar thing would require a lot of time. Most would probably write scripts to automate the process of collecting those details instead of manually going through the replays one by one.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learning by playing against yourself&#xA;    &lt;div id=&#34;learning-by-playing-against-yourself&#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;#learning-by-playing-against-yourself&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Playing against yourself is more complicated. A perfect recording of your actions may not prove difficult to beat. It may send units to the wrong location on the map, be caught off guard moving to a location while you positioned units in the middle of the path, it may react to an attack the &amp;ldquo;replay&amp;rdquo; opponent had sent to its base at one point in the game, etc. It is however a start, one example you can train against.&lt;/p&gt;&#xA;&lt;p&gt;A lot of players who are invested in the game will do &lt;a href=&#34;https://en.wikipedia.org/wiki/Theorycraft&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;theorycrafting&lt;/a&gt; which is basically to use logic and reasoning in order to assess what to do in specific situations. They simulate various potential cases in their head and they devise plans to defeat them. While a human being may be able to devise a few dozen simulations over an hour, a computer may be able to generate hundreds of thousands. It may also be able to test them in a more accurate simulation environment. When game patches are released, it could rerun all the simulations it had generated to determine the impact of the patch on its existing strategies.&lt;/p&gt;&#xA;&lt;p&gt;An AI coach can be provided the game rules, specifically, which units are weak/strong against other units, and look at the game while you are playing. If you attack your opponent and the AI observes a strong concentration of a specific type of unit, and it notices you do not have any of the units that counter this unit type, it may suggest that you start building those as soon as possible. It may also notice that your unit composition is weak against the unit composition of your enemy and suggest units to build to balance your army and to be better prepare for the next encounter.&lt;/p&gt;&#xA;&lt;p&gt;We can see this act of theorycrafting as the equivalent of knowing, at a high level, the strategies and counter-strategies one can employ at an early point in the game, the same way you can learn the different opening moves in chess.&lt;/p&gt;&#xA;&lt;p&gt;In the case of learning by playing against yourself, what we want the AI coach to provide us is an opponent that will challenge our current biggest weaknesses so we can address them. In many cases certain specialized strategies will be extremely strong against a specific type of strategy and we will want to know those cases so we can use those strategies when the time is right.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Features we may want from an AI coach&#xA;    &lt;div id=&#34;features-we-may-want-from-an-ai-coach&#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;#features-we-may-want-from-an-ai-coach&#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;Determine your weaknesses/areas of improvement&lt;/li&gt;&#xA;&lt;li&gt;Suggest potential approaches to solve recurrent problems we have&lt;/li&gt;&#xA;&lt;li&gt;Suggest heuristics that may be easy to understand and follow as human beings&lt;/li&gt;&#xA;&lt;li&gt;Simulate opponents that would exert your current weaknesses so you can practice against them&lt;/li&gt;&#xA;&lt;li&gt;Collect various gameplay related statistics their associated success rate (number of units of type X after Y minutes, number of creeps killed after X minutes, items purchase order, build order, etc.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you were in an environment where you had access to very few replays, how would you learn the most out of those available?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How to prioritize numerous tasks</title>
      <link>https://tomrochette.com/questions/2020/01/04/</link>
      <pubDate>Sat, 04 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/04/</guid>
      <category>questions</category><category>task-management</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do you prioritize things when there are so many of them competing against one another?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;My approach to task prioritization, assuming that you have a list of tasks with no other information, involves adding information that will help you prioritize them.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Important/Urgent&#xA;    &lt;div id=&#34;importanturgent&#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;#importanturgent&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Assuming you are using an issue tracking system like Redmine, Notion.so or JIRA, I would add two new properties to each task: important and urgent. This approach is based on the &lt;a href=&#34;https://en.wikipedia.org/wiki/Time_management#The_Eisenhower_Method&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Eisenhower method&lt;/a&gt; of time management. You will want to go through all the tasks and determine whether they are important and whether they are urgent.&lt;/p&gt;&#xA;&lt;p&gt;With this first pass of information added to your tasks, you should be able to prioritize them in the following order:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Important/Urgent&lt;/li&gt;&#xA;&lt;li&gt;Important/Not urgent&lt;/li&gt;&#xA;&lt;li&gt;Not important/Urgent&lt;/li&gt;&#xA;&lt;li&gt;Not important/Not urgent&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;You should avoid as much as possible spending your time on tasks that are not important.&lt;/p&gt;&#xA;&lt;p&gt;This is the first step to prioritizing your task. It is a lightweight approach to prioritization which will also allow you to consider whether a task has any importance, something that is sometimes not considered and leads people to work on low priority/importance tasks.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Return on investment (ROI)&#xA;    &lt;div id=&#34;return-on-investment-roi&#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;#return-on-investment-roi&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At this point, we now assume that you have a lot of tasks that are not urgent but important. So many in fact that it is hard to decide which ones to do. It may feel like you&amp;rsquo;re back to square one, but now the important/urgent properties are not useful to order these tasks anymore since they all have the same value. This is where the return on investment (ROI) metric is useful.&lt;/p&gt;&#xA;&lt;p&gt;Similar to the important/urgent properties, we will add two new properties: estimated value (in dollars) and estimated effort (in hours). A third field, the ROI, is automatically derived from the previous two by computing estimated value divided by estimated effort.&lt;/p&gt;&#xA;&lt;p&gt;For each task, you will want to estimate to the best of your knowledge how much effort would be required to complete the task, as well as how much value you expect it to bring. Once you have those numbers for all your tasks, you should be able to order them by descending ROI. This will provide you with the list of tasks you should work on in order, as they are the ones likely to provide you with the highest amount of ROI, that is, the most value for the time spent.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;After ROI&#xA;    &lt;div id=&#34;after-roi&#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;#after-roi&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If at this point you still have many tasks that have the same ROI, you can first try to tackle the ones with the least amount of effort to get them out of the way and have quick wins.&lt;/p&gt;&#xA;&lt;p&gt;If you still have too many of your top ROI tasks with the same ROI value, my current approach cannot deal with this situation. It becomes a question of defining a higher level roadmap, determining which collection of features may have more impact than others, etc. It may also be possible to look into additional properties of the task, such as how long since they&amp;rsquo;ve been created and left incomplete.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/task-management/&#34; &gt;Task management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>When to stop working on a task</title>
      <link>https://tomrochette.com/questions/2020/01/03/</link>
      <pubDate>Fri, 03 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/03/</guid>
      <category>questions</category><category>task-management</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Given that you define a return on investment (ROI) on a task, when should you stop working on a task and abandon it given its cost?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s assume that your task has an estimate of effort (in hours) and an estimate of value (in dollars). The ROI is defined as the value divided by the effort ($/h).&lt;/p&gt;&#xA;&lt;p&gt;Before starting any task, you should define what is the minimal ROI a task should have to be considered (i.e., your ROI threshold). If you value your time at 50 $/h and a task has an estimated ROI of 25 $/h, then it is probably not worth your time to work on this task. Any task with a ROI superior to 50 $/h is considered worthwhile.&lt;/p&gt;&#xA;&lt;p&gt;A task should be reviewed at half the estimated effort duration. If you estimated the task will take 8h, then at 4h you should reevaluate whether you think you will finish the task in the remaining 4 hours. If 8h still stands, then you can proceed. If you believe you can accomplish the task in less time, then update your effort estimate. This should by the same act increase its ROI. If on the other hand you think that the task requires more time, then update the effort estimate as well. If you have increased your effort estimate, then I suggest reevaluating the task at the midpoint of the remaining effort (e.g., an 8h task updated to 12h would be first evaluated at 4h, then at 8h).&lt;/p&gt;&#xA;&lt;p&gt;Since you are updating your ROI estimate, you can also update your estimate of the value of the task you are working on. If it is a large task, maybe after having prototyped the idea you realize it will not provide as much value as anticipated. You can then review its value down. If on the other hand you get excited by what it brings to the table, by all means, increase its estimated value.&lt;/p&gt;&#xA;&lt;p&gt;Once you have adjusted the estimated effort and value, take a look at your estimated ROI. If it has gone below your threshold, consider dropping it. Investing additional time in it may provide less value than working on a new, more valuable task. If on the other hand, the ROI is still superior to your threshold, then continue working on the task.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/task-management/&#34; &gt;Task management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sunk_cost&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Sunk cost fallacy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/25666050-algorithms-to-live-by&#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=www.goodreads.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Algorithms to live by - Chapter on Optimal Stopping&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Determining a model usefulness</title>
      <link>https://tomrochette.com/questions/2020/01/02/</link>
      <pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/02/</guid>
      <category>questions</category><category>machine-learning</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;How do you determine whether you have a useful model?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In machine learning, one way you can determine that you have a useful model is to compare it against baseline models. In a field such as time series, one can create models that are based on previous values, such as lag 0, which predicts that the next value will be equal to the current value, or a moving average, which takes the X last values and averages them and returns this average as the next predicted value. In this field, we expect that a model that can predict more accurately than those baseline models may prove to be useful.&lt;/p&gt;&#xA;&lt;p&gt;In other cases, we may already have an existing model from which we can generate predictions. This model may also serve as a baseline which other models will have to beat in order to replace it.&lt;/p&gt;&#xA;&lt;p&gt;There is however a case where the answer isn&amp;rsquo;t clear: what happens when out of various models, one of the baseline models is the best? Then it becomes a question of whether the prediction interval produced by the model satisfies your needs for your problem.&lt;/p&gt;&#xA;&lt;p&gt;Note that even when you beat the baseline models, if the best model still does not satisfy the error requirements that have been defined on the metrics you care about, the model may still not be useful. For example, an OCR model that has 95% accuracy at the character level will still produce 5 errors every 100 characters, which may be too high for the requirements of the system to be produced.&lt;/p&gt;&#xA;&lt;p&gt;Another factor to keep in mind when comparing models is whether the improvements on the metric you are to optimize for are significant. The mean absolute error (MAE) may be lower for a model compared to another, but if its confidence interval is larger compared to the other model and their intervals overlap, then you cannot claim that one model is really better than the other. There may even be cases where you will prefer a model with higher MAE simply because its confidence interval is smaller than the other model with lower MAE but larger confidence interval.&lt;/p&gt;&#xA;&lt;p&gt;There might be other attributes of the model that you may need to take into account. A model that takes days to train may be useless when you need it to be up to date every hour. A faster to train but less accurate model may be more useful in this case.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Summary&#xA;    &lt;div id=&#34;summary&#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;#summary&#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;Can the model under evaluation beat baseline models?&lt;/li&gt;&#xA;&lt;li&gt;Does the model under evaluation satisfy error requirements?&lt;/li&gt;&#xA;&lt;li&gt;Is the model under evaluation significantly better than existing models?&lt;/li&gt;&#xA;&lt;li&gt;Does the model under evaluation satisfy requirements such as time to train (e.g., less than 6 hours) or necessary resources (cpu, gpu, ram)?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reducing our size for space exploration</title>
      <link>https://tomrochette.com/questions/2020/01/01/</link>
      <pubDate>Wed, 01 Jan 2020 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/questions/2020/01/01/</guid>
      <category>questions</category><category>space</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Question&#xA;    &lt;div id=&#34;question&#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;#question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Is reducing our size a viable alternative/approach to space exploration?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Answer&#xA;    &lt;div id=&#34;answer&#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;#answer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t have enough knowledge of physics to determine all the impacts that scaling ourselves down would have. There are a few things I would consider, such as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;the impact on being launched in space&#xA;&lt;ul&gt;&#xA;&lt;li&gt;do we need less energy?&lt;/li&gt;&#xA;&lt;li&gt;are there other means to get us in space if we&amp;rsquo;re smaller?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;our ability to accelerate/decelerate in space&#xA;&lt;ul&gt;&#xA;&lt;li&gt;what kind of technology can we use?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;our ability to send communication signals back on earth&#xA;&lt;ul&gt;&#xA;&lt;li&gt;given our small size, how can we produce enough power for the signal to be received?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;are there physical phenomenons that we need to take into account due to our reduced size?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;When I asked myself this question, I was reading &lt;a href=&#34;https://www.goodreads.com/book/show/17863.Accelerando&#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=www.goodreads.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Accelerando&lt;/a&gt;, where a crew is sent far in space in a &amp;ldquo;can&amp;rdquo;. I always perceived it as being the size of a soft drink can and I thought that was an interesting idea. In the book they are not shipping human beings, but rather a simulation of their consciousness. In other words, they&amp;rsquo;re sending an AI in a can™. I&amp;rsquo;ve also thought of this as explaining why we&amp;rsquo;ve never been visited by aliens. Maybe one of the steps in evolution or progress is that we are able to scale ourselves down so that we are not as visible as we currently are. Imagine being an ant colony instead of the human society, our footprint would be a lot less noticeable from outer space. Furthermore, if you were to travel in a can, it would be a lot more difficult to detect you than if you were travelling in an extremely large ship.&lt;/p&gt;&#xA;&lt;p&gt;The benefit I could see from being able to reduce the size of our satellites or vessels is that less mass is required to be turned into a spacecraft, which could allow us to create many more spacecrafts for the same amount of materials.&lt;/p&gt;&#xA;&lt;p&gt;This question is also reminiscent of movies like &lt;a href=&#34;https://en.wikipedia.org/wiki/Honey,_I_Shrunk_the_Kids&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Honey, I shrunk the Kids&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Downsizing_%28film%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Downsizing&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Ant-Man_%28film%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Ant-Man&lt;/a&gt; or even a recent &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Ricks_Must_Be_Crazy&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Rick &amp;amp; Morty episode&lt;/a&gt;. They explore the differences between full and miniature scales.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Quantum computing</title>
      <link>https://tomrochette.com/quantum-computing/</link>
      <pubDate>Sat, 21 Dec 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/quantum-computing/</guid>
      
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Notes&#xA;    &lt;div id=&#34;notes&#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;#notes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;0 and 1 cbits (classical bits)&#xA;    &lt;div id=&#34;0-and-1-cbits-classical-bits&#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;#0-and-1-cbits-classical-bits&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;$$&#xA;\left| 0 \right&gt; =&#xA;\begin{pmatrix}&#xA;1\\&#xA;0&#xA;\end{pmatrix}&#xA;$$$$&#xA;\left| 1 \right&gt; =&#xA;\begin{pmatrix}&#xA;0\\&#xA;1&#xA;\end{pmatrix}&#xA;$$&lt;ul&gt;&#xA;&lt;li&gt;Quantum computers only use reversible operations&lt;/li&gt;&#xA;&lt;li&gt;Identity and Negation are reversible&lt;/li&gt;&#xA;&lt;li&gt;Constant-0 and Constant-1 aare not reversible&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Tensor product of vectors&#xA;    &lt;div id=&#34;tensor-product-of-vectors&#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;#tensor-product-of-vectors&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\begin{pmatrix}&#xA;x_0\x_1&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;y_0\y_1&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix&#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;#endpmatrix&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;\begin{pmatrix}&#xA;x_0&#xA;\begin{pmatrix}&#xA;y_0\y_1&#xA;\end{pmatrix}\x_1&#xA;\begin{pmatrix}&#xA;y_0\y_1&#xA;\end{pmatrix}&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-1&#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;#endpmatrix-1&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;x_0y_0\&#xA;x_0y_1\&#xA;x_1y_0\&#xA;x_1y_1&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\begin{pmatrix}&#xA;1\2&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;3\4&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-2&#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;#endpmatrix-2&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;3\&#xA;4\&#xA;6\&#xA;8&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Multiple cbits representation&#xA;    &lt;div id=&#34;multiple-cbits-representation&#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;#multiple-cbits-representation&#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;This tensored representation is called the &lt;strong&gt;product state&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\left| 00 \right&amp;gt; =&#xA;\begin{pmatrix}&#xA;1\&#xA;0&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;1\&#xA;0&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-3&#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;#endpmatrix-3&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;1\&#xA;0\&#xA;0\&#xA;0\&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\left| 01 \right&amp;gt; =&#xA;\begin{pmatrix}&#xA;1\&#xA;0&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;0\&#xA;1&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-4&#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;#endpmatrix-4&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;0\&#xA;1\&#xA;0\&#xA;0\&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\left| 10 \right&amp;gt; =&#xA;\begin{pmatrix}&#xA;0\&#xA;1&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;1\&#xA;0&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-5&#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;#endpmatrix-5&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;0\&#xA;0\&#xA;1\&#xA;0\&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\left| 11 \right&amp;gt; =&#xA;\begin{pmatrix}&#xA;0\&#xA;1&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;0\&#xA;1&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-6&#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;#endpmatrix-6&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;0\&#xA;0\&#xA;0\&#xA;1\&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;\left| 4 \right&amp;gt; =&#xA;\left| 100 \right&amp;gt; =&#xA;\begin{pmatrix}&#xA;0\&#xA;1&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;1\&#xA;0&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;1\&#xA;0&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-7&#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;#endpmatrix-7&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\begin{pmatrix}&#xA;0\&#xA;0\&#xA;0\&#xA;0\&#xA;1\&#xA;0\&#xA;0\&#xA;0\&#xA;\end{pmatrix}&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;CNOT&#xA;    &lt;div id=&#34;cnot&#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;#cnot&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;$$&#xA;C =&#xA;\begin{pmatrix}&#xA;1 &amp; 0 &amp; 0 &amp; 0\\&#xA;0 &amp; 1 &amp; 0 &amp; 0\\&#xA;0 &amp; 0 &amp; 0 &amp; 1\\&#xA;0 &amp; 0 &amp; 1 &amp; 0\\&#xA;\end{pmatrix}&#xA;$$&#xA;&lt;h1 class=&#34;relative group&#34;&gt;$$&#xA;C\left| 10 \right&amp;gt; =&#xA;C&#xA;\begin{pmatrix}&#xA;\begin{pmatrix}&#xA;0\&#xA;1\&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;1\&#xA;0\&#xA;\end{pmatrix}&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-8&#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;#endpmatrix-8&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;\begin{pmatrix}&#xA;1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0\&#xA;0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0\&#xA;0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1\&#xA;0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0\&#xA;\end{pmatrix}&#xA;\begin{pmatrix}&#xA;0\&#xA;0\&#xA;1\&#xA;0\&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-9&#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;#endpmatrix-9&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;\begin{pmatrix}&#xA;0\&#xA;0\&#xA;0\&#xA;1\&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-10&#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;#endpmatrix-10&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;\begin{pmatrix}&#xA;0\&#xA;1\&#xA;\end{pmatrix}&#xA;\otimes&#xA;\begin{pmatrix}&#xA;0\&#xA;1\&#xA;\end{pmatrix}&#xA;    &lt;div id=&#34;endpmatrix-11&#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;#endpmatrix-11&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;\left| 11 \right&amp;gt;&#xA;$$&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=F_Riqjdh2oM&#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=www.youtube.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.youtube.com/watch?v=F_Riqjdh2oM&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Python profiling</title>
      <link>https://tomrochette.com/processes/python-profiling/</link>
      <pubDate>Fri, 20 Dec 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/python-profiling/</guid>
      <category>programming</category><category>python</category><category>processes</category>
      <description>&lt;p&gt;Run your program with &lt;code&gt;python -m cProfile -o profile.cprofile my-script.py&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Install &lt;code&gt;snakeviz&lt;/code&gt; (&lt;code&gt;uv pip install snakeviz&lt;/code&gt;) to visualize the generated profile.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;snakeviz profile.cprofile &lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Alternative approach&lt;/p&gt;&#xA;&lt;p&gt;Install &lt;code&gt;pyprof2calltree&lt;/code&gt; to convert the cprofile to a kcachegrind compatible profile.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;pyprof2calltree -i profile.cprofile -o callgrind.profile.cprofile&lt;/code&gt;&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://benbernardblog.com/tracking-down-a-freaky-python-memory-leak/&#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=benbernardblog.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://benbernardblog.com/tracking-down-a-freaky-python-memory-leak/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tech.buzzfeed.com/finding-and-fixing-memory-leaks-in-python-413ce4266e7d&#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=tech.buzzfeed.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://tech.buzzfeed.com/finding-and-fixing-memory-leaks-in-python-413ce4266e7d&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://varblog.org/blog/2018/05/24/profiling-and-optimizing-machine-learning-model-training-with-pytorch/&#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=varblog.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://varblog.org/blog/2018/05/24/profiling-and-optimizing-machine-learning-model-training-with-pytorch/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>RFC</title>
      <link>https://tomrochette.com/processes/rfc/</link>
      <pubDate>Sun, 17 Nov 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/rfc/</guid>
      <category>teamwork</category><category>processes</category><category>software-development</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Keep all RFCs under a single location&lt;/li&gt;&#xA;&lt;li&gt;Uniquely identify RFCs&lt;/li&gt;&#xA;&lt;li&gt;Use a shared template&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Editor: Name &amp;lt;email&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Status: Draft/Review/Approved/Abandoned/Implemented&lt;/li&gt;&#xA;&lt;li&gt;Required approvers: Name &amp;lt;email&amp;gt; (why), Name &amp;lt;email&amp;gt; (why), &amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;Approvers: Name &amp;lt;email&amp;gt; (date), Name &amp;lt;email&amp;gt; (date), &amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;Created on: &amp;lt;date&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Updated on: &amp;lt;date&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Overview: A high level description of what you&amp;rsquo;re describing in the document&lt;/li&gt;&#xA;&lt;li&gt;Background/Context: Context relevant to understanding the document&lt;/li&gt;&#xA;&lt;li&gt;Problem description: Describe what you are currently cannot do and want to be able to do&lt;/li&gt;&#xA;&lt;li&gt;Motivation/Why: Why is it relevant to solve this problem now?&lt;/li&gt;&#xA;&lt;li&gt;Drawbacks/Why not: What are the downsides of solving this problem?&lt;/li&gt;&#xA;&lt;li&gt;Proposed solution: What is the best solution proposed?&lt;/li&gt;&#xA;&lt;li&gt;Alternative solutions: What are the alternative solutions considered and why aren&amp;rsquo;t they the proposed solution?&lt;/li&gt;&#xA;&lt;li&gt;Impact and risks: What will be the impact of this change on existing systems, processes, or stakeholders?&lt;/li&gt;&#xA;&lt;li&gt;Unresolved questions: What are the questions that need to be answered but don&amp;rsquo;t have an answer to yet?&lt;/li&gt;&#xA;&lt;li&gt;References: Documents/URLs that can be useful to consult&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If a RFC is abandoned, the reasons why should be made explicit in the document&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Request_for_Comments&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Request_for_Comments&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rust-lang/rfcs/blob/master/0000-template.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/rust-lang/rfcs/blob/master/0000-template.md&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wiki.en.it-processmaps.com/index.php/Checklist_Request_for_Change_RFC&#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=wiki.en.it-processmaps.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://wiki.en.it-processmaps.com/index.php/Checklist_Request_for_Change_RFC&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Sourcegraph RFC template: &lt;a href=&#34;https://docs.google.com/document/d/1TRVmwpLzTgYWhBqPwkSWpzPYvXI3Z2miJSmBN2G7ygc/edit&#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.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://docs.google.com/document/d/1TRVmwpLzTgYWhBqPwkSWpzPYvXI3Z2miJSmBN2G7ygc/edit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://about.sourcegraph.com/handbook/engineering/rfcs&#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=about.sourcegraph.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://about.sourcegraph.com/handbook/engineering/rfcs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.pragmaticengineer.com/scaling-engineering-teams-via-writing-things-down-rfcs/&#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=blog.pragmaticengineer.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://blog.pragmaticengineer.com/scaling-engineering-teams-via-writing-things-down-rfcs/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/golang/proposal/blob/master/design/TEMPLATE.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/golang/proposal/blob/master/design/TEMPLATE.md&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Repositories with RFCs&#xA;    &lt;div id=&#34;repositories-with-rfcs&#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;#repositories-with-rfcs&#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://github.com/rust-lang/rfcs&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/rust-lang/rfcs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/reactjs/rfcs&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/reactjs/rfcs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/yarnpkg/rfcs&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/yarnpkg/rfcs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Investing</title>
      <link>https://tomrochette.com/processes/investing/</link>
      <pubDate>Sun, 06 Oct 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/investing/</guid>
      <category>investing</category><category>processes</category>
      <description>&lt;p&gt;Note that most of the process is guided by a long term investment strategy. In other words, we expect to keep the assets we purchase for as long as possible, only selling to rebalance our portfolio.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Do not put all your eggs in one basket (stock), diversify.&lt;/li&gt;&#xA;&lt;li&gt;Use indexes to determine which stocks to buy.&lt;/li&gt;&#xA;&lt;li&gt;Start small (10% of what you want to invest in total) and do not invest everything at once, learn from your mistakes.&lt;/li&gt;&#xA;&lt;li&gt;Do not sell when your stock drops, as it will drop in value at some point while you&amp;rsquo;re holding it&lt;/li&gt;&#xA;&lt;li&gt;When you start, there will be a period of time where some of your stocks value will go into the negative. Ignore it and wait a few months before deciding whether to part from it or not.&lt;/li&gt;&#xA;&lt;li&gt;Pick stocks with good $R^2$ score and positive slope.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The idea here is that we want to invest in stocks which have shown to be highly predictable in the past, while also displaying linear growth (as such, this is not a useful indicator for stocks which have explosive growth).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Invest some percentage of the portfolio in stocks which provide regular dividends, this is to replace holding &amp;ldquo;high yield&amp;rdquo; saving accounts.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Opt to invest in REIT, which will offer monthly dividends as well as attractive growth in their value while you hold them.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If you want to keep things simple for yourself, buy ETFs.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;VFV.TO is an ETF that tracks the S&amp;amp;P 500 in CAD and has a low expense ratio.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Compare your portfolio&amp;rsquo;s performance against indexes.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you perform more poorly than indexes over 6 months/1 year, sell the stocks you have and buy the index you compare against.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Meetings</title>
      <link>https://tomrochette.com/processes/meetings/</link>
      <pubDate>Fri, 14 Jun 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/meetings/</guid>
      <category>teamwork</category><category>processes</category><category>work</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Before&#xA;    &lt;div id=&#34;before&#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;#before&#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;Write/prepare an agenda listing the items to be discussed&lt;/li&gt;&#xA;&lt;li&gt;Indicate the duration and responsible/lead of each&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Aim for a meeting to last under an hour. If more time appears to be required, then prior work should be done in order to reduce the amount of time necessary for the meeting.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Define the list of invitees, try to keep it short, possibly under 6 people&lt;/li&gt;&#xA;&lt;li&gt;Share the agenda with all the attendees&lt;/li&gt;&#xA;&lt;li&gt;Schedule the meeting around boundaries (beginning/end of day, before/after lunch)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;During&#xA;    &lt;div id=&#34;during&#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;#during&#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;Present the agenda&lt;/li&gt;&#xA;&lt;li&gt;Designate a person that will make sure that the agenda is respected&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;At the end&#xA;    &lt;div id=&#34;at-the-end&#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;#at-the-end&#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;Determine next actions&lt;/li&gt;&#xA;&lt;li&gt;Define deadlines for each next action&lt;/li&gt;&#xA;&lt;li&gt;Assign a responsible for each next action&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;After the meeting&#xA;    &lt;div id=&#34;after-the-meeting&#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;#after-the-meeting&#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;Create tasks in a task tracking system for the next actions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Recurrent meetings&#xA;    &lt;div id=&#34;recurrent-meetings&#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;#recurrent-meetings&#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;In the case where a recurrent meeting needs to be scheduled at a different time than usual, specify in the body of the message the reason of the change.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://vadimkravcenko.com/en/how-to-run-efficient-meetings-with-engineers/&#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=vadimkravcenko.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://vadimkravcenko.com/en/how-to-run-efficient-meetings-with-engineers/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Task management</title>
      <link>https://tomrochette.com/processes/task-management/</link>
      <pubDate>Sun, 26 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/task-management/</guid>
      <category>time-management</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps to create a task&#xA;    &lt;div id=&#34;steps-to-create-a-task&#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;#steps-to-create-a-task&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Give it a title&lt;/li&gt;&#xA;&lt;li&gt;Decide if it&amp;rsquo;s important or not&lt;/li&gt;&#xA;&lt;li&gt;Decide if it&amp;rsquo;s urgent or not&lt;/li&gt;&#xA;&lt;li&gt;Estimate the effort required to accomplish the task (in hours)&lt;/li&gt;&#xA;&lt;li&gt;Estimate the value the task brings (in $)&lt;/li&gt;&#xA;&lt;li&gt;Give it at least one label&lt;/li&gt;&#xA;&lt;li&gt;Give it an assignee&lt;/li&gt;&#xA;&lt;li&gt;Give a description if necessary&lt;/li&gt;&#xA;&lt;li&gt;Set a deadline if possible&lt;/li&gt;&#xA;&lt;li&gt;Set status to Unprioritized (ideally automatically/default)&lt;/li&gt;&#xA;&lt;li&gt;Indicate who requested the task&lt;/li&gt;&#xA;&lt;li&gt;Indicate which users/how many users would be affected by the task&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Task creation&#34;&#xA;    width=&#34;1038&#34;&#xA;    height=&#34;736&#34;&#xA;    src=&#34;https://tomrochette.com/processes/task-management/images/Task-creation_hu_4eeef2ee104a84fa.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/processes/task-management/images/Task-creation_hu_4eeef2ee104a84fa.png 800w, https://tomrochette.com/processes/task-management/images/Task-creation.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/processes/task-management/images/Task-creation.png&#34;&gt;&lt;/figure&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Task states&#34;&#xA;    width=&#34;1200&#34;&#xA;    height=&#34;800&#34;&#xA;    src=&#34;https://tomrochette.com/processes/task-management/images/Task-states_hu_c5e0d458afa7911b.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/processes/task-management/images/Task-states_hu_c5e0d458afa7911b.png 800w, https://tomrochette.com/processes/task-management/images/Task-states.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/processes/task-management/images/Task-states.png&#34;&gt;&lt;/figure&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Statuses&#xA;    &lt;div id=&#34;statuses&#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;#statuses&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Unprioritized&lt;/code&gt;: New task are created as unprioritized, so as to avoid having to put them in a state immediately when creating them.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Won&#39;t do&lt;/code&gt;: A task that ends up not being relevant or useful will not be acted further upon and set to &amp;ldquo;Won&amp;rsquo;t do&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Backlog&lt;/code&gt;: A task that is not of priority at the moment but something that would be worthwhile to do at some point in the future (although maybe never due to other priorities).&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Queue&lt;/code&gt;: A task with a priority that is not high enough to be done immediately but that should be done in the near future.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Scheduled&lt;/code&gt;: A task that has been scheduled to be done by a specific date.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Today&lt;/code&gt;: A task that is scheduled to be done today. Tasks picked from the queue are moved to today.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;In progress&lt;/code&gt;: Tasks that are were in progress yesterday but aren&amp;rsquo;t blocked, waiting, or done are moved back to today, the queue, or the backlog.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Blocked&lt;/code&gt;: A task that is blocked by something else. The task should be moved back to today when it is unblocked.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Waiting&lt;/code&gt;: A task that is waiting for something to happen before it can be worked on. The task should be moved back to today when it is unblocked. The difference between a blocked task and a waiting task is that a blocked task is blocked by something that is not under your control, while a waiting task is blocked by something that is under your control.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Done&lt;/code&gt;: A task that has been completed and does not require further action.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;During a workday&#xA;    &lt;div id=&#34;during-a-workday&#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;#during-a-workday&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Go through the tasks in the Do section, then the Decide section, then Delegate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Important/Urgent&#xA;    &lt;div id=&#34;importanturgent&#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;#importanturgent&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Use Eisenhower matrix to determine task importance/urgency&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tasks that are not important/not urgent are moved to the backlog.&lt;/li&gt;&#xA;&lt;li&gt;Tasks that are not important/urgent are delegated to someone else.&lt;/li&gt;&#xA;&lt;li&gt;Tasks that are important/not urgent should be scheduled.&lt;/li&gt;&#xA;&lt;li&gt;Tasks that are important/urgent should be done ASAP.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Effort/Value/ROI&#xA;    &lt;div id=&#34;effortvalueroi&#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;#effortvalueroi&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Using the estimated effort and estimated value of a task, you can compute the return on investment (ROI) of the task as estimated value divided by estimated effort.&#xA;For example, a task you estimate is worth 100 $ and takes 2 hours to complete will have a ROI of 50 $/h.&lt;/p&gt;&#xA;&lt;p&gt;Use the ROI of your tasks to prioritize them. You will want to complete the tasks which are likely to have the best return on investment.&lt;/p&gt;&#xA;&lt;p&gt;The ROI metric will also give you clues about the task you should probably not spend your time on. If you are paid 50 $/h and a task has a ROI less than 50 $/h, then it should probably be moved to the backlog and only reconsidered if its ROI changes.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Task processing&#xA;    &lt;div id=&#34;task-processing&#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;#task-processing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Unprioritized&lt;/code&gt; tasks should be moved to &lt;code&gt;Queued&lt;/code&gt;, given their priority compared to already queued tasks.&lt;/li&gt;&#xA;&lt;li&gt;You should attempt to keep the &lt;code&gt;Unprioritized&lt;/code&gt; tasks count to 0.&lt;/li&gt;&#xA;&lt;li&gt;A task that is &lt;code&gt;Queued&lt;/code&gt; should have a deadline date.&lt;/li&gt;&#xA;&lt;li&gt;Work on tasks &lt;code&gt;In progress&lt;/code&gt; first, then take tasks from &lt;code&gt;Today&lt;/code&gt;, then from &lt;code&gt;Queued&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;When moving a task to &lt;code&gt;Blocked&lt;/code&gt; or &lt;code&gt;Waiting&lt;/code&gt;, add a comment indicating why it is blocked/waiting and what needs to happen for it to be unblocked.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Task processing loop&#34;&#xA;    width=&#34;1280&#34;&#xA;    height=&#34;402&#34;&#xA;    src=&#34;https://tomrochette.com/processes/task-management/images/Task-processing-loop_hu_d242938ba7def27b.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/processes/task-management/images/Task-processing-loop_hu_d242938ba7def27b.png 800w, https://tomrochette.com/processes/task-management/images/Task-processing-loop.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/processes/task-management/images/Task-processing-loop.png&#34;&gt;&lt;/figure&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Task management progression&#xA;    &lt;div id=&#34;task-management-progression&#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;#task-management-progression&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve never done task management before, I suggest you do not start by applying all the above at once.&#xA;First, start by simply recording the tasks you need to get done (title only).&#xA;Once you&amp;rsquo;ve recorded most of the tasks you have to deal with, start giving them an important/urgent assignation.&#xA;It will help you rapidly determine which tasks should be done and which ones are nice to have, but not critical, or even not really useful if you think about it.&#xA;Once you are able to have this information for most of your tasks, then you should start giving them effort and value estimates.&#xA;Once you&amp;rsquo;ve reached this point, you will have a much better grasp on the importance of your tasks, as well as their potential impact in terms of value, as well as to the amount of effort it will require from you.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Fields&#xA;    &lt;div id=&#34;fields&#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;#fields&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Title&lt;/code&gt; (string): a high level description of the task in one sentence.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Labels&lt;/code&gt;: a set of short identifiers relevant to the task.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Status&lt;/code&gt;: the status of the task (see Statuses above).&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Assignee&lt;/code&gt;: who is assigned to complete the task.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Important&lt;/code&gt;: is it important or not?&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Urgent&lt;/code&gt;: is it urgent or not?&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Estimated effort&lt;/code&gt;: effort to complete the task (in hours).&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Estimated value&lt;/code&gt;: estimated value of completing the task (in $).&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Description&lt;/code&gt;: a long description of what the task is about, possibly containing more context and a TODO list.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Deadline&lt;/code&gt;: a time by which the task should be done or may result in the task losing value or causing issues.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Who requested&lt;/code&gt;: the person who requested the task to be completed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Who is impacted&lt;/code&gt;: the people that will be impacted by the completion of the task.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Notes&#xA;    &lt;div id=&#34;notes&#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;#notes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tasks should not remain in the &lt;code&gt;In progress&lt;/code&gt; state for extended periods of time. After approximately a week in that state, I would suggest re-evaluating whether this task is still &lt;code&gt;In progress&lt;/code&gt; or should be moved back into the &lt;code&gt;Backlog&lt;/code&gt;, &lt;code&gt;Queued&lt;/code&gt;, &lt;code&gt;Scheduled&lt;/code&gt; or &lt;code&gt;Today&lt;/code&gt; state. The same should apply to the &lt;code&gt;Waiting&lt;/code&gt; and &lt;code&gt;Blocked&lt;/code&gt; states.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/03/&#34; &gt;Given that you define a return on investment (ROI) on a task, when should you stop working on a task and abandon it given its cost?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/questions/2020/01/04/&#34; &gt;How do you prioritize things when there are so many of them competing against one another?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing bug tickets</title>
      <link>https://tomrochette.com/processes/writing-bug-tickets/</link>
      <pubDate>Sun, 26 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/writing-bug-tickets/</guid>
      <category>software-development</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Ticket content&#xA;    &lt;div id=&#34;ticket-content&#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;#ticket-content&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Summary&lt;/li&gt;&#xA;&lt;li&gt;Software version&lt;/li&gt;&#xA;&lt;li&gt;Reproducible in latest version?&lt;/li&gt;&#xA;&lt;li&gt;Environment details: compiler/interpreter, operating system, etc.&lt;/li&gt;&#xA;&lt;li&gt;Steps to reproduce&lt;/li&gt;&#xA;&lt;li&gt;Expected results&lt;/li&gt;&#xA;&lt;li&gt;Actual results&lt;/li&gt;&#xA;&lt;li&gt;Screen capture (if relevant)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://codingnest.com/how-to-file-a-good-bug-report/&#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=codingnest.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://codingnest.com/how-to-file-a-good-bug-report/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://testlio.com/blog/the-ideal-bug-report/&#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=testlio.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://testlio.com/blog/the-ideal-bug-report/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reviewing code</title>
      <link>https://tomrochette.com/processes/reviewing-code/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/reviewing-code/</guid>
      <category>software-development</category><category>processes</category>
      <description>&lt;p&gt;The most up to date version of this process is available as a &lt;a href=&#34;https://github.com/tomzx/dot-claude/blob/main/commands/pr-review.md&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Claude command in my &lt;code&gt;dot-claude&lt;/code&gt; repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Verify that the build/tests pass&lt;/li&gt;&#xA;&lt;li&gt;Read the issue title and description&lt;/li&gt;&#xA;&lt;li&gt;New code&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Understand the feature and associated requirements that are supposed to be implemented&lt;/li&gt;&#xA;&lt;li&gt;Verify code implements the desired feature and that the requirements are completed&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;New/Changed code&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Check code contains tests&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Is all the new code covered by those tests?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Verify the location of new/moved files&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Are the files in the right directory?&lt;/li&gt;&#xA;&lt;li&gt;Are they appropriately named?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Verify classes, methods, functions, parameters naming&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Are they significant of their purpose?&lt;/li&gt;&#xA;&lt;li&gt;Are they clear enough?&lt;/li&gt;&#xA;&lt;li&gt;Are they respecting the naming convention?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Does the code respect &lt;a href=&#34;https://en.wikipedia.org/wiki/SOLID&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;SOLID&lt;/a&gt;?&lt;/li&gt;&#xA;&lt;li&gt;Consider that when functions/methods signature change, code may now be backward incompatible.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Discuss whether this is necessary&lt;/li&gt;&#xA;&lt;li&gt;Backward incompatible changes should be documented&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In a weak typed or type hinted language, are parameters and return of functions/methods typed?&lt;/li&gt;&#xA;&lt;li&gt;Are there TODOs that should be completed within this review?&lt;/li&gt;&#xA;&lt;li&gt;Check code for code style issues&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Bug fix&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Verify that the fix is applied at the right location and will not &amp;ldquo;fix the symptoms, not the cause&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;When reviewing&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Provide specific and actionable feedback&lt;/li&gt;&#xA;&lt;li&gt;Clearly mark nitpicks and optional comments&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Alternatively, use an approach such as &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc2119&#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=datatracker.ietf.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;RFC2219&lt;/a&gt; where you indicate whether a change is a MUST, SHOULD, or MAY&lt;/li&gt;&#xA;&lt;li&gt;I&amp;rsquo;ve used traffic light color emojis to communicate 🔴 MUST, 🟡 SHOULD, 🟢 MAY&lt;/li&gt;&#xA;&lt;li&gt;Another emoji based option is &lt;a href=&#34;https://gitmoji.dev/&#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=gitmoji.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;gitmoji&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Assume competence&lt;/li&gt;&#xA;&lt;li&gt;Provide rationale or context&lt;/li&gt;&#xA;&lt;li&gt;Consider how comments may be interpreted&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t criticize the person, criticize the code&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t use harsh language&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Reference&#xA;    &lt;div id=&#34;reference&#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;#reference&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/SOLID&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/SOLID&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/palantir/code-review-best-practices-19e02780015f&#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=medium.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://medium.com/palantir/code-review-best-practices-19e02780015f&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://phauer.com/2018/code-review-guidelines/&#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=phauer.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://phauer.com/2018/code-review-guidelines/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://smartbear.com/learn/code-review/guide-to-code-review-process/&#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=smartbear.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://smartbear.com/learn/code-review/guide-to-code-review-process/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/&#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=smartbear.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nyu-cds.github.io/effective-code-reviews/03-checklist/&#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=nyu-cds.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://nyu-cds.github.io/effective-code-reviews/03-checklist/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://google.github.io/eng-practices/&#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=google.github.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://google.github.io/eng-practices/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://testing.googleblog.com/2019/11/code-health-respectful-reviews-useful.html&#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=testing.googleblog.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://testing.googleblog.com/2019/11/code-health-respectful-reviews-useful.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.18f.gov/code-review/&#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=engineering.18f.gov&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://engineering.18f.gov/code-review/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://conventionalcomments.org/&#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=conventionalcomments.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://conventionalcomments.org/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ee/development/code_review.html&#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.gitlab.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://docs.gitlab.com/ee/development/code_review.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gitmoji.dev/&#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=gitmoji.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://gitmoji.dev/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Software project basics</title>
      <link>https://tomrochette.com/processes/software-project-basics/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/software-project-basics/</guid>
      <category>software-development</category><category>processes</category><category>ai-feedback</category><category>llm=gpt-oss-120b</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Code changes are stored in git&lt;/li&gt;&#xA;&lt;li&gt;Setup continuous integration (e.g., GitHub Actions)&lt;/li&gt;&#xA;&lt;li&gt;Use dependency management (e.g., uv)&lt;/li&gt;&#xA;&lt;li&gt;Have a testing framework (e.g., pytest)&lt;/li&gt;&#xA;&lt;li&gt;Define a code standard, enforced through tools and not documentation (e.g., ruff)&lt;/li&gt;&#xA;&lt;li&gt;Prefer typed function/method over dynamic types&lt;/li&gt;&#xA;&lt;li&gt;On every commit to git&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Code quality check&lt;/li&gt;&#xA;&lt;li&gt;Code style check&lt;/li&gt;&#xA;&lt;li&gt;Unit/functional/integration/system tests&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Code coverage should be recorded during tests and a report made available&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Prior to pushing&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use an LLM tool to review the changes to identify potential issues&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;On pushes, the CI should&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Code quality check&lt;/li&gt;&#xA;&lt;li&gt;Code style check&lt;/li&gt;&#xA;&lt;li&gt;Unit/functional/integration/system tests&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;A project repository must have&#xA;&lt;ul&gt;&#xA;&lt;li&gt;a &lt;code&gt;README.md&lt;/code&gt; explaining how to run the project on your own computer&lt;/li&gt;&#xA;&lt;li&gt;a &lt;code&gt;RELEASING.md&lt;/code&gt; explaining how to release the code&lt;/li&gt;&#xA;&lt;li&gt;a &lt;code&gt;CHANGELOG.md&lt;/code&gt; listing relevant changes made&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Responsibilities are made explicit in terms of roles&lt;/li&gt;&#xA;&lt;li&gt;Critical roles, such as project lead, must have a backup/shadow individual&lt;/li&gt;&#xA;&lt;li&gt;Setup telemetry, alerts, profiling, logging&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Web applications</title>
      <link>https://tomrochette.com/processes/web-applications/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/web-applications/</guid>
      <category>software-development</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;General&#xA;    &lt;div id=&#34;general&#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;#general&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;3 different environments: development, staging, production&lt;/li&gt;&#xA;&lt;li&gt;Write migrations for schema changes&lt;/li&gt;&#xA;&lt;li&gt;Use ORM if possible over raw queries&lt;/li&gt;&#xA;&lt;li&gt;Always make it possible for testers to report the version they tested against&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Simplest is to have a meta field in the head section&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mockups&lt;/li&gt;&#xA;&lt;li&gt;SRS&lt;/li&gt;&#xA;&lt;li&gt;Database and software architecture&lt;/li&gt;&#xA;&lt;li&gt;Implementation&lt;/li&gt;&#xA;&lt;li&gt;Test/QA&lt;/li&gt;&#xA;&lt;li&gt;Deployment&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/processes/software-project-basics/&#34; &gt;Software project basics&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Working in a software company</title>
      <link>https://tomrochette.com/processes/working-in-a-software-company/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/working-in-a-software-company/</guid>
      <category>software-development</category><category>processes</category><category>work</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Always prioritize your work&lt;/li&gt;&#xA;&lt;li&gt;Always work on something that is a task in a task tracking system&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You should always be able to tell someone else what task you are working on and link them to that task&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Always provide an agenda when you book meetings with others&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing code</title>
      <link>https://tomrochette.com/processes/writing-code/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/writing-code/</guid>
      <category>software-development</category><category>processes</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;LLM-assisted flow&#xA;    &lt;div id=&#34;llm-assisted-flow&#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;#llm-assisted-flow&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use the task background + acceptance criteria as plan prompt (manual)&lt;/li&gt;&#xA;&lt;li&gt;Use the planning feature of the agent and let it generate a plan (LLM)&lt;/li&gt;&#xA;&lt;li&gt;Review the plan and adjust as necessary (manual)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ensure the presence of tests&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Let the agent implement the code based on the plan (LLM)&lt;/li&gt;&#xA;&lt;li&gt;Review the code implemented by the agent (manual)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ensure it meets the acceptance criteria&lt;/li&gt;&#xA;&lt;li&gt;Ensure code quality and standards&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Manually verify that functionality is working as expected (manual)&lt;/li&gt;&#xA;&lt;li&gt;Commit code on a branch (manual)&lt;/li&gt;&#xA;&lt;li&gt;Push to the central repository (manual)&lt;/li&gt;&#xA;&lt;li&gt;Verify that CI passes&lt;/li&gt;&#xA;&lt;li&gt;Create pull request (manual + LLM generated description)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Pre-LLMs flow&#xA;    &lt;div id=&#34;pre-llms-flow&#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;#pre-llms-flow&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Make sure you understand what you have to implement&lt;/li&gt;&#xA;&lt;li&gt;Make it work&lt;/li&gt;&#xA;&lt;li&gt;Write a test for what you implemented&lt;/li&gt;&#xA;&lt;li&gt;Refactor the code for reusability/code standard&lt;/li&gt;&#xA;&lt;li&gt;Verify that your code passes linting and tests&lt;/li&gt;&#xA;&lt;li&gt;Commit your code on a branch&lt;/li&gt;&#xA;&lt;li&gt;Push to the central repository&lt;/li&gt;&#xA;&lt;li&gt;Verify that CI passes&lt;/li&gt;&#xA;&lt;li&gt;Create pull request&lt;/li&gt;&#xA;&lt;li&gt;Annotate code to explain intent of changes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing commits</title>
      <link>https://tomrochette.com/processes/writing-commits/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/writing-commits/</guid>
      <category>software-development</category><category>processes</category>
      <description>&lt;p&gt;Nowadays I do not write useful commit messages anymore.&#xA;The main reason is that most repositories I work in professionally use squash merges, meaning that all commits done in a branch are squashed into a single commit when merging the branch into the main branch.&#xA;The commit message of the squash commit is usually the title of the pull request, meaning that the individual commit messages are not very useful anymore.&#xA;The commit message ends up containing the PR description, which gives the what and why of the changes, which is generally enough.&lt;/p&gt;&#xA;&lt;p&gt;With the rise of LLMs I have never found myself looking at the commit history and the commit messages to understand why things changed.&#xA;If something isn&amp;rsquo;t working, I simply get the LLM to help me fix the problem.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Pre-LLMs era&#xA;    &lt;div id=&#34;pre-llms-era&#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;#pre-llms-era&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;One liner describing what changed (not period terminated)&lt;/li&gt;&#xA;&lt;li&gt;A few lines describing in more details why things changed&lt;/li&gt;&#xA;&lt;li&gt;GPG signed commit&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;How to Write a Git Commit Message&#xA;    &lt;div id=&#34;how-to-write-a-git-commit-message&#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;#how-to-write-a-git-commit-message&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Separate subject from body with a blank line&lt;/li&gt;&#xA;&lt;li&gt;Limit the subject line to 50 characters&lt;/li&gt;&#xA;&lt;li&gt;Capitalize the subject line&lt;/li&gt;&#xA;&lt;li&gt;Do not end the subject line with a period&lt;/li&gt;&#xA;&lt;li&gt;Use the imperative mood in the subject line&lt;/li&gt;&#xA;&lt;li&gt;Wrap the body at 72 characters&lt;/li&gt;&#xA;&lt;li&gt;Use the body to explain what and why vs. how&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://chris.beams.io/posts/git-commit/&#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=chris.beams.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://chris.beams.io/posts/git-commit/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Writing tests</title>
      <link>https://tomrochette.com/processes/writing-tests/</link>
      <pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/writing-tests/</guid>
      <category>software-development</category><category>processes</category>
      <description>&lt;p&gt;When joining a new project without tests, here is the value you need to provide through the addition of tests:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;the application works and doesn&amp;rsquo;t crash&lt;/li&gt;&#xA;&lt;li&gt;the application works and supports a few input cases&lt;/li&gt;&#xA;&lt;li&gt;the application works and supports a variety of input cases&lt;/li&gt;&#xA;&lt;li&gt;the application works and is robust to most input cases&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Write a test that tests the common case usage of your function&lt;/li&gt;&#xA;&lt;li&gt;Write tests that cover edge cases of your function&lt;/li&gt;&#xA;&lt;li&gt;Write tests to cover all statements, branches, paths&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Diablo</title>
      <link>https://tomrochette.com/architectures/diablo/</link>
      <pubDate>Sat, 29 Dec 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/architectures/diablo/</guid>
      <category>games</category>
      <description>&lt;p&gt;A table of probabilities is built&#xA;The ratio 1/drop chance is used to compute a total drop chance&#xA;A number is generated in the range 0-total drop chance&#xA;A table lookup is done to find the associated item&#xA;Item properties are randomly rolled&#xA;Different table lookup may be built depending on the difficulty setting as well as the current act&#xA;The rarity of an enemy pack may either change the random generator distribution or some other mean to modify the probability of higher quality items from dropping&#xA;The pseudo random number generator is initialized each game and does not depend on the current time (to avoid issue with reading some timer which may have the same value over many iterations or may be slow to read)&#xA;When an enemy is killed, we want to determine how many items will drop&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Factorio</title>
      <link>https://tomrochette.com/architectures/factorio/</link>
      <pubDate>Sat, 29 Dec 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/architectures/factorio/</guid>
      <category>games</category>
      <description>&lt;p&gt;An initial seed is computed and stored in the game save file&#xA;Based on this seed, the world is pseudo randomly computed, using a certain chunk/block/tile size (e.g., 32x32, 128x128)&#xA;The world map is only generated on-demand, that is, as far as the player can see&#xA;When a new chunk is discovered, its blocks are computed and persisted in the save file&#xA;If there are no active components in a chunk that is not visible, the game will obviously not render it, it will only simulate it (position, item, velocity, etc)&#xA;Certain thing, for instance alien types and alien base size, may only be computed once they are observed. At first, maybe only a location anchor will exist to indicate where they should spawn, but the rest will be generated only when needed.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>League of legends</title>
      <link>https://tomrochette.com/architectures/league-of-legends/</link>
      <pubDate>Sat, 29 Dec 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/architectures/league-of-legends/</guid>
      <category>games</category>
      <description>&lt;p&gt;Client/server&#xA;Per region servers&#xA;Login/authentication server&#xA;Lobby server&#xA;Store server&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;buy champion/runes&#xA;Transfer player from lobby to game server&lt;/li&gt;&#xA;&lt;li&gt;champion selection&lt;/li&gt;&#xA;&lt;li&gt;spectators&#xA;Per game server&lt;/li&gt;&#xA;&lt;li&gt;Coordinates all 10 players within the game&lt;/li&gt;&#xA;&lt;li&gt;controls game events dragon/baron/npc/player gold&lt;/li&gt;&#xA;&lt;li&gt;compute damage&lt;/li&gt;&#xA;&lt;li&gt;end game lobby&#xA;Game client&lt;/li&gt;&#xA;&lt;li&gt;Display animations&lt;/li&gt;&#xA;&lt;li&gt;play game state according to server&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Minecraft</title>
      <link>https://tomrochette.com/architectures/minecraft/</link>
      <pubDate>Sat, 29 Dec 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/architectures/minecraft/</guid>
      <category>games</category>
      <description>&lt;p&gt;An initial seed is computed and stored in the game save file&#xA;Based on this seed, the world is pseudo randomly computed, using a certain chunk/block/tile size (e.g., 32x32, 128x128)&#xA;The world map is only generated on-demand, that is, as far as the player can see&#xA;When a new chunk is discovered, its blocks are computed and persisted in the save file&#xA;If there are no active components in a chunk that is not visible, the game will obviously not render it, it will only simulate it (position, item, velocity, etc)&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Starcraft</title>
      <link>https://tomrochette.com/architectures/starcraft/</link>
      <pubDate>Sat, 29 Dec 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/architectures/starcraft/</guid>
      <category>games</category>
      <description>&lt;p&gt;Authentication/Login server&#xA;Per game server&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;compute damage simulation&lt;/li&gt;&#xA;&lt;li&gt;in game chat&lt;/li&gt;&#xA;&lt;li&gt;decide game victory&lt;/li&gt;&#xA;&lt;li&gt;returns end game stats for ui (or done client side?)&#xA;Game client&lt;/li&gt;&#xA;&lt;li&gt;display game ui&lt;/li&gt;&#xA;&lt;li&gt;play animations&lt;/li&gt;&#xA;&lt;li&gt;send commands to game server&#xA;Local backend&lt;/li&gt;&#xA;&lt;li&gt;record game&lt;/li&gt;&#xA;&lt;li&gt;compute game simulation&lt;/li&gt;&#xA;&lt;li&gt;communicate game state to game client&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Task overload</title>
      <link>https://tomrochette.com/task-overload/</link>
      <pubDate>Sat, 01 Dec 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/task-overload/</guid>
      <category>processes</category>
      <description>&lt;p&gt;It&amp;rsquo;s highly common when working that priorities shift and that sometimes you have way more on your plate than you can handle.&lt;/p&gt;&#xA;&lt;p&gt;No need to panic!&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ignore your task list&lt;/li&gt;&#xA;&lt;li&gt;Use your brain and create a fresh list of what you think is the most important&lt;/li&gt;&#xA;&lt;li&gt;Prioritize using the importance/urgency matrix&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Checklists</title>
      <link>https://tomrochette.com/checklists/</link>
      <pubDate>Sat, 27 Oct 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/checklists/</guid>
      
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Checklists are a highly effective way to make sure that critical elements of a routine are done. As such, I want to explore and make checklists for different things that are important in my life.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Life&#xA;    &lt;div id=&#34;life&#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;#life&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Did I eat 3 meals today?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are time-based events scheduled in the calendar?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are repetitive events scheduled in the calendar?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Software development&#xA;    &lt;div id=&#34;software-development&#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;#software-development&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is the feature implementing all the desired use cases?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are tests written to cover the common case and some edge cases?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are tests passing?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Machine learning&#xA;    &lt;div id=&#34;machine-learning&#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;#machine-learning&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is there a row of data even when the value is 0?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/6667514-the-checklist-manifesto&#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=www.goodreads.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.goodreads.com/book/show/6667514-the-checklist-manifesto&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Learning VS Code source</title>
      <link>https://tomrochette.com/learning-vscode-source/</link>
      <pubDate>Sat, 26 May 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/learning-vscode-source/</guid>
      <category>programming</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;2018-05-26&#xA;    &lt;div id=&#34;2018-05-26&#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;#2018-05-26&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Read &lt;code&gt;package.json&lt;/code&gt; to discover what packages VS Code depends on&lt;/li&gt;&#xA;&lt;li&gt;Observe the root directory structure, and more specifically the &lt;code&gt;extensions&lt;/code&gt; and &lt;code&gt;src&lt;/code&gt; directories which contain the bulk of the source code&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A lot of the code in the &lt;code&gt;extensions&lt;/code&gt; directory appears to be dedicated to programming language support&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The remainder of the extensions seem to provide functionality for things that aren&amp;rsquo;t &amp;ldquo;core&amp;rdquo; to vscode, such as &lt;code&gt;configuration-editing&lt;/code&gt;, &lt;code&gt;emmet&lt;/code&gt;, &lt;code&gt;extension-editing&lt;/code&gt; and some color themes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If you look at the &lt;code&gt;.vscode/launch.json&lt;/code&gt;, you will find all the tasks that can be executed from within VS Code debugger. One task of interest is &lt;code&gt;Launch VS Code&lt;/code&gt; which will take care of launching VS Code for us so that we may debug it&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In this file you will also discover that it runs &lt;code&gt;${workspaceFolder}/scripts/code.bat&lt;/code&gt;, which is the next script we&amp;rsquo;ll take a look at&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;code&gt;./scripts/code.bat&lt;/code&gt;, we discover that this script will run &lt;code&gt;yarn&lt;/code&gt; if the &lt;code&gt;node_modules&lt;/code&gt; directory is missing, download the electron binaries if necessary and call &lt;code&gt;gulp compile&lt;/code&gt; if the &lt;code&gt;out&lt;/code&gt; directory is missing, then finally start the electron/vs code binary in the &lt;code&gt;.build/electron&lt;/code&gt; directory&lt;/li&gt;&#xA;&lt;li&gt;We then start to look for common entry points file such as &lt;code&gt;index.ts/js&lt;/code&gt; or  &lt;code&gt;main.ts/js&lt;/code&gt;, for which we find a match in the &lt;code&gt;src&lt;/code&gt; directory&lt;/li&gt;&#xA;&lt;li&gt;We take a quick look around, trying to find where electron is likely to be instantiated&amp;hellip; There&amp;rsquo;s a lot of code in &lt;code&gt;src/main.js&lt;/code&gt; that would be better elsewhere to make it easier to navigate this file&lt;/li&gt;&#xA;&lt;li&gt;Close to the bottom of the file we discover the code we are interested in as a call to &lt;code&gt;app.once(&#39;ready&#39;, ...)&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Once the app is ready, we want to call &lt;code&gt;src/bootstrap-amd&lt;/code&gt; and pass &lt;code&gt;vs/code/electron-main/main&lt;/code&gt; as our entry point (per the signature of the exported function in &lt;code&gt;./src/bootstrap-amd&lt;/code&gt;)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Here we can go to two places, either &lt;code&gt;src/bootstrap-amd&lt;/code&gt; or &lt;code&gt;src/vs/code/electron-main/main&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;We take a quick peek at both files and we can quickly tell that &lt;code&gt;src/bootstrap-amd&lt;/code&gt; is used mainly to load &lt;code&gt;src/vs/code/electron-main/main&lt;/code&gt; which is the file we&amp;rsquo;re going to be interested in&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Once again, we quickly look around &lt;code&gt;src/vs/code/electron-main/main&lt;/code&gt; and find that the main logic is at the bottom of the file&lt;/li&gt;&#xA;&lt;li&gt;First the command line arguments are parsed&lt;/li&gt;&#xA;&lt;li&gt;Then services are bootstrapped/instantiated&lt;/li&gt;&#xA;&lt;li&gt;Finally the &lt;code&gt;CodeApplication&lt;/code&gt; is started up&lt;/li&gt;&#xA;&lt;li&gt;This leads us to look into &lt;code&gt;src/vs/code/electron-main/app.ts&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;As the file is quite large, we start by skimming through it, looking at the available methods on the &lt;code&gt;CodeApplication&lt;/code&gt; class as well as its properties&lt;/li&gt;&#xA;&lt;li&gt;Looking at the constructor, we can see that a lot of objects are given to it. We also observe the use of the @&amp;hellip; syntax (those are decorators)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In this case (and for most constructors), this is how VS Code does service (dependencies) injection&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;One will also notice that most, if not all parameters have a visibility assigned to it. What this does is that it will create an associated property in the class as well as assigning the parameter value to this property in the constructor. Thus, instead of writing&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-typescript line-numbers&#34;&gt;&#xA;class AnotherClass {&#xA;&#x9;private someClass: SomeClass;&#xA;&#xA;&#x9;constructor(someClass: SomeClass) {&#xA;&#x9;&#x9;this.someClass = someClass;&#xA;&#x9;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;you simply write&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-typescript line-numbers&#34;&gt;&#xA;class AnotherClass {&#xA;&#x9;constructor(private someClass: SomeClass) {&#xA;&#x9;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Upon its creation, the &lt;code&gt;CodeApplication&lt;/code&gt; class will register various event listeners on the electron app object&lt;/li&gt;&#xA;&lt;li&gt;If we remember, in &lt;code&gt;src/vs/code/electron-main/main&lt;/code&gt;, after the &lt;code&gt;CodeApplication&lt;/code&gt; object is instantiated, we call &lt;code&gt;startup()&lt;/code&gt; on it. So, we want to take a look at what that method does&lt;/li&gt;&#xA;&lt;li&gt;Without knowing too much about the VS Code source, it appears that we are instantiating an IPC server (inter-process communication) and then the shared process&lt;/li&gt;&#xA;&lt;li&gt;After that is done, we initialize some more services in &lt;code&gt;CodeApplication::initServices&lt;/code&gt;, such as the update service (which I guess takes care of checking for VS Code updates) and the telemetry (data about VS Code feature usage)&lt;/li&gt;&#xA;&lt;li&gt;We finally get to the point where we&amp;rsquo;re about to open a window in &lt;code&gt;CodeApplication::openFirstWindow&lt;/code&gt;!&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This leads us to go read the class &lt;code&gt;WindowsManager&lt;/code&gt; in &lt;code&gt;src/vs/code/electron-main/windows.ts&lt;/code&gt;. Once again, this file is pretty large, so we want to skim it to see what it contains (functions, classes, properties, methods)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;There are a few large classes in &lt;code&gt;src/vs/code/electron-main/windows.ts&lt;/code&gt; that I&amp;rsquo;d want to extract to make the file smaller and simpler (less cognitive load). However, the issue is that those classes are not declared as exported, and thus are only available in the local file. It would be possible to move these classes to other files and import them, but by doing so it would also &amp;ldquo;communicate&amp;rdquo; that others can use it, which is what having the classes as not exported prevents, at the cost of making single files larger and harder to comprehend&lt;/li&gt;&#xA;&lt;li&gt;We know that the constructor is first called, then from &lt;code&gt;CodeApplication::openFirstWindow&lt;/code&gt;, we see that &lt;code&gt;WindowsManager::ready&lt;/code&gt; and &lt;code&gt;WindowsManager::open&lt;/code&gt; are both called.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In the &lt;code&gt;constructor&lt;/code&gt; we instantiate the &lt;code&gt;Dialogs&lt;/code&gt; class (takes care of open/save dialog windows) and the &lt;code&gt;WorkspacesManager&lt;/code&gt; class (takes care of workspace management, such as open/save)&lt;/li&gt;&#xA;&lt;li&gt;In &lt;code&gt;ready&lt;/code&gt; event listeners are registered&lt;/li&gt;&#xA;&lt;li&gt;In &lt;code&gt;open&lt;/code&gt; there is a lot of logic associated with the window finally opening&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Notes&#xA;    &lt;div id=&#34;notes&#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;#notes&#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;If you start VS Code using the debug feature, you will not be able to open the Chrome DevTools (at this moment, 2018-05-26) because only 1 process is allowed to attach to the Chrome DevTools instance, and that process is the VS Code editor that started the debugged VS Code instance&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;2018-07-08&#xA;    &lt;div id=&#34;2018-07-08&#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;#2018-07-08&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Today I want to find out how VS Code restores a windows sessions when you start it. Apparently, if you run it as &lt;code&gt;code .&lt;/code&gt;, it will not restore the same set of windows than if you called it simply with &lt;code&gt;code&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In &lt;code&gt;src/vs/code/electron-main/launch.ts&lt;/code&gt;, the &lt;code&gt;LaunchService::startOpenWindow&lt;/code&gt; appears to implement logic based on how many arguments were given. In all cases, we end up doing a call to the &lt;code&gt;IWindowsMainService::open&lt;/code&gt; method.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Note that in both cases, the path we&amp;rsquo;re opening is within the &lt;code&gt;args&lt;/code&gt; variable, which is passed to the &lt;code&gt;cli&lt;/code&gt; property of the &lt;code&gt;IOpenConfiguration&lt;/code&gt; object.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;The implementation of &lt;code&gt;IWindowsMainService&lt;/code&gt; we are interested in lives in &lt;code&gt;src/vs/code/electron-main/windows.ts&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;In the &lt;code&gt;WindowsManager::open&lt;/code&gt; method, we rapidly discover that the windows that will be opened will be retrieved in &lt;code&gt;WindowsManager::getPathsToOpen&lt;/code&gt;. In there, we can observe that the windows that will be opened depend on whether something was passed from the API, we forced an empty window, we&amp;rsquo;re extracting paths from the cli or we should restore from the previous session.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If we arrive at this last case, we can see that the logic is to call &lt;code&gt;WindowsManager::doGetWindowsFromLastSession&lt;/code&gt;, which is pretty self-explanatory, and will retrieve the previous set of windows from the last session. This is what happens when you start &lt;code&gt;code&lt;/code&gt; using &lt;code&gt;code&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the case where we pass a path, this path is in &lt;code&gt;openConfig.cli._&lt;/code&gt;. In this case, the windows that were previously opened, and part of &lt;code&gt;this.windowsState.openedWindows&lt;/code&gt; (where &lt;code&gt;this&lt;/code&gt; is a &lt;code&gt;WindowsManager&lt;/code&gt; object)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Here we wonder how the &lt;code&gt;windowsState.openedWindows&lt;/code&gt; state gets restored on VS Code start. To figure that out, we start at the &lt;code&gt;WindowsManager.constructor&lt;/code&gt; method. There we find &lt;code&gt;this.windowsState = this.stateService.getItem&amp;lt;IWindowsState&amp;gt;(WindowsManager.windowsStateStorageKey) || { openedWindows: [] };&lt;/code&gt;, which states to use get a &lt;code&gt;IWindowState&lt;/code&gt; object from the &lt;code&gt;stateService&lt;/code&gt; if one exists or to create an object with no opened windows. If we assume that this windows state is the same regardless of how we start VS Code, then it is not there that the difference in opened windows will occur.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Task duration estimation</title>
      <link>https://tomrochette.com/task-duration-estimation/</link>
      <pubDate>Sat, 19 May 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/task-duration-estimation/</guid>
      
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Task duration vs appetite&#xA;    &lt;div id=&#34;task-duration-vs-appetite&#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;#task-duration-vs-appetite&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you are building a product, it is your responsibility to define how much time you&amp;rsquo;re willing to bet/spend on a feature, this is called the appetite&lt;/li&gt;&#xA;&lt;li&gt;Unlike a task duration estimate, an appetite is a fixed amount of time that is defined in order to define the boundaries of what the feature to develop should be vs an estimate which means that the task should be completed and we expect it to take X amount of time (variable)&lt;/li&gt;&#xA;&lt;li&gt;The appetite helps set the amount of time before a task is deemed without a proper scope&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Do&#xA;    &lt;div id=&#34;do&#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;#do&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Record initial task duration estimate&lt;/li&gt;&#xA;&lt;li&gt;Record task duration after its completion&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Estimating duration&#xA;    &lt;div id=&#34;estimating-duration&#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;#estimating-duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Make a high-level, gut feeling estimate of the duration of the whole project&lt;/li&gt;&#xA;&lt;li&gt;Lowest (fastest, optimistic), average (most likely), and highest (slowest, pessimistic) time duration estimates&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A final value is computed by taking (lowest + 4*average + highest)/6&lt;/li&gt;&#xA;&lt;li&gt;List the reasons why you think things may go right/wrong&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Heuristic estimation&#xA;&lt;ul&gt;&#xA;&lt;li&gt;At a high level, you should be able to tell how much each portion of a project should have over the complete project&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Use historical data&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you have underestimated in the past, you will keep underestimating if you do not adjust&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Break down any item that is larger than 10% of the project into smaller items&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Factors&#xA;    &lt;div id=&#34;factors&#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;#factors&#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;Duration will depend on the skills of the person completing the task. An expert will generally take less time than a novice to accomplish the same task&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Tracking duration&#xA;    &lt;div id=&#34;tracking-duration&#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;#tracking-duration&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Issues&#xA;    &lt;div id=&#34;issues&#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;#issues&#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;Being interrupted while working (difficulty tracking beginning and ending)&lt;/li&gt;&#xA;&lt;li&gt;Working on unrelated things at the same time (diluted productivity)&lt;/li&gt;&#xA;&lt;li&gt;Working on multiple tasks at the same time (task overlapping)&lt;/li&gt;&#xA;&lt;li&gt;Determining what is and what isn&amp;rsquo;t part of a task (task isolation)&lt;/li&gt;&#xA;&lt;li&gt;Changes in task definition&lt;/li&gt;&#xA;&lt;li&gt;Estimating tasks for which we have no experience&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Task duration tool&#xA;    &lt;div id=&#34;task-duration-tool&#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;#task-duration-tool&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Requirements&#xA;    &lt;div id=&#34;requirements&#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;#requirements&#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;Easy to start/stop tracking a task (less than 15 seconds, otherwise it feels like an interruption)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Program_evaluation_and_review_technique&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Program_evaluation_and_review_technique&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rclayton.silvrback.com/software-estimation-is-a-losing-game&#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=rclayton.silvrback.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://rclayton.silvrback.com/software-estimation-is-a-losing-game&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Software_development_effort_estimation&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Software_development_effort_estimation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Work_breakdown_structure&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Work_breakdown_structure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Workstack</title>
      <link>https://tomrochette.com/workstack/</link>
      <pubDate>Fri, 18 May 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/workstack/</guid>
      <category>note-taking</category><category>partially-ai-generated</category><category>llm=chatgpt-4.1</category>
      <description>&lt;p&gt;The workstack is a very simple idea I had while working. It is based on the concept of a &lt;a href=&#34;https://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;stack&lt;/a&gt; as the name clearly implies. As you work, you, like a computer, process things one at a time and as new things need to be done, you either throw them in a todo list (a queue), or you start doing them right away (you stack them).&lt;/p&gt;&#xA;&lt;p&gt;The workstack is a way to record notes about what you work on. As you work on something, you can either work on them to completion, or be interrupted by the necessity of working on another task. In the first case, tasks are simply written one after the other with their begin and end time. In the second case, items are also indented, such that it is possible to observe when a task forced you to &amp;ldquo;switch context&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;An example of this note taking format is as follow.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-text line-numbers&#34;&gt;&#xA;2018-05-18&#xA;Task 1 10:00-10:30&#xA;Task 2 10:35-10:50&#xA;Task 3 11:00-...&#xA;&#x9;Task 4 11:05-11:15&#xA;&#x9;Task 6 11:17-...&#xA;&#x9;&#x9;Task 7 11:20-...&#xA;Task 5 (not begun)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;In this case, the person started working on tasks 1 and 2, then began working on task 3. As he began his work, he noticed that something else was necessary, which spawned task 4. While he was working on task 4, he observed something that could be done, but didn&amp;rsquo;t have to be done right away, which spawned task 5. As he completed task 4, he returned to task 3, but noticed that something else also had to be done, which effectively spawned task 6. During task 6, something else also interrupted him, which forced him to work on task 7. In this case, it could have been a coworker asking you for help on something. Task 5 could be a coworker asking for help as soon as you&amp;rsquo;re available, but not wanting to interrupt you.&lt;/p&gt;&#xA;&lt;p&gt;Conceptually, you would want to always complete a stack of operations before moving to a new task. However, it is highly common while programming that a programmer will start going down such stack while working on code and then will not end up climbing back the stack, effectively not completing all he started working on.&lt;/p&gt;&#xA;&lt;p&gt;This format thus allows a programmer (or anyone working on tasks that can spawn other tasks) to better track what they were doing and what they did and did not complete.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/TomzxCode/task-stack&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/TomzxCode/task-stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Stack_(abstract_data_type)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Context_switch&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Context_switch&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Parnin, C., &amp;amp; Rugaber, S. (2011). &amp;ldquo;Resumption strategies for interrupted programming tasks.&amp;rdquo; Software Quality Journal, 19(1), 5-34. &lt;a href=&#34;https://doi.org/10.1007/s11219-010-9104-9&#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=doi.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://doi.org/10.1007/s11219-010-9104-9&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Reusable writing</title>
      <link>https://tomrochette.com/reusable-writing/</link>
      <pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/reusable-writing/</guid>
      
      <description>&lt;p&gt;I&amp;rsquo;m a programmer. I like to write code and whenever I can, I like to reuse bits of code I&amp;rsquo;ve written in the past instead of writing it from scratch.&lt;/p&gt;&#xA;&lt;p&gt;Lately I&amp;rsquo;ve been spending a lot of my time thinking. However, unlike programming, I feel that my writing is repetitive and that I sometimes don&amp;rsquo;t make any progress with my ideas. Oh how I wished writing was more like programming.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s many ways one can write. You have the top-down approach, where you first lay out a plan of the topics you want to write about. You also have the bottom-up approach, where you write things as they come to mind, sometimes rearranging the content. Generally, when I write, it is to dump what is on my mind about a certain topic, so it is very much like the bottom-up approach. However, the thing I dislike about it is that you can end up with subtle similar sections of content, but not know about it. You actually need to go through all of your writing to discover these bits of duplicate writing. That&amp;rsquo;s a lot similar to writing code and sometimes finding out you have functions/methods that do almost the same thing&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;In programming, when you realize that two bits of code are similar, you refactor your code to get one out in order to reduce duplication. When you write, it&amp;rsquo;s not as simple. First off, in code you will generally have encapsulation, which provides you with the means of limiting the scope of the duplicate logic. With text, your context (encapsulation) often comes from the text prior to it.&lt;/p&gt;&#xA;&lt;p&gt;One option to deal with this problem might be to extract ideas and then rewrite them in order to make them independent of their previous context. This will help making it possible to read any part of an article without having read what was said previously. However, this will also have the adverse effect of making things much more difficult to follow as there will appear to be no connection between the different sections.&lt;/p&gt;&#xA;&lt;p&gt;Maybe a better approach to the problem is to think of how one makes code more reusable. One of the biggest issues with code is often that multiple levels of abstractions are used within the same method, which makes reasoning about the method more difficult.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Questions&#xA;    &lt;div id=&#34;questions&#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;#questions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Should one limit the size of an idea, in the same fashion one tries to limit the number of lines or statements in a function?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://wiki.c2.com/?AlexandrianForm&#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=wiki.c2.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://wiki.c2.com/?AlexandrianForm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.martinfowler.com/articles/writingPatterns.html&#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=www.martinfowler.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.martinfowler.com/articles/writingPatterns.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Pattern_language&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Pattern_language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.jacquimalpass.com/lick-it-you-can-reuse-your-knowledge/&#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=www.jacquimalpass.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.jacquimalpass.com/lick-it-you-can-reuse-your-knowledge/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Brain organization</title>
      <link>https://tomrochette.com/brain-organization/</link>
      <pubDate>Sat, 10 Feb 2018 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/brain-organization/</guid>
      <category>productivity</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#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;How can one track progress? Is there progress without explicitly specified goals?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dump everything in my brain in text documents&lt;/li&gt;&#xA;&lt;li&gt;Schedule things that need to be scheduled/reminded&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Decompose tasks and define time/effort estimate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Currently&#xA;    &lt;div id=&#34;currently&#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;#currently&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Write everything down in markdown documents&lt;/li&gt;&#xA;&lt;li&gt;Write thoughts in Google Keep while on the move, then merge them in existing documents&lt;/li&gt;&#xA;&lt;li&gt;Attempt to manually aggregate content&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Missing&#xA;    &lt;div id=&#34;missing&#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;#missing&#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;No time tracking/evolution of articles&lt;/li&gt;&#xA;&lt;li&gt;Manual aggregation is difficult and time consuming&lt;/li&gt;&#xA;&lt;li&gt;Most of what is written is never reviewed and potentially forgotten&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Content is not consumed/reused&lt;/li&gt;&#xA;&lt;li&gt;Most of the time, the point is to make explicit what is in the brain, so that it can also be referred to later on in a reliable format&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Notes I leave myself aren&amp;rsquo;t tagged&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Should Do&#xA;    &lt;div id=&#34;should-do&#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;#should-do&#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;Get feedback on what I wrote that is consumable by others&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/5959742/how-can-i-turn-my-mess-of-ideas-into-something-organized-and-useful&#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=lifehacker.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://lifehacker.com/5959742/how-can-i-turn-my-mess-of-ideas-into-something-organized-and-useful&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>AI/AGI/ML - A short overview</title>
      <link>https://tomrochette.com/ai-agi-ml-a-short-overview/</link>
      <pubDate>Fri, 15 Dec 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/ai-agi-ml-a-short-overview/</guid>
      <category>ai</category><category>agi</category><category>ml</category>
      <description>&lt;p&gt;After having spent about 200 workdays of my life getting familiar with the fields of AI/AGI/ML, I think it is a good moment for me to reflect back on my learning experience.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Artificial General Intelligence&#xA;    &lt;div id=&#34;artificial-general-intelligence&#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;#artificial-general-intelligence&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Of the three domains, AGI is the least well defined. It has to do with general intelligence, but our definition of intelligence is still up for debate. Furthermore, the different known approaches in the field have different opinions regarding what sort of agent an AGI system should be. Should it be a self-contained entity with its own goals and purpose? Or should it be a system that is exhibiting human capabilities while being the servant of a human being or a group of human beings?&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Artificial Intelligence&#xA;    &lt;div id=&#34;artificial-intelligence&#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;#artificial-intelligence&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Next is AI, which encompasses many different types of approach to try and solve high level goals such as deciding, planning, organizing,, understanding, etc. AI is about the discovery of strategies to solve problems without having to provide the whole solution. I think it is also where goals for the ML field have been defined.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Machine Learning&#xA;    &lt;div id=&#34;machine-learning&#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;#machine-learning&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Finally, ML is about using statistical approaches to solve problems. These problems have to be formalized and specify their input/output in the shape of data, may it be as text, audio, video, or simply vectors of numbers. Most of the recent and exciting development that has happened in ML is due to deep learning, which is the ability to develop deep neural networks that can learn to accomplish certain tasks without writing any explicit logic. This logic would be discovered by the network itself, with some help of the developer which would define a composition of modules that would process the data in order to create associations between the input and outputs.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Why AGI?&#xA;    &lt;div id=&#34;why-agi&#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;#why-agi&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When I initially started my &amp;ldquo;adventure&amp;rdquo;, I was interested in AGI. I wanted to know how a machine would be able to exhibit human behavior without having to tell it too much about it. I wanted to learn how you could teach a machine as you would teach a child. The AGI field itself does not currently have any curriculum as to what you should learn about, nor a reference book you can refer yourself or others to (when asked &amp;ldquo;What should I first read if I want to learn AGI?&amp;rdquo;). One can be interested in anthropomorphic aspects such as memory, intelligence, perception/senses, processing and so on, while others may be more interested about a computational oriented approach, such as the algorithms, the implementations, the computational complexity of diverse approaches and so on. I think it makes AGI a very interesting topic/field, however it lacks the definiteness of the other fields. One can see this by reading the various iterations of the book &amp;ldquo;Artificial General Intelligence&amp;rdquo;, which is a collection of articles by various researchers that is generally published every year in relation to its conference.&lt;/p&gt;&#xA;&lt;p&gt;When I started learning about AGI, I decided I would explore various venues and determine the approaches that matched the most my own interests and which looked the most promising. I looked at different venues such as cognitive science, set theory, logic, universal artificial intelligence, biology, and philosophy amongst others.&lt;/p&gt;&#xA;&lt;p&gt;Along the road, AGI research has challenged many of my beliefs as well as how I see life. For those two reasons alone, I&amp;rsquo;m grateful I have been able to dedicate some of my time on it.&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/my-path-to-agi/&#34; &gt;My path to AGI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Blog articles vs articles</title>
      <link>https://tomrochette.com/blog-articles-vs-articles/</link>
      <pubDate>Fri, 08 Dec 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/blog-articles-vs-articles/</guid>
      <category>thought</category>
      <description>&lt;p&gt;One thing I&amp;rsquo;ve been wondering about lately is when should one write blog articles (short articles ranging from 250 to 1000 words) or articles (1000+ words) which would be updated (in)frequently but not be as easily consumable.&lt;/p&gt;&#xA;&lt;p&gt;The main reason I&amp;rsquo;ve preferred articles over blog articles is that it makes it possible to keep articles &amp;ldquo;alive&amp;rdquo;, while once a blog article has been published, it will not evolve over time. By the time it is posted, it is effectively dead and has very little reason to change.&lt;/p&gt;&#xA;&lt;p&gt;Being a programmer, I&amp;rsquo;ve always enjoyed seeing software project evolve over the years. They start small and grow big and complex over time. I like the satisfaction of seeing something grow step by step, and because of that, I&amp;rsquo;ve liked the idea of writing about specific topics and seeing these topics and articles change over time.&lt;/p&gt;&#xA;&lt;p&gt;The problem with articles however is that it is difficult for visitors to consume. Some articles might grow large and complex. Furthermore, it is difficult for visitors to notice any changes from the last time they&amp;rsquo;ve come onto the blog.&lt;/p&gt;&#xA;&lt;p&gt;Another thing is that articles allow the author to &amp;ldquo;refactor&amp;rdquo; what he has written, or rewrite/rephrase/reword, such that the article itself improves over time. With a blog article, it is still possible to do so, but the expectation is that a visitor that has already seen the blog article will not re-read it. And here&amp;rsquo;s the important difference between the two: I expect blog articles to be consumed once, but articles to be consumed multiple times. This expectation is likely wrong. The only person that is likely to consume the same article over and over is its author. Visitors may come to the blog many times, but they are unlikely to expect articles to change over time. An extreme example of this idea would be Wikipedia. People will consult the page of the topic they are interested in, but once they&amp;rsquo;ve read it, they aren&amp;rsquo;t likely to come back to it again. The only reason they might do so is if they contribute to it.&lt;/p&gt;&#xA;&lt;p&gt;What this means is that it is still acceptable to improve both blog articles and articles. The difference lies in how we expect our audience to consume each ones. Articles are likely to be seen as references while blog posts are likely to be perceived as an ephemeral observation. One should expect both to be consumed at best once by a visitor, and that the visitor will not come again to see if it has changed.&lt;/p&gt;&#xA;&lt;p&gt;Thus, in the end, what matters is what we want to communicate with our audience. Do I want to tell you about a thought (a blog article) or do I want to tell you about some information that is likely to evolve over time (an article).&lt;/p&gt;&#xA;&lt;p&gt;In the case of my machine learning and artificial general intelligence research, what makes sense is to communicate discoveries or shifts in approaches through blog articles while using articles as a location for thoughts to be worked on.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Question answering</title>
      <link>https://tomrochette.com/processes/question-answering/</link>
      <pubDate>Fri, 18 Aug 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/question-answering/</guid>
      <category>general</category><category>processes</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Have a question&lt;/li&gt;&#xA;&lt;li&gt;Ask LLMs&lt;/li&gt;&#xA;&lt;li&gt;Identify the field that would best answer this question&lt;/li&gt;&#xA;&lt;li&gt;Search online&lt;/li&gt;&#xA;&lt;li&gt;Search for articles and books on the topic&lt;/li&gt;&#xA;&lt;li&gt;Determine the likelihood that this field has already been researched&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Book reading</title>
      <link>https://tomrochette.com/processes/book-reading/</link>
      <pubDate>Sat, 05 Aug 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/book-reading/</guid>
      <category>general</category><category>processes</category><category>reading</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Read the table of contents&lt;/li&gt;&#xA;&lt;li&gt;Rapidly skim through the various sections of the book&lt;/li&gt;&#xA;&lt;li&gt;Determine what you want to get out of the book&lt;/li&gt;&#xA;&lt;li&gt;Ask yourself questions about what you briefly read&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.scotthyoung.com/blog/2015/01/19/speed-reading-redo/&#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=www.scotthyoung.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.scotthyoung.com/blog/2015/01/19/speed-reading-redo/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Language exchange</title>
      <link>https://tomrochette.com/processes/language-exchange/</link>
      <pubDate>Tue, 01 Aug 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/processes/language-exchange/</guid>
      <category>processes</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;What did you do this week/today?&lt;/li&gt;&#xA;&lt;li&gt;Do you want to talk about anything? (Not language related)&lt;/li&gt;&#xA;&lt;li&gt;Summarize tasks given during the exchange&lt;/li&gt;&#xA;&lt;li&gt;Plan next exchange&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Structured&#xA;    &lt;div id=&#34;structured&#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;#structured&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pronunciation&lt;/li&gt;&#xA;&lt;li&gt;Can you say &amp;hellip;?&lt;/li&gt;&#xA;&lt;li&gt;How do you say &amp;hellip;?&lt;/li&gt;&#xA;&lt;li&gt;Goal specific discussions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Unstructured&#xA;    &lt;div id=&#34;unstructured&#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;#unstructured&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What do you think of &amp;hellip;?&lt;/li&gt;&#xA;&lt;li&gt;What do you want &amp;hellip;?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Identity and access management</title>
      <link>https://tomrochette.com/identity-and-access-management/</link>
      <pubDate>Wed, 08 Feb 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/identity-and-access-management/</guid>
      <category>programming</category><category>aws</category><category>groups</category><category>users</category><category>roles</category><category>policies</category><category>identity</category><category>access-management</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;AWS&#xA;    &lt;div id=&#34;aws&#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;#aws&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;AWS has the concept of groups, users, roles and policies.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Groups&#xA;    &lt;div id=&#34;groups&#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;#groups&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A group is a list of users to which are assigned policies (permissions).&lt;/p&gt;&#xA;&lt;p&gt;A useful feature they also provide is the &lt;em&gt;Access Advisor&lt;/em&gt;, which allows administrators to observe when certain policies are being used and by which users.&lt;/p&gt;&#xA;&lt;p&gt;To keep things simple, groups cannot be nested into other groups.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Users&#xA;    &lt;div id=&#34;users&#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;#users&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Users represent an entity that has access to the AWS platform. They may access AWS either programmatically and/or through the console to administer the account.&lt;/p&gt;&#xA;&lt;p&gt;During the using creation process, the creator has the ability to assign the user to a group, copy permissions from an existing user or attach policies to the user.&lt;/p&gt;&#xA;&lt;p&gt;Upon creation of a user with programmatic access, the user is generally given an access key with its corresponding secret.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Roles&#xA;    &lt;div id=&#34;roles&#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;#roles&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Roles are very similar to groups conceptually, but instead of being &amp;ldquo;persistent&amp;rdquo;, they are temporary. While you will generally assign one or many groups to a user, roles are not assigned to a user (or vice-versa, a user is not assigned one or many roles) but given based on certain criteria. A user takes a given role and only receives this role&amp;rsquo;s policies/permissions until he returns to his own identity.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Policies&#xA;    &lt;div id=&#34;policies&#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;#policies&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A policy is a set of rules that determines the permissions given to a user, group or role. It has a name, description and a policy document, which describes the permissions.&lt;/p&gt;&#xA;&lt;p&gt;The policy document is a JSON formatted object which contains a version and a list of statements. Each statement has an effect (Allow/Deny), a list of actions and a list of resources to which it applies.&lt;/p&gt;&#xA;&lt;p&gt;You can learn more about &lt;a href=&#34;http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html&#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.aws.amazon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;AWS policies evaluation logic&lt;/a&gt;. Their &lt;a href=&#34;http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html&#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.aws.amazon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;IAM Policy Reference&lt;/a&gt; might also prove useful in understanding the various bits that compose the policy document.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Actions&#xA;    &lt;div id=&#34;actions&#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;#actions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Within AWS, each service has a unique lowercase identifier&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Within each of these services, a list of actions exists, which can be granted (or denied) to an identity. Examples of actions are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;*&lt;/code&gt;: Allowed to use all actions under all services&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;s3:*&lt;/code&gt;: Allowed to use all actions under the &lt;code&gt;s3&lt;/code&gt; service&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;s3:GetObject&lt;/code&gt;: Allowed to use the &lt;code&gt;GetObject&lt;/code&gt; action under the &lt;code&gt;s3&lt;/code&gt; service&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Resources&#xA;    &lt;div id=&#34;resources&#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;#resources&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Resources represent entities within their given service. For example, &lt;code&gt;arn:aws:s3:::some-bucket/*&lt;/code&gt; represents the content under the &lt;code&gt;some-bucket&lt;/code&gt; bucket in the &lt;code&gt;s3&lt;/code&gt; service.&lt;/p&gt;&#xA;&lt;p&gt;Format : &lt;code&gt;arn:$partition:$service:$region:$account-id:$resource&lt;/code&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tomzx/policy-evaluator&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Policy evaluator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.gopheracademy.com/advent-2015/hydra-auth/&#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=blog.gopheracademy.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://blog.gopheracademy.com/advent-2015/hydra-auth/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces&#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.aws.amazon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-arns&#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.aws.amazon.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-arns&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>How to tackle long term problems as if they were short term ones</title>
      <link>https://tomrochette.com/how-to-tackle-long-term-problems-as-if-they-were-short-term-ones/</link>
      <pubDate>Fri, 13 Jan 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/how-to-tackle-long-term-problems-as-if-they-were-short-term-ones/</guid>
      
      <description>&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s easy to do things such as checking your email or going on reddit as they are very short term tasks (can be started and completed in less than 10s).&lt;/li&gt;&#xA;&lt;li&gt;Long term tasks on the other hand requires you to save and restore your mental state every time you transition to and from them.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Prioritizing</title>
      <link>https://tomrochette.com/prioritizing/</link>
      <pubDate>Sat, 07 Jan 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/prioritizing/</guid>
      <category>priority</category><category>prioritization</category><category>planning</category><category>partially-ai-generated</category><category>llm=chatgpt-4.1</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Steps&#xA;    &lt;div id=&#34;steps&#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;#steps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Build a list of task/items&#xA;List everything that you want to get out of your head. The goal here is to make explicit as much as possible.&lt;/li&gt;&#xA;&lt;li&gt;Deconstruct tasks into their pre-requisites and follow-up tasks&#xA;There are a couple of important things to consider when one wants to prioritize their task list. One is that even if a task is at the top of the list, it might not be possible to do it until its dependencies are fulfilled. This in turn means that all dependencies will have a superior priority to this task automatically.&#xA;However, it frequently happens that what we consider dependencies can in fact be delayed or temporarily replaced by another solution which takes less time to implement or costs less (or for whatever other reason can replace the original dependency).&lt;/li&gt;&#xA;&lt;li&gt;Split tasks into 2 groups (and repeat this process)&#xA;The idea here is to quickly filter out as many tasks as possible. As you may have noticed, I have not specified the filtering predicate. It is up to you to filter out your tasks such that you will have the least amount to filter at once. Examples of predicates you could use are &amp;ldquo;will/will not do&amp;rdquo;, &amp;ldquo;want/do not want&amp;rdquo;, &amp;ldquo;need/do not need&amp;rdquo;, &amp;ldquo;like/do not like&amp;rdquo; and so on.&lt;/li&gt;&#xA;&lt;li&gt;Prioritize the tasks that will have to be done&#xA;After a certain number of iterations of the previous step, you should arrive at a point where the items you have all need to be done, but you do not know in which order you have to do them (or want to do them).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Methods&#xA;    &lt;div id=&#34;methods&#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;#methods&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;4 Quadrants Method&#xA;    &lt;div id=&#34;4-quadrants-method&#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;#4-quadrants-method&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This method, also known as the Eisenhower Matrix, involves categorizing tasks into four groups: Urgent/Important, Not Urgent/Important, Urgent/Not Important, and Not Urgent/Not Important. By sorting tasks this way, you can focus on what truly matters and avoid spending time on less critical activities.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Analytic Hierarchy Process&#xA;    &lt;div id=&#34;analytic-hierarchy-process&#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;#analytic-hierarchy-process&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The Analytic Hierarchy Process (AHP) is a structured technique for organizing and analyzing complex decisions. It involves breaking down a problem into its components, comparing them pairwise, and assigning weights to determine the relative priority of each task.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Binary Search Tree&#xA;    &lt;div id=&#34;binary-search-tree&#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;#binary-search-tree&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Using a binary search tree for prioritization means inserting tasks based on their priority value, allowing for efficient retrieval and reordering. This approach is useful for dynamically managing and updating a list of tasks as priorities change.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Planning Game&#xA;    &lt;div id=&#34;planning-game&#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;#planning-game&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The Planning Game is a collaborative method often used in agile development, where stakeholders and team members estimate and prioritize tasks together. It encourages discussion, negotiation, and consensus to determine which tasks should be tackled first.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;100-Point Method&#xA;    &lt;div id=&#34;100-point-method&#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;#100-point-method&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In the 100-Point Method, each participant is given 100 points to distribute among a list of tasks or requirements according to their perceived importance. The tasks with the highest total points are prioritized, reflecting the collective preferences of the group.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Prioritizing reading&#xA;    &lt;div id=&#34;prioritizing-reading&#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;#prioritizing-reading&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What you feel like reading&lt;/li&gt;&#xA;&lt;li&gt;Reading dependencies&lt;/li&gt;&#xA;&lt;li&gt;ROI evaluation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Karlsson, Joachim, Claes Wohlin, and Björn Regnell. &amp;ldquo;&lt;a href=&#34;http://www.wohlin.eu/ist98-1.pdf&#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=www.wohlin.eu&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;An evaluation of methods for prioritizing software requirements.&lt;/a&gt;&amp;rdquo; Information and Software Technology 39.14 (1998): 939-947.&lt;/li&gt;&#xA;&lt;li&gt;Karlsson, Joachim, Stefan Olsson, and Kevin Ryan. &amp;ldquo;Improved practical support for large-scale requirements prioritising.&amp;rdquo; Requirements Engineering 2.1 (1997): 51-60.&lt;/li&gt;&#xA;&lt;li&gt;Ahl, Viggo. &amp;ldquo;An experimental comparison of five prioritization methods: investigating ease of use, accuracy and scalability.&amp;rdquo; (2005).&lt;/li&gt;&#xA;&lt;li&gt;Gill, Nasib Singh. &amp;ldquo;A Comparison among Various Techniques to Prioritize the Requirements.&amp;rdquo; International Journal of Computer Science and Management Studies (IJCSMS) www. ijcsms. com 1.12: 601-607.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.gwern.net/Resorter&#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=www.gwern.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.gwern.net/Resorter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Buying a microscope</title>
      <link>https://tomrochette.com/buying-a-microscope/</link>
      <pubDate>Sun, 01 Jan 2017 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/buying-a-microscope/</guid>
      
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;USB microscope&#xA;    &lt;div id=&#34;usb-microscope&#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;#usb-microscope&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;To consider&#xA;    &lt;div id=&#34;to-consider&#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;#to-consider&#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;Max magnification&lt;/li&gt;&#xA;&lt;li&gt;Lighting&lt;/li&gt;&#xA;&lt;li&gt;Megapixels&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Models&#xA;    &lt;div id=&#34;models&#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;#models&#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://www.amazon.ca/XCSOURCE-20X-800X-Microscope-Endoscope-Magnifier/dp/B00N4K22OA/&#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=www.amazon.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.amazon.ca/XCSOURCE-20X-800X-Microscope-Endoscope-Magnifier/dp/B00N4K22OA/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.ca/JZHY-Microscope-Magnification-Digital-Endoscope/dp/B01DIRJ6PQ/&#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=www.amazon.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.amazon.ca/JZHY-Microscope-Magnification-Digital-Endoscope/dp/B01DIRJ6PQ/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Compound microscope&#xA;    &lt;div id=&#34;compound-microscope&#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;#compound-microscope&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Max magnification&lt;/li&gt;&#xA;&lt;li&gt;Included digital camera&lt;/li&gt;&#xA;&lt;li&gt;Megapixels&lt;/li&gt;&#xA;&lt;li&gt;Comes with prepared slides&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Models&#xA;    &lt;div id=&#34;models-1&#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;#models-1&#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://www.amazon.ca/AmScope-B120B-E-Magnification-Illumination-Double-Layer/dp/B00A15CUMU/&#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=www.amazon.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.amazon.ca/AmScope-B120B-E-Magnification-Illumination-Double-Layer/dp/B00A15CUMU/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.ca/AmScope-B120B-CM-PS100-Magnification-Illumination-Double-Layer/dp/B00A9ALEGK/&#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=www.amazon.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.amazon.ca/AmScope-B120B-CM-PS100-Magnification-Illumination-Double-Layer/dp/B00A9ALEGK/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.ca/AmScope-B120B-10M-Magnification-Illumination-Double-Layer/dp/B009VUP2AI/&#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=www.amazon.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.amazon.ca/AmScope-B120B-10M-Magnification-Illumination-Double-Layer/dp/B009VUP2AI/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amatop10.com/top-10-best-usb-microscopes/&#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=www.amatop10.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.amatop10.com/top-10-best-usb-microscopes/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.microscope-detective.com/usb-microscope.html#sthash.3mQpx9E3.dpbs&#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=www.microscope-detective.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.microscope-detective.com/usb-microscope.html#sthash.3mQpx9E3.dpbs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Business model</title>
      <link>https://tomrochette.com/php/business-model/</link>
      <pubDate>Thu, 13 Oct 2016 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/php/business-model/</guid>
      <category>php</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cartalyst&#xA;    &lt;div id=&#34;cartalyst&#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;#cartalyst&#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://cartalyst.com/&#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=cartalyst.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://cartalyst.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;75$/3 months&lt;/li&gt;&#xA;&lt;li&gt;25$/month&lt;/li&gt;&#xA;&lt;li&gt;Subscription-based model&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Models&#xA;    &lt;div id=&#34;models&#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;#models&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Subscription based&#xA;    &lt;div id=&#34;subscription-based&#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;#subscription-based&#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;Some development must be done in order to protect the software against forbidden use (no subscription)&lt;/li&gt;&#xA;&lt;li&gt;May require a &amp;ldquo;call-to-home&amp;rdquo; (Internet connection) to verify the subscription is still valid&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Might be easily countered by firewalling the application&#xA;&lt;ul&gt;&#xA;&lt;li&gt;We may allow it to go unchecked for 1-X days until we tell the user to connect, but that is bad user experience&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Examples&#xA;    &lt;div id=&#34;examples&#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;#examples&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ripstech.com/pricing/&#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=www.ripstech.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.ripstech.com/pricing/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;On demand&#xA;    &lt;div id=&#34;on-demand&#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;#on-demand&#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;Similar to subscription based, but on a per use basis&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Examples&#xA;    &lt;div id=&#34;examples-1&#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;#examples-1&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ripstech.com/pricing/&#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=www.ripstech.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.ripstech.com/pricing/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Open source&#xA;    &lt;div id=&#34;open-source&#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;#open-source&#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;Code is freely available&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Makes it more difficult to live on producing the software&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Support based&#xA;    &lt;div id=&#34;support-based&#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;#support-based&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;($X*0.2)/user/year in support fees&lt;/li&gt;&#xA;&lt;li&gt;Fee per request&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Traditional - Major version and upgrades&#xA;    &lt;div id=&#34;traditional---major-version-and-upgrades&#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;#traditional---major-version-and-upgrades&#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;X$/user (one time fee)&lt;/li&gt;&#xA;&lt;li&gt;($X*0.2)/user/year in support fees&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Software as a service&#xA;    &lt;div id=&#34;software-as-a-service&#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;#software-as-a-service&#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;Tools are never shared with the outside world&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Consultancy&#xA;    &lt;div id=&#34;consultancy&#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;#consultancy&#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;Develop tools to use on a per-project basis, where clients spent 5k$+ on a single pass&lt;/li&gt;&#xA;&lt;li&gt;Tools are never shared with the outside world&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://blogs.cisco.com/datacenter/seven-software-business-models-part-1&#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=blogs.cisco.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://blogs.cisco.com/datacenter/seven-software-business-models-part-1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Licensing CLI</title>
      <link>https://tomrochette.com/php/licensing-cli/</link>
      <pubDate>Fri, 23 Sep 2016 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/php/licensing-cli/</guid>
      <category>php</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Encapsulate the application within a .phar&lt;/li&gt;&#xA;&lt;li&gt;Use obfuscation (can only obfuscate variables inside function/methods as anything else must remain with the same name in order to allow for dynamically called methods (or simply do not support such code))&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Requirements&#xA;    &lt;div id=&#34;requirements&#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;#requirements&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Must not make it easy to extract the original source code&lt;/li&gt;&#xA;&lt;li&gt;Must checksum itself for modification&lt;/li&gt;&#xA;&lt;li&gt;Should prevent usage by sharing a single license (TBD?)&lt;/li&gt;&#xA;&lt;li&gt;Should not be possible to reuse a trial forever in a VM&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Issues&#xA;    &lt;div id=&#34;issues&#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;#issues&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Relying on opcode (to act as a binary) probably implies you are dependent on the php version used. Furthermore, it also means that the extension must be available and enabled for the code to work&lt;/li&gt;&#xA;&lt;li&gt;Given the current implementation of op&lt;em&gt;cache&lt;/em&gt;, the cache cannot be reused on other machines as it contains the system ID as part of an opcache file header&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;PHP OPCache&#xA;    &lt;div id=&#34;php-opcache&#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;#php-opcache&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Header&#xA;    &lt;div id=&#34;header&#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;#header&#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;&#xA;&lt;p&gt;OPCACHE&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;System ID&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Timestamp&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Checksum&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;-&amp;gt; zend_accel_load_script (persistent_script, from_memory)&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Obfuscation&#xA;    &lt;div id=&#34;obfuscation&#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;#obfuscation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Replace classes methods with (generated) traits that contain one or many of the classes method&lt;/li&gt;&#xA;&lt;li&gt;Compression/optimization by creating variables&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Issues&#xA;    &lt;div id=&#34;issues-1&#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;#issues-1&#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;Even with obfuscation, PSR0/4 based code is too easy to distinguish (no reason to obfuscate libraries)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Ideas&#xA;    &lt;div id=&#34;ideas&#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;#ideas&#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;Find some way to transform the original source such that it is in symbiosis with a client identifier (and thus cannot be removed)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;See &lt;a href=&#34;https://en.wikipedia.org/wiki/One-way_function&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;one-way function&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Packaging&#xA;    &lt;div id=&#34;packaging&#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;#packaging&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Replace variables within functions with obfuscated names&lt;/li&gt;&#xA;&lt;li&gt;Concatenate all files into a single file (or bundle of files)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pre-process require/include, or do not allow their use (as the files will not be available)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Randomize file order&lt;/li&gt;&#xA;&lt;li&gt;Scramble method order&lt;/li&gt;&#xA;&lt;li&gt;Inject junk code&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Insert junk code with encrypted user identification&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Generate a differently scrambled version per download/user&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ietf.org/rfc/rfc2119.txt&#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=www.ietf.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Requirements language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Obfuscation&#xA;    &lt;div id=&#34;obfuscation-1&#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;#obfuscation-1&#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://github.com/naneau/php-obfuscator&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/naneau/php-obfuscator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.pelock.com/products/autoit-obfuscator&#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=www.pelock.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.pelock.com/products/autoit-obfuscator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.google.com/closure/compiler/&#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=developers.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://developers.google.com/closure/compiler/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://proguard.sourceforge.net/&#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=proguard.sourceforge.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://proguard.sourceforge.net/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Obfuscator</title>
      <link>https://tomrochette.com/php/obfuscator/</link>
      <pubDate>Fri, 23 Sep 2016 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/php/obfuscator/</guid>
      <category>php</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Encapsulate the application within a .phar&lt;/li&gt;&#xA;&lt;li&gt;Use obfuscation (can only obfuscate variables inside function/methods as anything else must remain with the same name in order to allow for dynamically called methods (or simply do not support such code))&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Requirements&#xA;    &lt;div id=&#34;requirements&#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;#requirements&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Must not make it easy to extract the original source code&lt;/li&gt;&#xA;&lt;li&gt;Must checksum itself for modification&lt;/li&gt;&#xA;&lt;li&gt;Should prevent usage by sharing a single license (TBD?)&lt;/li&gt;&#xA;&lt;li&gt;Should not be possible to reuse a trial forever in a VM&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Issues&#xA;    &lt;div id=&#34;issues&#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;#issues&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Relying on opcode (to act as a binary) probably implies you are dependent on the php version used. Furthermore, it also means that the extension must be available and enabled for the code to work&lt;/li&gt;&#xA;&lt;li&gt;Given the current implementation of op&lt;em&gt;cache&lt;/em&gt;, the cache cannot be reused on other machines as it contains the system ID as part of an opcache file header&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;PHP OPCache&#xA;    &lt;div id=&#34;php-opcache&#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;#php-opcache&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Header&#xA;    &lt;div id=&#34;header&#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;#header&#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;&#xA;&lt;p&gt;OPCACHE&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;System ID&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Timestamp&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Checksum&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;-&amp;gt; zend_accel_load_script (persistent_script, from_memory)&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Obfuscation&#xA;    &lt;div id=&#34;obfuscation&#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;#obfuscation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Replace classes methods with (generated) traits that contain one or many of the classes method&lt;/li&gt;&#xA;&lt;li&gt;Compression/optimization by creating variables&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Issues&#xA;    &lt;div id=&#34;issues-1&#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;#issues-1&#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;Even with obfuscation, PSR0/4 based code is too easy to distinguish (no reason to obfuscate libraries)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Ideas&#xA;    &lt;div id=&#34;ideas&#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;#ideas&#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;Find some way to transform the original source such that it is in symbiose with a client identifier (and thus cannot be removed)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;See &lt;a href=&#34;https://en.wikipedia.org/wiki/One-way_function&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;one-way function&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Obfuscate php built-in functions&lt;/li&gt;&#xA;&lt;li&gt;Zend Host ID limited deployment: It appears that Zend Guard allows the software to be limited to run on only specific &amp;ldquo;Zend Host&amp;rdquo; (what are those?)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Zend Guard Loader is a custom extension? for PHP which requires a licence_path to work&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Packaging&#xA;    &lt;div id=&#34;packaging&#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;#packaging&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Replace variables within functions with obfuscated names&lt;/li&gt;&#xA;&lt;li&gt;Concatenate all files into a single file (or bundle of files)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pre-process require/include, or do not allow their use (as the files will not be available)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Randomize file order&lt;/li&gt;&#xA;&lt;li&gt;Scramble method order&lt;/li&gt;&#xA;&lt;li&gt;Inject junk code&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Insert junk code with encrypted user identification&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Generate a differently scrambled version per download/user&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/naneau/php-obfuscator&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/naneau/php-obfuscator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.pelock.com/products/autoit-obfuscator&#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=www.pelock.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.pelock.com/products/autoit-obfuscator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.google.com/closure/compiler/&#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=developers.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://developers.google.com/closure/compiler/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://proguard.sourceforge.net/&#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=proguard.sourceforge.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://proguard.sourceforge.net/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.zend.com/en/products/zend-guard&#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=www.zend.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.zend.com/en/products/zend-guard&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Business</title>
      <link>https://tomrochette.com/business/</link>
      <pubDate>Wed, 17 Aug 2016 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/business/</guid>
      
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Identified a problem&lt;/li&gt;&#xA;&lt;li&gt;Determine if it is of importance (metrics)&lt;/li&gt;&#xA;&lt;li&gt;Explain why your solution is better than existing ones&lt;/li&gt;&#xA;&lt;li&gt;Define a clear pricing model&lt;/li&gt;&#xA;&lt;li&gt;Define how your product will be marketed&lt;/li&gt;&#xA;&lt;li&gt;Define how the product will scale from personal to large corporate use&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Evaluate business opportunities&#xA;    &lt;div id=&#34;evaluate-business-opportunities&#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;#evaluate-business-opportunities&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Determine sale pricing&lt;/li&gt;&#xA;&lt;li&gt;Evaluate various sale models&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Packages&lt;/li&gt;&#xA;&lt;li&gt;Monthly&lt;/li&gt;&#xA;&lt;li&gt;Per action/item/amount&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Determine various cash flows&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Money paid to employees/self&lt;/li&gt;&#xA;&lt;li&gt;Money paid for services required by the product&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Evaluate tasks that have to be done globally and per client/project (if any)&lt;/li&gt;&#xA;&lt;li&gt;Evaluate anything that has to be paid for every client/project and once/globally&lt;/li&gt;&#xA;&lt;li&gt;Determine all factors that may vary&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Number of customers&lt;/li&gt;&#xA;&lt;li&gt;Number of days/months/years&lt;/li&gt;&#xA;&lt;li&gt;Disk space usage, bandwidth usage, computer usage&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Unsorted&#xA;    &lt;div id=&#34;unsorted&#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;#unsorted&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Track users requests&lt;/li&gt;&#xA;&lt;li&gt;Track users feedback&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Automated refactoring</title>
      <link>https://tomrochette.com/php/automated-refactoring/</link>
      <pubDate>Thu, 16 Jun 2016 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/php/automated-refactoring/</guid>
      <category>php</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Component extraction (find all dependencies and attempt to create a self-contained library)&lt;/li&gt;&#xA;&lt;li&gt;Convert function-based code into class-based code (static calls)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Copy all functions in a file into a new class where each function is static&lt;/li&gt;&#xA;&lt;li&gt;Find all calls to the initial functions and replace them with calls to the class&lt;/li&gt;&#xA;&lt;li&gt;Verify that all entry points load the autoloader (how to check that? search for the autoload.php string and require/include calls?)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Template/logic separation&lt;/li&gt;&#xA;&lt;li&gt;Extraction of functions into a separate file&lt;/li&gt;&#xA;&lt;li&gt;Extraction and replacement of inline style&lt;/li&gt;&#xA;&lt;li&gt;Extraction of string resources&lt;/li&gt;&#xA;&lt;li&gt;Extraction of inline JS&lt;/li&gt;&#xA;&lt;li&gt;Extraction of inline CSS&lt;/li&gt;&#xA;&lt;li&gt;Conversion of raw view logic to template logic&lt;/li&gt;&#xA;&lt;li&gt;Removal of inline PHP code in js code&lt;/li&gt;&#xA;&lt;li&gt;Convert raw SQL into builder queries&lt;/li&gt;&#xA;&lt;li&gt;Move queries in controller into a service/repository&lt;/li&gt;&#xA;&lt;li&gt;Convert &amp;lt;? to &amp;lt;?php&lt;/li&gt;&#xA;&lt;li&gt;Convert echo calls to string concat + return&lt;/li&gt;&#xA;&lt;li&gt;Update outdated phpdoc&lt;/li&gt;&#xA;&lt;li&gt;Improve typing (parameters and return)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Difficulties of code refactoring&#xA;    &lt;div id=&#34;difficulties-of-code-refactoring&#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;#difficulties-of-code-refactoring&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lot of code is SQL queries&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Refactoring to MVC&#xA;    &lt;div id=&#34;refactoring-to-mvc&#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;#refactoring-to-mvc&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agi/automated-refactoring/&#34; &gt;Automated refactoring&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Javascript datastores</title>
      <link>https://tomrochette.com/javascript-datastores/</link>
      <pubDate>Fri, 12 Feb 2016 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/javascript-datastores/</guid>
      <category>javascript</category><category>database</category><category>datastore</category>
      <description>&lt;p&gt;I am currently looking into javascript based libraries that will allow me to do in-browser queries, similar to how a server-side application would query a NoSQL database.&lt;/p&gt;&#xA;&lt;p&gt;In order to pick the most appropriate database for my project, I first search for available solutions online. Then, I build a comparison table like the one below in order to determine the most popular database and its current health.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Repository&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Watch&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Stars&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Forks&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Last commit&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Open issues&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Open PR&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/pouchdb/pouchdb&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;pouchdb/pouchdb&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;245&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;5730&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;630&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-12T17:23:21Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;128&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;8&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/google/lovefield&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;google/lovefield&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;173&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4143&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;195&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-11T05:59:09Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;17&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/louischatriot/nedb&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;louischatriot/nedb&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;167&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3680&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;237&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-11T11:23:44Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;19&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;8&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/typicode/lowdb&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;typicode/lowdb&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;87&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2833&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;96&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-09T21:16:31Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/techfort/LokiJS&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;techfort/LokiJS&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;102&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1800&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;167&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-08T19:18:40Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;64&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/coresmart/persistencejs&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;coresmart/persistencejs&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;89&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1586&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;226&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2015-09-08T18:47:06Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;66&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;14&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/typicaljoe/taffydb&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;typicaljoe/taffydb&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1309&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;215&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-01-07T22:21:06Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;57&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;16&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/agershun/alasql&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;agershun/alasql&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;60&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;927&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;107&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-09T15:35:07Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;250&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://github.com/Irrelon/ForerunnerDB&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Irrelon/ForerunnerDB&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;25&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;439&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;33&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2016-02-12T16:20:29Z&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;17&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>My AGI journey</title>
      <link>https://tomrochette.com/my-agi-journey/</link>
      <pubDate>Fri, 13 Nov 2015 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/my-agi-journey/</guid>
      <category>ai</category><category>agi</category>
      <description>&lt;p&gt;Over the next year (and hopefully years), I plan on working on AI, but more particularly what is known as AGI, Artificial General Intelligence.&lt;/p&gt;&#xA;&lt;p&gt;Since I am the kind of person that enjoys to overly plan, I&amp;rsquo;ve been thinking about the whole process for a while. Here&amp;rsquo;s a brief overview of how I plan to construct my days as well as my work.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Daily&#xA;    &lt;div id=&#34;daily&#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;#daily&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Beginning of the day&#xA;    &lt;div id=&#34;beginning-of-the-day&#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;#beginning-of-the-day&#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;Decide and plan on which projects I will work today&lt;/li&gt;&#xA;&lt;li&gt;Video log&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What will I be doing today?&lt;/li&gt;&#xA;&lt;li&gt;What might be blocking me or will be difficult and how do I plan to tackle that?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;During the day&#xA;    &lt;div id=&#34;during-the-day&#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;#during-the-day&#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;strong&gt;Record my thoughts:&lt;/strong&gt; Either through video logs or through written notes, which is the more likely option. This will allow me to search my thoughts as well as organize them as necessary. Furthermore, I hope I&amp;rsquo;ll be able to optimize my thought flow through tools.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;End of the day&#xA;    &lt;div id=&#34;end-of-the-day&#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;#end-of-the-day&#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;Video log&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What have I done during the day?&lt;/li&gt;&#xA;&lt;li&gt;What are the key takeaway of the day?&lt;/li&gt;&#xA;&lt;li&gt;What didn&amp;rsquo;t I do?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;While reading books/papers&#xA;    &lt;div id=&#34;while-reading-bookspapers&#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;#while-reading-bookspapers&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Take notes (of interesting sections and ideas)&lt;/li&gt;&#xA;&lt;li&gt;Write down thoughts&lt;/li&gt;&#xA;&lt;li&gt;Write down questions related to what is being read (for further exploration)&lt;/li&gt;&#xA;&lt;li&gt;Explore right away a question I might have had&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;After each &lt;em&gt;mini&lt;/em&gt; project&#xA;    &lt;div id=&#34;after-each-mini-project&#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;#after-each-mini-project&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I plan on working on multiple mini projects in order to ensure diversity as well as to allow me to spot projects which have the potential to be interesting and rewarding. However all projects are valuable in their own and it is important to reflect on the project at the end in order to extract things we&amp;rsquo;ll want to repeat in the future as well as things we&amp;rsquo;ll want to avoid.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Post mortem&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What went wrong&lt;/li&gt;&#xA;&lt;li&gt;What went right&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;At the end of each month&#xA;    &lt;div id=&#34;at-the-end-of-each-month&#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;#at-the-end-of-each-month&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Update the status of all tracked activities&lt;/li&gt;&#xA;&lt;li&gt;Write a list of things that were done during the month regarding each activity that was done. The purpose is to review what was done as well as provide a way to determine how well a project may/may not be progressing. It is also a good time for me to look at each individual activity that was done during the month and evaluate if I want to keep doing it or not.&lt;/li&gt;&#xA;&lt;li&gt;Write a post-mortem of the month, describing the good/bad of my current process and progress, with a section suggesting improvements to try for the next few months.&lt;/li&gt;&#xA;&lt;li&gt;Plan the projects/activities I will be working on next month, as well as their time allocation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Living process&#xA;    &lt;div id=&#34;living-process&#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;#living-process&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I will be experimenting with this process in the next few weeks and will iterate on it as I see fit. I will thus be updating this post as changes occurs and I think of better ways to do my work.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Things I do</title>
      <link>https://tomrochette.com/things-i-do/</link>
      <pubDate>Thu, 12 Nov 2015 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/things-i-do/</guid>
      <category>self</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;Work&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Software development&lt;/li&gt;&#xA;&lt;li&gt;Analysis&lt;/li&gt;&#xA;&lt;li&gt;Conception&lt;/li&gt;&#xA;&lt;li&gt;Implementation&lt;/li&gt;&#xA;&lt;li&gt;Testing&lt;/li&gt;&#xA;&lt;li&gt;Debugging&lt;/li&gt;&#xA;&lt;li&gt;Deployment&lt;/li&gt;&#xA;&lt;li&gt;QA&lt;/li&gt;&#xA;&lt;li&gt;Maintenance&lt;/li&gt;&#xA;&lt;li&gt;System administration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Sleep&lt;/li&gt;&#xA;&lt;li&gt;Eat&lt;/li&gt;&#xA;&lt;li&gt;Exercise&lt;/li&gt;&#xA;&lt;li&gt;Entertainment&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TV series&lt;/li&gt;&#xA;&lt;li&gt;Reddit&lt;/li&gt;&#xA;&lt;li&gt;Youtube&lt;/li&gt;&#xA;&lt;li&gt;Twitch&lt;/li&gt;&#xA;&lt;li&gt;Streams&lt;/li&gt;&#xA;&lt;li&gt;Video games&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Read&lt;/li&gt;&#xA;&lt;li&gt;Write&lt;/li&gt;&#xA;&lt;li&gt;Chat&lt;/li&gt;&#xA;&lt;li&gt;Email&lt;/li&gt;&#xA;&lt;li&gt;Transit&lt;/li&gt;&#xA;&lt;li&gt;Anki&lt;/li&gt;&#xA;&lt;li&gt;Piano&lt;/li&gt;&#xA;&lt;li&gt;Guitar&lt;/li&gt;&#xA;&lt;li&gt;Google&lt;/li&gt;&#xA;&lt;li&gt;Prepare food&lt;/li&gt;&#xA;&lt;li&gt;Bathroom&lt;/li&gt;&#xA;&lt;li&gt;Shower&lt;/li&gt;&#xA;&lt;li&gt;Wikipedia&lt;/li&gt;&#xA;&lt;li&gt;Groceries&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Docker-based jenkins slaves</title>
      <link>https://tomrochette.com/docker-based-jenkins-slaves/</link>
      <pubDate>Sat, 07 Nov 2015 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/docker-based-jenkins-slaves/</guid>
      <category>devops</category><category>docker</category><category>jenkins</category>
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In this article, we&amp;rsquo;ll go over how to setup Jenkins on an Ubuntu machine to run PHP 7.1 jobs. The steps should easily be adapted for any other OS and target environment.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Install Jenkins&#xA;    &lt;div id=&#34;install-jenkins&#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;#install-jenkins&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jenkins.io/&#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=jenkins.io&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://jenkins.io/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Install Jenkins plugins&#xA;    &lt;div id=&#34;install-jenkins-plugins&#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;#install-jenkins-plugins&#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;Docker Slaves Plugin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Install Docker on the slave (or host)&#xA;    &lt;div id=&#34;install-docker-on-the-slave-or-host&#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;#install-docker-on-the-slave-or-host&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/&#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=www.docker.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.docker.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Create a Docker image&#xA;    &lt;div id=&#34;create-a-docker-image&#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;#create-a-docker-image&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In a Dockerfile&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;FROM ubuntu:xenial&#xA;&#xA;COPY sources.list /etc/apt/sources.list&#xA;RUN useradd -m --uid=1001 jenkins&#xA;COPY known_hosts /home/jenkins/.ssh/known_hosts&#xA;RUN chown jenkins:jenkins -R /home/jenkins/.ssh&#xA;&#xA;RUN apt-get update&#xA;RUN DEBIAN_FRONTEND=&#34;noninteractive&#34; apt-get install -y git vim curl wget build-essential python-software-properties software-properties-common unzip&#xA;&#xA;RUN add-apt-repository -y ppa:ondrej/php&#xA;RUN apt-get update&#xA;RUN DEBIAN_FRONTEND=&#34;noninteractive&#34; apt-get install -y --force-yes php7.1 php7.1-xml php7.1-mbstring php7.1-zip php7.1-pdo-mysql php7.1-pdo-sqlite&#xA;&#xA;RUN apt-get -y autoremove &amp;&amp; apt-get clean &amp;&amp; apt-get autoclean &amp;&amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;docker build -t your/image:1.0.0 -t your/image:latest .&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Configure your Jenkins jobs&#xA;    &lt;div id=&#34;configure-your-jenkins-jobs&#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;#configure-your-jenkins-jobs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Specify the Docker image to use&#xA;    &lt;div id=&#34;specify-the-docker-image-to-use&#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;#specify-the-docker-image-to-use&#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;your/image (will use your/image:latest)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Use SSH keys within Docker&#xA;    &lt;div id=&#34;use-ssh-keys-within-docker&#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;#use-ssh-keys-within-docker&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;This is particularly useful if you need to pull git repositories from a private repository.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Notes&#xA;    &lt;div id=&#34;notes&#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;#notes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;As of December 2016, if you want to be able to use the SSH key in a docker container, you have to first start the ssh agent on the node used that will run the docker container and when you run the docker image, pass in the SSH_AUTH_SOCK as a volume so that it is shared with its host.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-groovy line-numbers&#34;&gt;&#xA;sshagent([&#39;IDENTIFIER&#39;]) {&#xA;&#x9;docker.image(&#39;your/jenkins-slave-image&#39;).inside(&#39;--volume $SSH_AUTH_SOCK:$SSH_AUTH_SOCK&#39;) {&#xA;&#x9;&#x9;// Here your SSH_AUTH_SOCK is shared with the host machine, which may be a jenkins slave&#xA;&#x9;&#x9;// All commands that would use SSH for authentication (such as git or composer when installing from private repositories) should work&#xA;&#x9;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Example Pipeline&#xA;    &lt;div id=&#34;example-pipeline&#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;#example-pipeline&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-groovy line-numbers&#34;&gt;&#xA;node(&#39;docker&#39;) {&#xA;&#x9;catchError {&#xA;&#x9;&#x9;timestamps {&#xA;&#x9;&#x9;&#x9;wrap([$class: &#39;AnsiColorBuildWrapper&#39;]) {&#xA;&#x9;&#x9;&#x9;&#x9;sshagent([&#39;private-git&#39;]) {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;docker.image(&#39;tomzx/jenkins-slave&#39;).inside(&#39;--volume $SSH_AUTH_SOCK:$SSH_AUTH_SOCK&#39;) {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;stage &#39;Checkout&#39;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;checkout scm&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;stage &#39;Setup dependencies&#39;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;sh &#39;wget -nc https://getcomposer.org/composer.phar&#39;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;sh &#39;php composer.phar install&#39;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;stage &#39;Test&#39;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;sh &#39;vendor/bin/phpunit&#39;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://zapier.com/engineering/continuous-integration-jenkins-docker-github/&#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=zapier.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://zapier.com/engineering/continuous-integration-jenkins-docker-github/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container&#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=engineering.riotgames.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Fitness trackers</title>
      <link>https://tomrochette.com/fitness-trackers/</link>
      <pubDate>Sat, 07 Nov 2015 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/fitness-trackers/</guid>
      <category>health</category><category>fitness</category>
      <description>&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Context&#xA;    &lt;div id=&#34;context&#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;#context&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve recently become interested in the &lt;a href=&#34;https://en.wikipedia.org/wiki/Quantified_Self&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;&lt;code&gt;Quantified Self&lt;/code&gt;&lt;/a&gt; and wanted to compare a few trackers in order to determine the quality of their solution.&lt;/p&gt;&#xA;&lt;p&gt;In this study, I compare the Fitbit Charge HR, the Jawbone UP3 and the RS300X. The Fitbit and the Jawbone are known as &lt;code&gt;activity/fitness trackers&lt;/code&gt; while the RS300X is an heart rate tracker.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Learned in this study&#xA;    &lt;div id=&#34;learned-in-this-study&#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;#learned-in-this-study&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Things to explore&#xA;    &lt;div id=&#34;things-to-explore&#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;#things-to-explore&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Fitbit and Jawbone are known fitness brand trackers. It&amp;rsquo;s been a couple of years now that these types of trackers are popular, so I&amp;rsquo;d expect them to have come to some level of maturity. The goal of this study is to evaluate the quality of the products, as much in term of hardware as software.&lt;/p&gt;&#xA;&lt;p&gt;In my case, I will be testing the Android applications since I own a Nexus 5. I would expect the experience to be quite similar on iOS.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve also bought an RS300X in order to test a &lt;em&gt;live&lt;/em&gt; heart rate tracker.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Fitbit Charge HR&#xA;    &lt;div id=&#34;fitbit-charge-hr&#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;#fitbit-charge-hr&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pros&#xA;    &lt;div id=&#34;pros&#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;#pros&#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;Has a little OLED display.&lt;/li&gt;&#xA;&lt;li&gt;UI/UX is pretty straightforward.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cons&#xA;    &lt;div id=&#34;cons&#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;#cons&#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;The bracelet broke about 3 months after I purchased it. Fitbit support was excellent though and I received a replacement bracelet within 2 days.&lt;/li&gt;&#xA;&lt;li&gt;Website errored out when I tried to create an application (preventing people from creating apps?)&lt;/li&gt;&#xA;&lt;li&gt;Cannot get fine grained data.&lt;/li&gt;&#xA;&lt;li&gt;Heart rate day availability is very odd. Seems to lag out and may display only in chunks.&lt;/li&gt;&#xA;&lt;li&gt;Shows up in my android smart lock as a bluetooth device I could pair with, but I can&amp;rsquo;t select it.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Jawbone UP3&#xA;    &lt;div id=&#34;jawbone-up3&#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;#jawbone-up3&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pros&#xA;    &lt;div id=&#34;pros-1&#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;#pros-1&#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;None at the moment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cons&#xA;    &lt;div id=&#34;cons-1&#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;#cons-1&#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;The bracelet broke about 4 months after I purchased it.&lt;/li&gt;&#xA;&lt;li&gt;Cannot get fine grained data.&lt;/li&gt;&#xA;&lt;li&gt;Doesn&amp;rsquo;t do real time heart rate tracking.&lt;/li&gt;&#xA;&lt;li&gt;Heart rate day availability is very odd. Seems to lag out and may display only in chunks.&lt;/li&gt;&#xA;&lt;li&gt;No idea why they decided to go with some weird buckle design. It looks like it&amp;rsquo;s a nice point of failure.&lt;/li&gt;&#xA;&lt;li&gt;After about a month it feels like the buckle is becoming loose. It is more and more frequent that it becomes undone and comes close to falling and I have to attach it back&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;After about two months the buckle is becoming loose very frequently. I&amp;rsquo;d say I have to &amp;ldquo;re-buckle&amp;rdquo; it at least 10-20 times per day. That is ignoring the fact that it&amp;rsquo;ll unbuckle while I sleep, making it pretty useless to sleep heart rate while sleeping.&lt;/li&gt;&#xA;&lt;li&gt;The four heart rate sensors on the lower part of the bracelet are uncomfortable.&lt;/li&gt;&#xA;&lt;li&gt;All the people I&amp;rsquo;ve shown the device to asked &amp;ldquo;why is there no display, show at least the time&amp;hellip;&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;Terribly clunky UI/UX. Why can&amp;rsquo;t I just swipe from day to day in any of the stats&lt;/li&gt;&#xA;&lt;li&gt;For that matter, why is it so hard to display the metrics I&amp;rsquo;m interested in and get rid of all those &amp;ldquo;pretty&amp;rdquo; suggestions cards?&lt;/li&gt;&#xA;&lt;li&gt;Why would you put unit selection (metric or imperial) as being configured through my height or weight? Is it to save me time or to confuse me?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Fitbit Charge HR vs Jawbone UP3&#xA;    &lt;div id=&#34;fitbit-charge-hr-vs-jawbone-up3&#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;#fitbit-charge-hr-vs-jawbone-up3&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Heart rate&#xA;    &lt;div id=&#34;heart-rate&#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;#heart-rate&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The following chart is the data I&amp;rsquo;ve collected over 3 days. In black is the Jawbone UP3 data and in blue the Fitbit Charge HR data.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;&#34;&#xA;    width=&#34;1892&#34;&#xA;    height=&#34;395&#34;&#xA;    src=&#34;https://tomrochette.com/fitness-trackers/images/heart-rate_hu_304b73b3c5aaa364.png&#34;&#xA;    srcset=&#34;https://tomrochette.com/fitness-trackers/images/heart-rate_hu_304b73b3c5aaa364.png 800w, https://tomrochette.com/fitness-trackers/images/heart-rate_hu_f9f27d6bbc4c13dd.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://tomrochette.com/fitness-trackers/images/heart-rate.png&#34;&gt;&lt;/figure&gt;&#xA;&lt;p&gt;Overall, the Fitbit Charge HR data is more consistent (every 5 minutes) while the Jawbone UP3 may end up having no data point for up to 2 hours. I assume this might be caused by how I&amp;rsquo;ve been wearing the bracelet but that is a weak argument.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pedometer&#xA;    &lt;div id=&#34;pedometer&#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;#pedometer&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Accuracy between the two devices can vary a lot.&lt;/p&gt;&#xA;&lt;p&gt;[Pedometer chart for comparison]&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Sleep monitoring&#xA;    &lt;div id=&#34;sleep-monitoring&#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;#sleep-monitoring&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Both devices seem to measure approximately the same amount of sleep. However the Jawbone UP3 has a nicer chart that goes into the various stages of sleep while the Fitbit Charge HR only displays Asleep/Restless/Awake.&lt;/p&gt;&#xA;&lt;p&gt;[Sleep monitoring chart for comparison]&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Polar RS300X&#xA;    &lt;div id=&#34;polar-rs300x&#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;#polar-rs300x&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pros&#xA;    &lt;div id=&#34;pros-2&#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;#pros-2&#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;None at the moment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cons&#xA;    &lt;div id=&#34;cons-2&#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;#cons-2&#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;Cannot get data out of device (for free).&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;If you want your data, pay us another 70$ +taxes for a transmission device&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Oh, and by the way, you&amp;rsquo;re going to send us those precious data over our web service so we can mine it for $&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;Watch freaks out if too close from chest strap.&lt;/li&gt;&#xA;&lt;li&gt;Who thought of this terrible buckle design? If I want to break the strap, that&amp;rsquo;s how I&amp;rsquo;d design the buckle.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;&#xA;&lt;h1 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;/h1&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Quantified self</title>
      <link>https://tomrochette.com/quantified-self/</link>
      <pubDate>Sat, 31 Oct 2015 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/quantified-self/</guid>
      <category>quantified self</category>
      <description>&#xA;&lt;h1 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;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://mashable.com/2014/08/21/most-connected-man/#nVcwQs7_ukq3&#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=mashable.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://mashable.com/2014/08/21/most-connected-man/#nVcwQs7_ukq3&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Software development processes</title>
      <link>https://tomrochette.com/software-development-processes/</link>
      <pubDate>Tue, 07 Jul 2015 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/software-development-processes/</guid>
      <category>software-engineering</category>
      <description>&lt;p&gt;This is a series of posts on the topic of software development processes.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Requirements&lt;/li&gt;&#xA;&lt;li&gt;Design&lt;/li&gt;&#xA;&lt;li&gt;Construction&lt;/li&gt;&#xA;&lt;li&gt;Testing&lt;/li&gt;&#xA;&lt;li&gt;Debugging&lt;/li&gt;&#xA;&lt;li&gt;Deployment&lt;/li&gt;&#xA;&lt;li&gt;Maintenance&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Documents&#xA;    &lt;div id=&#34;documents&#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;#documents&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Software requirements specification&lt;/li&gt;&#xA;&lt;li&gt;Software project plan&lt;/li&gt;&#xA;&lt;li&gt;Use cases&lt;/li&gt;&#xA;&lt;li&gt;Architecture&lt;/li&gt;&#xA;&lt;li&gt;Risk analysis&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Unsorted&#xA;    &lt;div id=&#34;unsorted&#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;#unsorted&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Documentation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Configuration management&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Quality assurance&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Verification&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Validation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Joint review&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Audit&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Problem resolution&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Analyse needs&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Create personas&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Scope &amp;amp; feasibility&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Requirements&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Technologies&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Architecture&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Components&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Implementation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Test &amp;amp; Deploy&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Evaluation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Improve system&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Maintenance&#xA;Reference: &lt;a href=&#34;https://www.researchgate.net/profile/Julius_Nganji/publication/264422652/figure/fig4/AS:296032350031876@1447591020322/A-Disability-aware-Software-Engineering-Process-Model.png&#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=www.researchgate.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.researchgate.net/profile/Julius_Nganji/publication/264422652/figure/fig4/AS:296032350031876@1447591020322/A-Disability-aware-Software-Engineering-Process-Model.png&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Project planning&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Process assessment and control&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Decision management&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Risk management&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Configuration management&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Information management&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Measurement&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Quality assurance&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Business or mission analysis&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Stakeholder needs and requirements definition&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Systems/Software requirements definition&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Architecture definition&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Design definition&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;System analysis&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Implementation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Integration&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Verification&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Transition&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Validation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Operation&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Maintenance&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Disposal&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/ISO/IEC_12207&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/ISO/IEC_12207&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Risk management&#xA;    &lt;div id=&#34;risk-management&#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;#risk-management&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;identify, characterize threats&lt;/li&gt;&#xA;&lt;li&gt;assess the vulnerability of critical assets to specific threats&lt;/li&gt;&#xA;&lt;li&gt;determine the risk (i.e. the expected likelihood and consequences of specific types of attacks on specific assets)&lt;/li&gt;&#xA;&lt;li&gt;identify ways to reduce those risks&lt;/li&gt;&#xA;&lt;li&gt;prioritize risk reduction measures&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://en.wikipedia.org/wiki/Risk_management&#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=en.wikipedia.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://en.wikipedia.org/wiki/Risk_management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>PHP Startup Internals</title>
      <link>https://tomrochette.com/php-startup-internals/</link>
      <pubDate>Sun, 01 Mar 2015 09:00:00 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/php-startup-internals/</guid>
      <category>programming</category><category>php</category><category>startup</category><category>internals</category>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;PHP&lt;/li&gt;&#xA;&lt;li&gt;MySQL&lt;/li&gt;&#xA;&lt;li&gt;Jenkins&lt;/li&gt;&#xA;&lt;li&gt;Apache/Nginx&lt;/li&gt;&#xA;&lt;li&gt;Linux (Ubuntu)&lt;/li&gt;&#xA;&lt;li&gt;node.js/io.js&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;My goal with this post (and any subsequent posts) is to share my thoughts and current practices on the topic of developing PHP applications in a startup environment.&lt;/p&gt;&#xA;&lt;p&gt;Starting a new startup means making decisions. Which framework to choose, what tool to use, which programming language, what task should be done before this other task, etc.&lt;/p&gt;&#xA;&lt;p&gt;Starting is often overwhelming. What should be done first? If we ignore all the questions about the business (what sector? any specific niche? what sort of product?), then the first thing that an individual or a team should aim for is to prepare for iteration.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The first step&#xA;    &lt;div id=&#34;the-first-step&#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-first-step&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Many would start by working directly on their first project. It makes sense since it is the primary goal of your startup to produce results. However, writing code without establishing some sort of workflow framework will be inefficient.&lt;/p&gt;&#xA;&lt;p&gt;My first step is generally to setup Jenkins, a continuous integration tool. It allows me to setup automated testing and automated deployment to a development/staging area/environment. This is useful for two purposes:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Having an external &amp;ldquo;party&amp;rdquo; execute the test in their own environment (separate from mine). This validates that whatever is in source control will work on someone else computer.&lt;/li&gt;&#xA;&lt;li&gt;It deploys automatically &amp;ldquo;stable&amp;rdquo; (in the sense that they pass testing) version to an online facing server. With automated deployment, it is possible for me to keep on writing code, have it tested and then deployed to a server where I can ask others to take a look at and provide feedback.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There are a couple of way to get setup.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;The easy way&#xA;    &lt;div id=&#34;the-easy-way&#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-easy-way&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Everything will be setup on the same machine. Here is how it basically goes:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install jenkins&lt;/li&gt;&#xA;&lt;li&gt;Create two jenkins jobs, &lt;code&gt;project-name-develop&lt;/code&gt; which takes care of building the &lt;code&gt;develop&lt;/code&gt; branch of your repository and run the tests (basic continuous integration), and &lt;code&gt;project-name-develop-to-development&lt;/code&gt;, which will again, build the &lt;code&gt;develop&lt;/code&gt; branch of your repository but this time for the purpose of having it available online.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Jenkins installation&#xA;    &lt;div id=&#34;jenkins-installation&#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;#jenkins-installation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;There won&amp;rsquo;t be much to discuss here except a list of plugins that are almost mandatory (either because they make jenkins much more useful or allow you to more quickly diagnose issues).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;AnsiColor&lt;/li&gt;&#xA;&lt;li&gt;Checkstyle Plug-in&lt;/li&gt;&#xA;&lt;li&gt;Clover PHP plugin&lt;/li&gt;&#xA;&lt;li&gt;Credentials Plugin&lt;/li&gt;&#xA;&lt;li&gt;Duplicate Code Scanner Plug-in&lt;/li&gt;&#xA;&lt;li&gt;GIT client plugin&lt;/li&gt;&#xA;&lt;li&gt;GIT plugin&lt;/li&gt;&#xA;&lt;li&gt;HTML Publisher plugin&lt;/li&gt;&#xA;&lt;li&gt;JDepend Plugin&lt;/li&gt;&#xA;&lt;li&gt;JUnit Plugin&lt;/li&gt;&#xA;&lt;li&gt;Mailer Plugin&lt;/li&gt;&#xA;&lt;li&gt;Matrix Authorization Strategy Plugin&lt;/li&gt;&#xA;&lt;li&gt;Matrix Project Plugin&lt;/li&gt;&#xA;&lt;li&gt;Node and Label parameter plugin&lt;/li&gt;&#xA;&lt;li&gt;Parameterized Trigger plugin&lt;/li&gt;&#xA;&lt;li&gt;Plot plugin&lt;/li&gt;&#xA;&lt;li&gt;PMD Plug-in&lt;/li&gt;&#xA;&lt;li&gt;Self-Organizing Swarm Plug-in Modules&lt;/li&gt;&#xA;&lt;li&gt;Slack Notification Plugin&lt;/li&gt;&#xA;&lt;li&gt;SSH Credentials Plugin&lt;/li&gt;&#xA;&lt;li&gt;SSH Slaves plugin&lt;/li&gt;&#xA;&lt;li&gt;Static Analysis Utilities&lt;/li&gt;&#xA;&lt;li&gt;Throttle Concurrent Builds Plug-in&lt;/li&gt;&#xA;&lt;li&gt;Timestamper&lt;/li&gt;&#xA;&lt;li&gt;Violations plugin&lt;/li&gt;&#xA;&lt;li&gt;xUnit plugin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Jenkins jobs&#xA;    &lt;div id=&#34;jenkins-jobs&#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;#jenkins-jobs&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll now go into more details as to what each does.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;&lt;code&gt;project-name-develop&lt;/code&gt;&#xA;    &lt;div id=&#34;project-name-develop&#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;#project-name-develop&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Pull the latest revision from the repository&lt;/li&gt;&#xA;&lt;li&gt;Download and update composer (if required)&lt;/li&gt;&#xA;&lt;li&gt;Install dependencies&#xA;&lt;ol&gt;&#xA;&lt;li&gt;bower install&lt;/li&gt;&#xA;&lt;li&gt;npm install&lt;/li&gt;&#xA;&lt;li&gt;composer install&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Build assets to validate they compile&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Compile LESS into CSS&lt;/li&gt;&#xA;&lt;li&gt;Concatenate and minify JS&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Prepare the application environment&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Migrate database&lt;/li&gt;&#xA;&lt;li&gt;Seed database&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Run continuous integration tools to assert code quality&#xA;&lt;ol&gt;&#xA;&lt;li&gt;phpunit&lt;/li&gt;&#xA;&lt;li&gt;phploc&lt;/li&gt;&#xA;&lt;li&gt;pdepend&lt;/li&gt;&#xA;&lt;li&gt;phpmd&lt;/li&gt;&#xA;&lt;li&gt;phpcs&lt;/li&gt;&#xA;&lt;li&gt;phpcpd&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;An iterative cycle here should take less than 5 minutes (and a maximum of 30 minutes). The goal is to quickly know after pushing changes to your repository that nothing is broken.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;&lt;code&gt;project-name-develop-to-development&lt;/code&gt;&#xA;    &lt;div id=&#34;project-name-develop-to-development&#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;#project-name-develop-to-development&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;For this to work, you simply need to make a symbolic link from the jenkins project workspace to some path which apache/nginx makes available to external users. For example&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;/home/jenkins/workspace/project-a-develop-to-development/public -&amp;gt; /var/www/development/project-a&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Pull the latest revision from the repository&lt;/li&gt;&#xA;&lt;li&gt;Download and update composer (if required)&lt;/li&gt;&#xA;&lt;li&gt;Install dependencies&#xA;&lt;ol&gt;&#xA;&lt;li&gt;bower install&lt;/li&gt;&#xA;&lt;li&gt;npm install&lt;/li&gt;&#xA;&lt;li&gt;composer install&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Build/Prepare website&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Compile LESS into CSS&lt;/li&gt;&#xA;&lt;li&gt;Concatenate and minify JS&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Prepare the application environment&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Migrate database&lt;/li&gt;&#xA;&lt;li&gt;Seed database&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;An iterative cycle here should take less than 5 minutes. Anything that takes longer than that would be suspicious.&lt;/p&gt;&#xA;&#xA;&lt;h4 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h4&gt;&#xA;&lt;p&gt;Now that you have both projects setup, here&amp;rsquo;s how things work. First, &lt;code&gt;project-name-develop&lt;/code&gt; is triggered every 1-5 minutes and checks the repository for changes. If changes are detected, a build starts and will verify that the current state of the code is valid.&lt;/p&gt;&#xA;&lt;p&gt;Once the build finishes, if it is successful, &lt;code&gt;projecy-name-develop-to-development&lt;/code&gt; will start (triggered on &lt;code&gt;project-name-develop&lt;/code&gt; success). It will deploy the stable code so that users may test it.&lt;/p&gt;&#xA;&lt;p&gt;A whole change cycle will generally take from 1 to 30 minutes depending on how many tests you have and how well you&amp;rsquo;ve been able to optimize your jenkins build workflow.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Speeding up your jenkins workflow&#xA;    &lt;div id=&#34;speeding-up-your-jenkins-workflow&#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;#speeding-up-your-jenkins-workflow&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a list of things to try/check:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you are running &lt;code&gt;phpunit&lt;/code&gt; with code coverage, disable it and run it in a separate jenkins project. Code coverage is 2-5x slower than without it. When you are running the tests, you want to know the results fast and code coverage should not be a priority. Speed is the priority.&lt;/li&gt;&#xA;&lt;li&gt;If you are running tests against a database and the tests requires setting up and tearing down the database (either just truncating the tables or full DROP tables), search for ways to avoid hitting the database or how to improve performance. For example, if you are testing using SQLite, run an initial database migration and seeding and copy the resulting .sqlite file so that it can be copied on test setup instead of migrating/seeding every time.&lt;/li&gt;&#xA;&lt;li&gt;If migrating/seeding takes a long time, keep the resulting .sqlite file and only rebuild it if its source files (dependencies) have changed. On a project, you will run tests much more often than you will be rebuilding the .sqlite file, so it is worth investing in developing such a tool.&lt;/li&gt;&#xA;&lt;li&gt;Since &lt;code&gt;php&lt;/code&gt; is single threaded, look for tools that will enable you to do multi-process php testing. An example of such tool is &lt;a href=&#34;https://github.com/liuggio/fastest&#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=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;liuggio/fastest&lt;/a&gt;. Depending on the number of processors/cores you have available, you could see a 4-8x gain in speed.&lt;/li&gt;&#xA;&lt;li&gt;If you have the money/hardware, distribute testing over many machines. If you want a unified phpunit code coverage/results, you can use &lt;code&gt;phpcov&lt;/code&gt; to merge separate test results into a single result file.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Business process</title>
      <link>https://tomrochette.com/business-process/</link>
      <pubDate>Wed, 08 Jan 2014 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/business-process/</guid>
      
      <description>&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Overview&#xA;    &lt;div id=&#34;overview&#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;#overview&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The following is a list of things I do at regular intervals regarding my business in the hopes of improving how well it works.&lt;/p&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Lifetime&#xA;    &lt;div id=&#34;lifetime&#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;#lifetime&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Plan how the business will be when it is &amp;ldquo;finished&amp;rdquo;, then backtrack to the present and plan how you’ll get there&lt;/li&gt;&#xA;&lt;li&gt;Define the business you want and then start implementing it from day one&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Yearly&#xA;    &lt;div id=&#34;yearly&#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;#yearly&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reflect on the year that completed and determine what you want to get rid of and what you want improve&lt;/li&gt;&#xA;&lt;li&gt;Plan the high level goals for the year to come&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Monthly&#xA;    &lt;div id=&#34;monthly&#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;#monthly&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Find what the 80/20 of the business is at the moment and plan the month with that in mind&lt;/li&gt;&#xA;&lt;li&gt;Track the progress of the overall goals&lt;/li&gt;&#xA;&lt;li&gt;Review/Update the business process&lt;/li&gt;&#xA;&lt;li&gt;Figure out where time is wasted and work to get rid of that time&lt;/li&gt;&#xA;&lt;li&gt;Try to automate as much as possible / Look for things that are worth optimizing&lt;/li&gt;&#xA;&lt;li&gt;Find things you can innovate on (things that are mundane but could be changed in order to improve something)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Weekly&#xA;    &lt;div id=&#34;weekly&#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;#weekly&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Do a problem/root cause analysis on any issue that is occurring enough to be a problem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h1 class=&#34;relative group&#34;&gt;Daily&#xA;    &lt;div id=&#34;daily&#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;#daily&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Quantify everything you can, then track/measure it (with proper statistical analysis)&lt;/li&gt;&#xA;&lt;li&gt;Evaluate different changes and their impact&lt;/li&gt;&#xA;&lt;li&gt;Figure out what is &lt;strong&gt;The Best Way&lt;/strong&gt; to do everything&lt;/li&gt;&#xA;&lt;li&gt;Note everything that is a problem (so that you can fix it while doing a monthly review)&lt;/li&gt;&#xA;&lt;li&gt;Test ideas&lt;/li&gt;&#xA;&lt;li&gt;Work on making the process/results predictable (by the customers)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Munin, mysql and semaphore: how to deal with the &#34;identifier removed&#34; error</title>
      <link>https://tomrochette.com/munin-mysql-and-semaphore-how-to-deal-with-the-identifier-removed-error/</link>
      <pubDate>Wed, 02 Oct 2013 22:14:13 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/munin-mysql-and-semaphore-how-to-deal-with-the-identifier-removed-error/</guid>
      <category>programming</category><category>identifier-removed</category><category>ipcrm</category><category>ipcs</category><category>munin</category><category>mysql</category><category>semaphore</category>
      <description>&lt;p&gt;The following depicts how I “solved” a problem I recently had regarding munin, its mysql plugins and the shared memory cache library used by the plugins (written in perl and using IPC::ShareLite).&lt;/p&gt;&#xA;&lt;p&gt;First off, let’s begin with a description of the problem. I posted the following on &lt;a href=&#34;http://www.http://serverfault.com/questions/542232/munin-mysql-plugins-results-inconsistent-with-ipcsharelite-store-error-ide&#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=www.http%3a&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;serverfault.com&lt;/a&gt; in hope I’d get help from someone more experienced than I am.&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;I’ve recently setup a munin-node on a CentOS server. All was working fine until I tried to add the apache plugin (which works fine).&lt;/p&gt;&#xA;&lt;p&gt;For some odd reason, the mysql plugins for munin that used to work ceased to work… I’m now getting a weird error whenever I’m running the plugin with &lt;code&gt;munin-run&lt;/code&gt;. For instance&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;munin-run mysql_files_tables&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;returns me&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;IPC::ShareLite store() error: Identifier removed at /usr/lib/perl5/vendor_perl/5.8.8/Cache/SharedMemoryBackend.pm line 156&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;but sometimes it will also return&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;table_open_cache.value 64&#xA;Open_files.value 58&#xA;Open_tables.value 64&#xA;Opened_tables.value 19341&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;but after a while it will revert to the previous error.&lt;/p&gt;&#xA;&lt;p&gt;I do not have any knowledge about the IPC or the ShareLite library so I don’t really know were to start looking. Since it is a module related to shared memory, I tried tracking down shared memory segments with &lt;code&gt;ipcs&lt;/code&gt; without much success.&lt;/p&gt;&#xA;&lt;p&gt;I haven’t yet rebooted the machine as it is used for many projects (I’d obviously like to be able to diagnose the problem without requiring a restart if it was possible).&lt;/p&gt;&#xA;&lt;p&gt;Has anyone faced this problem? (a quick search on google didn’t present any relevant help)&lt;/p&gt;&#xA;&lt;p&gt;Thanks for the help!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Obviously, one can see quickly that this is a quite specific question that not many may have actually encountered. Thus, I didn’t expect to receive much help out of it (and I didn’t).&lt;/p&gt;&#xA;&lt;p&gt;I had left this issue on the side for a couple of days hoping to come back to it at some point. Munin and the mysql plugins were installed on two servers and it was working fine on both of them (and a third one as master node). After a minor change, one of two &lt;em&gt;client&lt;/em&gt; nodes stopped working correctly while the other was still fine. After a couple of days though the second server also decided to exhibit a similar issue…&lt;/p&gt;&#xA;&lt;p&gt;Tonight I remembered about &lt;code&gt;strace&lt;/code&gt;, which is pretty awesome in circumstances like this one. I went ahead and launched &lt;code&gt;strace munin-run mysql_files_tables&lt;/code&gt; which outputted a lot of stuff and then stopped at the following point:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;...&#xA;ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff13da8e30) = -1 ENOTTY (Inappropriate ioctl for device)&#xA;lseek(4, 0, SEEK_CUR)                   = 0&#xA;read(4, &#34;# Carp::Heavy uses some variable&#34;..., 4096) = 4096&#xA;brk(0x163e7000)                         = 0x163e7000&#xA;read(4, &#34;\n    redo if $Internal{$caller};&#34;..., 4096) = 1737&#xA;read(4, &#34;&#34;, 4096)                       = 0&#xA;close(4)                                = 0&#xA;write(2, &#34;IPC::ShareLite store() error: Id&#34;..., 123IPC::ShareLite store() error: Identifier removed at /usr/lib/perl5/vendor_perl/5.8.8/Cache/SharedMemoryBackend.pm line 156&#xA;) = 123&#xA;semop(14581770, 0x2ab08bb67cf0, 3&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;and when it is actually fixed, the application would end instead (outputting a bunch of stuff such as the following)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;...&#xA;stat(&#34;/usr/lib64/perl5/auto/Storable/_freeze.al&#34;, {st_mode=S_IFREG|0644, st_size=706, ...}) = 0&#xA;stat(&#34;/usr/lib64/perl5/auto/Storable/_freeze.al&#34;, {st_mode=S_IFREG|0644, st_size=706, ...}) = 0&#xA;open(&#34;/usr/lib64/perl5/auto/Storable/_freeze.al&#34;, O_RDONLY) = 4&#xA;ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffe7223570) = -1 ENOTTY (Inappropriate ioctl for device)&#xA;lseek(4, 0, SEEK_CUR)                   = 0&#xA;read(4, &#34;# NOTE: Derived from ../../lib/S&#34;..., 4096) = 706&#xA;read(4, &#34;&#34;, 4096)                       = 0&#xA;close(4)                                = 0&#xA;semop(917514, {{1, 0, 0}, {2, 0, 0}, {2, 1, SEM_UNDO}}, 3) = 0&#xA;semop(917514, {{2, -1, SEM_UNDO|IPC_NOWAIT}}, 1) = 0&#xA;semop(917514, {{1, 0, 0}, {2, 0, 0}, {2, 1, SEM_UNDO}}, 3) = 0&#xA;shmdt(0x7fc30021f000)                   = 0&#xA;semop(917514, {{2, -1, SEM_UNDO|IPC_NOWAIT}}, 1) = 0&#xA;...&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;How to “fix” the problem&#xA;    &lt;div id=&#34;how-to-8220fix8221-the-problem&#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;#how-to-8220fix8221-the-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;What you can see in the first output above is pretty interesting. The semop call gives you the semid the process is trying to obtain (the semaphore used to synchronize different processes using the same shared memory). The signature of the semop function is as follow:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-cpp line-numbers&#34;&gt;&#xA;int semop(int semid, struct sembuf *sops, unsigned nsops);&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;where&#xA;&lt;strong&gt;semid:&lt;/strong&gt; semaphore id&#xA;&lt;strong&gt;sops:&lt;/strong&gt; pointer to a sembuf struct&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-cpp line-numbers&#34;&gt;&#xA;struct sembuf {&#xA;&#x9;u_short sem_num; /* semaphore # */&#xA;&#x9;short   sem_op;  /* semaphore operation */&#xA;&#x9;short   sem_flg; /* operation flags */&#xA;};&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;nsops:&lt;/strong&gt; the length of sops&lt;/p&gt;&#xA;&lt;p&gt;Upon first inspection, you can see that the sembuf in the first case seems to be invalid if you compare it with the working version where it is actually resolved (strace displays something such as &lt;code&gt;{{2, -1, SEM_UNDO|IPC_NOWAIT}}&lt;/code&gt; instead of &lt;code&gt;0x2ab08bb67cf0&lt;/code&gt;. But that is not helping me much.&lt;/p&gt;&#xA;&lt;p&gt;With that semid you can do two things: first, you can check if it is still alive by calling &lt;code&gt;ipcs&lt;/code&gt;, second, you can remove it with &lt;code&gt;ipcrm -s semid&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In my case the “fix” itself was to remove the semaphore that the plugin wasn’t able to obtain (the reason of this still elude me though). After the removal of the semaphore, it is possible again to run munin correctly and the &lt;strong&gt;identifier removed&lt;/strong&gt; error is gone.&lt;/p&gt;&#xA;&lt;p&gt;I will have to do more research as to how/why this issue occurs as I’ve seen it happen only on CentOS machines so far (the master server is a Debian machine).&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Accepting self-signed (or unknown) certificates with TortoiseGit</title>
      <link>https://tomrochette.com/accepting-self-signed-or-unknown-certificates-with-tortoisegit/</link>
      <pubDate>Wed, 18 Sep 2013 03:16:44 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/accepting-self-signed-or-unknown-certificates-with-tortoisegit/</guid>
      <category>programming</category><category>certificates</category><category>git</category><category>tortoisegit</category>
      <description>&lt;p&gt;For some odd reason it seems that the system designed into &lt;a href=&#34;https://code.google.com/p/tortoisegit/&#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=code.google.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;TortoiseGit&lt;/a&gt; doesn&amp;rsquo;t allow the user to interact with git when it requires user interaction. For instance, accepting self-signed certificated is not possible, which gives you the known &lt;a href=&#34;https://gitlab.com/tortoisegit/tortoisegit/issues/318&#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=gitlab.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;issue 318&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As of TortoiseGit 1.8.5.0, it is still not possible to accept certificates through the GUI. But it is possible to get your git repository to work with TortoiseGit (and work with the required certificate).&lt;/p&gt;&#xA;&lt;p&gt;You will need to have &lt;strong&gt;msysgit&lt;/strong&gt; installed and available in your PATH for the following to work.&lt;/p&gt;&#xA;&lt;p&gt;The first step is to run some git command, for instance &lt;code&gt;git clone https://myserver.com/depot&lt;/code&gt; via a command line so that git may auto-accept (or ask you to accept) the certificate. This step is crucial to get the certificate details saved onto your machine.&lt;/p&gt;&#xA;&lt;p&gt;What you will want to do next is go to &lt;code&gt;C:\Program Files (x86)\Git\.subversion&lt;/code&gt; and copy everything into &lt;code&gt;%USERPROFILE%\.subversion&lt;/code&gt;. Basically, this should copy the certicates that were accepted by msysgit so they can be used by TortoiseGit.&lt;/p&gt;&#xA;&lt;p&gt;Another, and possibly better solution, is to create a symbolic link so that those 2 folders are in fact a single one. For instance, you could do something such as&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;move %USERPROFILE%\.subversion %USERPROFILE%\.subversion_backup&#xA;mklink /D %USERPROFILE%\.subversion &#34;C:\Program Files (x86)\Git\.subversion&#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;which will make &lt;code&gt;%USERPROFILE%\.subversion&lt;/code&gt; point to your &lt;code&gt;C:\Program Files (x86)\Git\.subversion&lt;/code&gt; folder. This has the benefit that any future certificate will work both for msysgit and TortoiseGit.&lt;/p&gt;&#xA;&lt;p&gt;Thanks to &lt;a href=&#34;http://blog.malook.de/2010/10/tortoisegit-as-frontend-to-https-svn.html&#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=blog.malook.de&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Mexx’ C# Corner&lt;/a&gt; for pointing out the solution.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>2012 ManicTime review</title>
      <link>https://tomrochette.com/2012-manictime-review/</link>
      <pubDate>Sat, 05 Jan 2013 08:12:11 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/2012-manictime-review/</guid>
      <category>productivity</category><category>time-management</category><category>manictime</category>
      <description>&lt;p&gt;As 2012 ended, I wanted to take a look back at this year and review my computer usage/consumption in order to reduce time wasting activity. That time should be channeled into more meaningful activities like learning a new language, improving my current skills, practicing piano and more.&lt;/p&gt;&#xA;&lt;p&gt;The following data has been collected from August 11, 2012 to December 31, 2012. There is about 14 days which do not have any data (application was closed).&lt;/p&gt;&#xA;&lt;p&gt;The data covers my computer usage with over 966.21h of active usage. During the period for which I collected data, the computer was also powered off for 1686.30h and left unused (away) for approximately 58.04h.&lt;/p&gt;&#xA;&lt;p&gt;If we account 2 months of 31 days + 2 months of 30 days + 20 days (August) - 14 days without data = 128 days of data. This would average to 7.55h/day of active computer usage. The way it is currently &amp;ldquo;structured&amp;rdquo; however is that computer usage during the week is about 4-5h/day while on the week-end, it is about 12h/day.&lt;/p&gt;&#xA;&lt;p&gt;This sounds a bit high, but there&amp;rsquo;s a reason to this. I&amp;rsquo;m not ACTIVELY using the computer for all that time. In ManicTime, the computer is considered active if the computer is being used at least once within a 60 minutes time frame. This means I could potentially be using the computer for 1 minute (or less) every hour and it would count as an active usage of 1h. But for the sake of this review, I&amp;rsquo;ll consider myself as a computer addict (which I am) and will count every minute as an active minute.&lt;/p&gt;&#xA;&lt;p&gt;The following top 10 items accounts for 876.18h out of the 966.21h of active usage of the computer.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;strong&gt;Hours&lt;/strong&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Chrome&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;457.76&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Remote Desktop Connection&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;179.11&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;League of Legends (TM) Client&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;72.69&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;VLC media player&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;62.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;HexChat&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;35.81&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Free Alarm Clock&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;15.02&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;mRemote&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;14.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Sublime Text 2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;14.56&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Windows Explorer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;12.13&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Torchlight II&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;11.3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;On first sight we can see that I spend a lot of time browsing the web. I do various things on there and since it is the biggest chunk of my time, it is worth looking at what I do exactly on the web. The following table is the top 10 websites I&amp;rsquo;ve spent time on.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Web activity&#xA;    &lt;div id=&#34;web-activity&#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;#web-activity&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;strong&gt;Website&lt;/strong&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;strong&gt;Hours&lt;/strong&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.reddit.com&#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=www.reddit.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.reddit.com&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;165.53&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.jolteon.net&#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=www.jolteon.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.jolteon.net&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;19.33&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.youtube.com&#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=www.youtube.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.youtube.com&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;17.51&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;docs.google.com&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;12.79&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;-confidential-&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;12.66&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.twitch.tv&#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=www.twitch.tv&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.twitch.tv&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;9.34&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.google.ca&#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=www.google.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.google.ca&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;8.18&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;en.wikipedia.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4.92&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://www.facebook.com&#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=www.facebook.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.facebook.com&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4.81&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;mail.google.com&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4.08&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;This covers 259.15h out of 457.76h (56.6%) spent in &lt;strong&gt;Chrome&lt;/strong&gt;. This means that I have a long-tail (a list of many different websites which I visit for a brief period) of 198.61h. The major time consumer here is &lt;a href=&#34;https://www.reddit.com&#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=www.reddit.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.reddit.com&lt;/a&gt;, which accounts for 36.2% of my time browsing. Even though reddit is a news/media website (useful for staying up to date with world events, not sure I do that&amp;hellip;), it also contains a lot of content which I would categorize as time wasters: funny pictures, pictures of cats, videos as well as discussions about topics of interests (computer science, software engineer, robotics, electronics, etc.). I spent about 1.3h/day during the 128 days for which I collected data, which I find to be quite a lot.&lt;/p&gt;&#xA;&lt;p&gt;As for the other sites, here&amp;rsquo;s a couple of notes:&#xA;&lt;strong&gt;&lt;a href=&#34;https://www.jolteon.net&#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=www.jolteon.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.jolteon.net&lt;/a&gt;:&lt;/strong&gt; This is a bug tracker I use to track new features/bugs where I work. It serves as a personal system for me to track these issues. I use it frequently to update task statuses as well as enter anything that I may have forgotten to add during the day. I also like to review it frequently to remind myself of what is left to work on (and let my mind figure that out while I sleep)&#xA;&lt;strong&gt;&lt;a href=&#34;https://www.youtube.com&#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=www.youtube.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.youtube.com&lt;/a&gt;:&lt;/strong&gt; I often get on youtube because of reddit. I enjoy watching documentaries which last from 30-45 minutes on average.&#xA;&lt;strong&gt;docs.google.com:&lt;/strong&gt; I&amp;rsquo;ve spent some time writing documents in Google Docs simply because it allowed me to share them with others so they could review my work.&#xA;&lt;strong&gt;-confidential-:&lt;/strong&gt; This is a website I use to manage &amp;ldquo;things&amp;rdquo; for work. I generally go there every day and it takes me from 5-15 minutes on average.&#xA;&lt;strong&gt;&lt;a href=&#34;https://www.twitch.tv&#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=www.twitch.tv&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.twitch.tv&lt;/a&gt;:&lt;/strong&gt; Watching streamers of Starcraft 2 and LoL for a while.&#xA;&lt;strong&gt;&lt;a href=&#34;https://www.google.ca&#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=www.google.ca&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.google.ca&lt;/a&gt;:&lt;/strong&gt; Looks like I spend a lot of time searching&amp;hellip;&#xA;&lt;strong&gt;en.wikipedia.org:&lt;/strong&gt; Whenever I don&amp;rsquo;t know something about a subject of interest, wiki is a good source (generally&amp;hellip;)&#xA;&lt;strong&gt;&lt;a href=&#34;https://www.facebook.com&#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=www.facebook.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.facebook.com&lt;/a&gt;:&lt;/strong&gt; Checking that everyone I know is still alive&#xA;&lt;strong&gt;mail.google.com:&lt;/strong&gt; Because I like spam&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Back to the apps&#xA;    &lt;div id=&#34;back-to-the-apps&#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;#back-to-the-apps&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;If we go back to the applications I use, the next in the list is &lt;strong&gt;Remote Desktop Connection&lt;/strong&gt;. I use &lt;strong&gt;Remote Desktop Connection&lt;/strong&gt; to connect to my PC at work so that I can do some work from home. As you can see, I have spent almost 1.44h/day working remotely. Considering that I am not a &amp;ldquo;work at home&amp;rdquo; employee, I find this to be outrageously high. I would like to see this be as close as possible to 0h/day.&lt;/p&gt;&#xA;&lt;p&gt;Next is &lt;strong&gt;League of Legends (TM) Client&lt;/strong&gt;. I&amp;rsquo;ve recently been interested in the game and started to play it on a more regular basis. I would like to keep this at around 1h/day or lower.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve used &lt;strong&gt;VLC media player&lt;/strong&gt; to watch series as well as movie on my PC. Series are 20-45 minutes while movies varies from 1h30 to 3h30. I&amp;rsquo;d say that about 225h/year looks like an acceptable amount of time spent on this.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve stopped using MSN to chat with friends. My main communication channel is now through IRC, for which I use the &lt;strong&gt;HexChat&lt;/strong&gt; client. I want to spend a maximum of 1h/day on communication though.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not too sure why &lt;strong&gt;Free Alarm Clock&lt;/strong&gt; is part of the top 10. I believe this has to do with the note I wrote at the beginning mentioning that ManicTime would consider a program active if there was some movement on the screen in the last 60 minutes. Since &lt;strong&gt;Free Alarm Clock&lt;/strong&gt; was set to show up (and take focus) every hour, it is quite possible that it simply appeared from time to time while I was away and &amp;ldquo;sucked&amp;rdquo; the time out of whatever was running in the background.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;mRemote&lt;/strong&gt; is another application I used briefly to do remote desktop. Since it doesn&amp;rsquo;t support multiple monitor remoting, I&amp;rsquo;ve stopped using it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sublime Text 2&lt;/strong&gt; is my text editor of choice. I haven&amp;rsquo;t spent a lot of time in it since August mainly because I haven&amp;rsquo;t been doing any coding at all in the past few months.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Windows Explorer&lt;/strong&gt; Some time spent searching for files on my PC!&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve played through the whole campaign of &lt;strong&gt;Torchlight II&lt;/strong&gt;, which was pretty awesome! I&amp;rsquo;d be really happy to try multiplayer with some willing friends to see what the end content is like (single player end of game content was pretty funny, but playing it alone wasn&amp;rsquo;t very satisfying for me).&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Conclusion&#xA;    &lt;div id=&#34;conclusion&#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;#conclusion&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The important part of this process, other than reviewing what time was spent on this year, is to decide new objectives going forward. This means deciding what should be cut down, reduced, increased or added. For each application I&amp;rsquo;ve already determined what was my goal/limits thus I simply need to make sure I follow them. A monthly review should be sufficient.&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Recommendations&#xA;    &lt;div id=&#34;recommendations&#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;#recommendations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reduce reddit usage below 1h/day&lt;/li&gt;&#xA;&lt;li&gt;Reduce/cut time spend doing remoting for work&lt;/li&gt;&#xA;&lt;li&gt;Redistribute free time on learning activities and skills improvement&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Short SSD setup guide</title>
      <link>https://tomrochette.com/short-ssd-setup-guide/</link>
      <pubDate>Sat, 05 Jan 2013 08:12:09 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/short-ssd-setup-guide/</guid>
      <category>computers</category><category>ssd</category>
      <description>&lt;p&gt;Backup everything. First rename, then remove when you confirmed it worked. Better safe than sorry.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;REM Set the new root location&#xA;REM Ex. NEW_ROOT=D:&#xA;REM     NEW_ROOT=D:\Data&#xA;REM     NEW_ROOT=D:\MyStuff\MyComputer&#xA;set NEW_ROOT=D:&#xA;&#xA;REM (Make sure that C:\Users doesn&#39;t exist anymore)&#xA;move C:\Users C:\Users.Backup&#xA;mklink /J C:\Users %NEW_ROOT%\Users&#xA;&#xA;REM DO NOT DO THE FOLLOWING&#xA;REM (Rename C:\ProgramData before creating the link)&#xA;move C:\ProgramData C:\ProgramData.Backup&#xA;mklink /J C:\ProgramData %NEW_ROOT%\ProgramData&#xA;&#xA;REM Update the TEMP folder at system level&#xA;setx /m TEMP %NEW_ROOT%\Windows\Temp&#xA;setx /m TMP %NEW_ROOT%\Windows\Temp&#xA;&#xA;move C:\Windows\Temp C:\Windows\Temp.Backup&#xA;mklink /J C:\Windows\Temp %NEW_ROOT%\Windows\Temp&#xA;REM END DO NOT DO&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>PHPUnit - No coverage report</title>
      <link>https://tomrochette.com/phpunit-no-coverage-report/</link>
      <pubDate>Sun, 05 Aug 2012 02:20:34 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/phpunit-no-coverage-report/</guid>
      <category>programming</category><category>code-coverage</category><category>php</category><category>phpunit</category>
      <description>&lt;p&gt;I was trying to get PHPUnit to give me some coverage report for a project I had not worked on for a long time. I had received a github pull request from someone and I wanted to see what the coverage was on the project to see if the submitter had done a good job of covering his code, but I couldn&amp;rsquo;t get PHPUnit to generate a report that contained any data. All I would get was a couple of empty directory folders pages, which was useless.&lt;/p&gt;&#xA;&lt;p&gt;I had code coverage work on another project in the same environment I was in, so I was pretty sure that my problem had to do either with how I had setup PHPUnit for that particular project, or that something else was interfering with the report generation.&lt;/p&gt;&#xA;&lt;p&gt;I tried a couple of things, starting by calling phpunit from the command line using different arguments:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell line-numbers&#34;&gt;&#xA;--coverage-html report test\symbol_test.php&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Would generate some report with data in it, good!&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell line-numbers&#34;&gt;&#xA;-c test\phpunit.xml (logging set in phpunit.xml)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Would generate an empty report, not good&amp;hellip;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-shell line-numbers&#34;&gt;&#xA;--coverage-html report -c test\phpunit.xml&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Would generate an empty report, not good&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;So at that point I saw that it was working correctly and that something was definitely wrong with my phpunit.xml configuration file. I went back to the &lt;a href=&#34;https://phpunit.de/manual/current/en/code-coverage-analysis.html#code-coverage-analysis.whitelisting-files&#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=phpunit.de&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;phpunit.de&lt;/a&gt; manual, specifically on the configuration page, and tried to figure out my problem.&lt;/p&gt;&#xA;&lt;p&gt;For code coverage to be included in your report, you have to add a filter, be it a blacklist or a whitelist, but you have to have a filter.&lt;/p&gt;&#xA;&lt;p&gt;So I quickly added a filter such as&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-markup line-numbers&#34;&gt;&#xA;&amp;lt;filter&amp;gt;&#xA;&#x9;&amp;lt;whitelist&amp;gt;&#xA;&#x9;&#x9;&amp;lt;directory&amp;gt;../&amp;lt;/directory&amp;gt;&#xA;&#x9;&amp;lt;/whitelist&amp;gt;&#xA;&amp;lt;/filter&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;which would whitelist everything that is in the project (my project root is one level above test). Ran **phpunit ** in the test folder and I finally got a report with data!&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>PHPUnit - PHP Fatal error: require_once(): Failed opening required &#39;PHPUnit/Util/Filter.php&#39;</title>
      <link>https://tomrochette.com/phpunit-php-fatal-error-require_once-failed-opening-required-phpunitutilfilter-php/</link>
      <pubDate>Sat, 26 Nov 2011 00:14:53 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/phpunit-php-fatal-error-require_once-failed-opening-required-phpunitutilfilter-php/</guid>
      <category>programming</category><category>php</category><category>phpunit</category>
      <description>&lt;p&gt;A friend of mine was trying to install PHPUnit on his mac (OS X Lion), but unfortunately, he got stuck during the process.&lt;/p&gt;&#xA;&lt;p&gt;At some point, he was faced with this error being displayed. We both looked at the problem and first made sure that said file existed. It was the case, weird&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;A bit of googling will reveal that this is frequently fixed by appending the path to the pear folder to your php include_path (defined in your php.ini). But in his case, that was already done and it still wasn&amp;rsquo;t working.&lt;/p&gt;&#xA;&lt;p&gt;Next up was to check permissions problem. Not having read permissions on the file would of been an easy one to fix, but again, this was not the cause of the problem.&lt;/p&gt;&#xA;&lt;p&gt;At this point you might be asking yourself, how come the file exists, you have permission to read it, but yet, you can&amp;rsquo;t&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Well, the actual problem was that his OS was set up such that the maxfiles was set to 256 and PHPUnit had already reached that amount of open files.&lt;/p&gt;&#xA;&lt;p&gt;To check if you have the same problem, try running phpunit using &lt;code&gt;sudo dtruss -f -t open phpunit&lt;/code&gt; (Linux users will want to use &lt;code&gt;strace -e open phpunit&lt;/code&gt;). In your output, you should see the files being opened. At some point, you&amp;rsquo;ll find &lt;code&gt;Err#24&lt;/code&gt;, which indicates &amp;ldquo;To many file descriptors opened&amp;rdquo;. If you have this problem, then the following should help you fix it.&lt;/p&gt;&#xA;&lt;p&gt;The solution to this problem is quite easy. What you&amp;rsquo;ll want to do is increase the maximum number of descriptors that can be used by a process. You can do it temporarily with &lt;code&gt;ulimit -S -n 1024&lt;/code&gt; (to use 1024 instead of 256). Another way is to edit it and keep those settings (until you change them again) is to use &lt;code&gt;launchctl limit maxfiles 1024 unlimited&lt;/code&gt;.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>PHPUnit not outputting coverage-html</title>
      <link>https://tomrochette.com/phpunit-not-outputting-coverage-html/</link>
      <pubDate>Tue, 25 Oct 2011 01:31:45 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/phpunit-not-outputting-coverage-html/</guid>
      <category>programming</category><category>code-coverage</category><category>php</category><category>phpunit</category>
      <description>&lt;p&gt;I&amp;rsquo;ve been using PHPUnit recently to test a Kohana application I&amp;rsquo;m developing as my last semester project for my bachelor&amp;rsquo;s degree.&lt;/p&gt;&#xA;&lt;p&gt;At some point during the development, code coverage generation decided to stop working on my desktop (my remote CI still had no problem).&lt;/p&gt;&#xA;&lt;p&gt;I started diagnosing the problem, being on Windows, I thought it could be due to the &amp;ldquo;poor job&amp;rdquo; I had done on installing php, pear and phpunit. I didn&amp;rsquo;t want to go through the trouble or reinstalling everything though and just did the minimum: uninstall and reinstall phpunit. No success at that point.&lt;/p&gt;&#xA;&lt;p&gt;I decided to go back a week or two in my SVN revisions, have it generate code coverage and get to the point were code coverage generation would fail. Took around 2 SVN &amp;ldquo;update to&amp;rdquo; to get to that point. After that, I tried updating the tests, but the new tests were using new features. So I updated the code first, then started updating the test files one by one. After a couple of files, I hit an interesting message:&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;ErrorException [ 1 ]: Allowed memory size of 134217728 bytes exhausted (tried to allocate 543278 bytes) ~ C:\php\pear\Text\Template.php [ 134 ]&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;I never had that message show up before, which is kind of strange. I would have expected PHP to tell me that same message everytime it tried to generate the documentation but couldn&amp;rsquo;t&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;So, quick fix was for me to edit my php.ini so that the memory_limit = 256M instead of 128M.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Serializing &#34;anything&#34; in C# using extensions</title>
      <link>https://tomrochette.com/serializing-anything-in-c-using-extensions/</link>
      <pubDate>Sun, 05 Jun 2011 04:22:07 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/serializing-anything-in-c-using-extensions/</guid>
      <category>programming</category><category>c</category><category>extensions</category><category>serialization</category>
      <description>&lt;p&gt;I was recently interested in getting C# objects to serialize into XML so that I could save and load a configuration out of a file. Sadly, C# support for XML and serialization is far from the best stuff I&amp;rsquo;ve seen in programming. But anyway, here&amp;rsquo;s what this post is about: using DataContract with a bit of extension magic to get anything to be serializable into XML!&lt;/p&gt;&#xA;&lt;p&gt;One small problem when you use the Serializable attribute of C# is that you cannot serialize dictionary directly and we all know dictionaries are a VERY useful structure to have serialized. One easy way to have serializable dictionaries is to use the DataContract attribute instead. It implies a bit more code compared to the version where you use the Serializable attribute, but not that much more (mostly the WriteObject and ReadObject lines).&lt;/p&gt;&#xA;&lt;p&gt;I haven&amp;rsquo;t coded any of this, so thanks to user &lt;a href=&#34;http://stackoverflow.com/users/285678/loudenvier&#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=stackoverflow.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Loudenvier&lt;/a&gt; from &lt;a href=&#34;http://www.stackoverflow.com&#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=www.stackoverflow.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Stackoverflow.com&lt;/a&gt;! This solution allows you to turn ANY object into an XML string representation. It also allows you to turn that string back into an object representation. Very useful.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-csharp line-numbers&#34;&gt;&#xA;public static class SerializationExtensions&#xA;{&#xA;    public static string Serialize&amp;lt;T&amp;gt;(this T obj)&#xA;    {&#xA;        var serializer = new DataContractSerializer(obj.GetType());&#xA;        using (var writer = new StringWriter())&#xA;        using (var stm = new XmlTextWriter(writer))&#xA;        {&#xA;            serializer.WriteObject(stm, obj);&#xA;            return writer.ToString();&#xA;        }&#xA;    }&#xA;    public static T Deserialize&amp;lt;T&amp;gt;(this string serialized)&#xA;    {&#xA;        var serializer = new DataContractSerializer(typeof(T));&#xA;        using (var reader = new StringReader(serialized))&#xA;        using (var stm = new XmlTextReader(reader))&#xA;        {&#xA;            return (T)serializer.ReadObject(stm);&#xA;        }&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;How to use example&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-csharp line-numbers&#34;&gt;&#xA;// dictionary to serialize to string&#xA;Dictionary&amp;lt;string, object&amp;gt; myDict = new Dictionary&amp;lt;string, object&amp;gt;();&#xA;// add items to the dictionary...&#xA;myDict.Add(...);&#xA;// serialization is straight-forward&#xA;string serialized = myDict.Serialize();&#xA;...&#xA;// deserialization is just as simple&#xA;Dictionary&amp;lt;string, object&amp;gt; myDictCopy = serialized.Deserialize&amp;lt;Dictionary&amp;lt;string,object&amp;gt;&amp;gt;();&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href=&#34;http://www.stackoverflow.com/questions/1124597/why-isnt-there-an-xml-serializable-dictionary-in-net/5941122#5941122&#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=www.stackoverflow.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.stackoverflow.com&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Enginuity series on GameDev.net</title>
      <link>https://tomrochette.com/enginuity-series-on-gamedev-net/</link>
      <pubDate>Mon, 25 Apr 2011 04:01:00 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/enginuity-series-on-gamedev-net/</guid>
      <category>programming</category><category>enginuity</category><category>game-development</category>
      <description>&lt;p&gt;I&amp;rsquo;ve just stumbled upon a series of articles from Richard Fine that were written in 2003 which describes the basics of a game engine he calls Enginuity. It lays the foundations to basic memory management, logging, kernel and tasks management and much more. An extremely interesting read. Sadly, you can read in the articles that this was projected to be a series of more than 8 articles, but it seems it stopped at the fifth article. If anyone knows where to find the rest (if it exists), I&amp;rsquo;d be grateful!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;On GameDev.net:&lt;/strong&gt; &lt;a href=&#34;https://www.gamedev.net/articles/programming/general-and-gameplay-programming/enginuity-part-i-r1947&#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=www.gamedev.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Part 1&lt;/a&gt; &lt;a href=&#34;https://www.gamedev.net/articles/programming/general-and-gameplay-programming/enginuity-part-ii-r1954&#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=www.gamedev.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Part 2&lt;/a&gt; &lt;a href=&#34;https://www.gamedev.net/articles/programming/general-and-gameplay-programming/enginuity-part-iii-r1959&#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=www.gamedev.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Part 3&lt;/a&gt; &lt;a href=&#34;https://www.gamedev.net/articles/programming/general-and-gameplay-programming/enginuity-part-iv-r1973&#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=www.gamedev.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Part 4&lt;/a&gt; &lt;a href=&#34;https://www.gamedev.net/articles/programming/general-and-gameplay-programming/enginuity-part-v-r2011&#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=www.gamedev.net&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Part 5&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Software developer</title>
      <link>https://tomrochette.com/software-developer-joke/</link>
      <pubDate>Sun, 26 Apr 2009 22:53:36 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/software-developer-joke/</guid>
      <category>joke</category>
      <description>&lt;blockquote&gt;&lt;p&gt;A man is flying in a hot air balloon and realizes he is lost. He reduces height and spots a man down below. He lowers the balloon further and shouts: &amp;ldquo;Excuse me, can you tell me where I am?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The man below says: &amp;ldquo;Yes you&amp;rsquo;re in a hot air balloon, hovering 30 feet above this field.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;You must be a software developer,&amp;rdquo; says the balloonist.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;I am,&amp;rdquo; replies the man. &amp;ldquo;How did you know?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Well,&amp;rdquo; says the balloonist, &amp;ldquo;everything you have told me is technically correct, but it&amp;rsquo;s of no use to anyone.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The man below says, &amp;ldquo;You must work in business as a manager.&amp;rdquo; &amp;ldquo;I do,&amp;rdquo; replies the balloonist, &amp;ldquo;but how did you know?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Well,&amp;rdquo; says the man, &amp;ldquo;you don&amp;rsquo;t know where you are or where you are going, but you expect me to be able to help. You&amp;rsquo;re in the same position you were before we met but now it&amp;rsquo;s my fault.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href=&#34;http://www.codinghorror.com/blog/archives/000230.html&#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=www.codinghorror.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Coding Horror&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Software developer</title>
      <link>https://tomrochette.com/software-developer/</link>
      <pubDate>Sun, 26 Apr 2009 22:53:36 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/software-developer/</guid>
      <category>computers</category><category>joke</category>
      <description>&lt;blockquote&gt;&lt;p&gt;A man is flying in a hot air balloon and realizes he is lost. He reduces height and spots a man down below. He lowers the balloon further and shouts: &amp;ldquo;Excuse me, can you tell me where I am?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The man below says: &amp;ldquo;Yes you&amp;rsquo;re in a hot air balloon, hovering 30 feet above this field.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;You must be a software developer,&amp;rdquo; says the balloonist.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;I am,&amp;rdquo; replies the man. &amp;ldquo;How did you know?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Well,&amp;rdquo; says the balloonist, &amp;ldquo;everything you have told me is technically correct, but it&amp;rsquo;s of no use to anyone.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The man below says, &amp;ldquo;You must work in business as a manager.&amp;rdquo; &amp;ldquo;I do,&amp;rdquo; replies the balloonist, &amp;ldquo;but how did you know?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Well,&amp;rdquo; says the man, &amp;ldquo;you don&amp;rsquo;t know where you are or where you are going, but you expect me to be able to help. You&amp;rsquo;re in the same position you were before we met but now it&amp;rsquo;s my fault.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href=&#34;http://www.codinghorror.com/blog/archives/000230.html&#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=www.codinghorror.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Coding Horror&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Shared network computers not showing up in Leopard</title>
      <link>https://tomrochette.com/shared-network-computers-not-showing-up-in-leopard/</link>
      <pubDate>Sat, 12 Jan 2008 01:02:48 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/shared-network-computers-not-showing-up-in-leopard/</guid>
      <category>computers</category><category>network</category><category>mac-os-x</category><category>leopard</category>
      <description>&lt;p&gt;Since I&amp;rsquo;ve upgraded to Leopard, I couldn&amp;rsquo;t connect to my Windows network anymore. Browsing through various websites looking for answers, I tried pretty much all of them with no success. Not until I found &lt;a href=&#34;http://www.macwindows.com/leopard.html#010908a&#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=www.macwindows.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;this page&lt;/a&gt;. Is explanation is pretty simple and indeed makes my shared network show up once again!&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the explanation and instructions on how to fix it:&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;You have plenty of suggestions for fixing the Leopard Windows sharing issue, that I see are all a bit hit or miss. I think the reason for this is because a lot of the things people are trying are fixing the real root issue by accident.&lt;/p&gt;&#xA;&lt;p&gt;The Leopard advanced network settings has a WINS tab, and in this there is a NETBIOS name field. This is auto-generated by Leopard - it looks like it uses the MAC address to generate it. However, if what is put in there is not compliant with the NETBIOS settings of the Windows network you are connected to, then browsing will not work, because the WINS server will not acknowledge the WINS requests coming from Leopard.&lt;/p&gt;&#xA;&lt;p&gt;The actual NETBIOS name requirements supported vary depending on the flavour of OS running on the WINS servers on the network. I would suspect the best route to success is to use the most basic NETBIOS name requirements, back from the old Windows NT 4.0 days - stick in no more than an 8-character alphanumeric into the NETBIOS field, and all Windows browsing will be restored.&lt;/p&gt;&#xA;&lt;p&gt;I had two Leopard machines, one which would browse and one which would not. The browsing one had an 8-character WINS setting, and the non- browsing one had a MAC address in the WINS field. Removing the MAC address and putting in a simple word in the WINS field IMMEDIATELY reinstated browsing.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
      
    </item>
    
    <item>
      <title>Boot Camp and Windows install</title>
      <link>https://tomrochette.com/boot-camp-and-windows-install/</link>
      <pubDate>Mon, 12 Nov 2007 01:30:14 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/boot-camp-and-windows-install/</guid>
      <category>windows</category><category>mac-os-x</category><category>bootcamp</category>
      <description>&lt;p&gt;If you&amp;rsquo;re having a hard time getting Boot Camp to correctly install Windows and you&amp;rsquo;re getting either a &amp;ldquo;disk error&amp;rdquo; or &amp;ldquo;hal.dll missing&amp;rdquo; error, here&amp;rsquo;s how to actually fix it.&lt;/p&gt;&#xA;&lt;p&gt;First, you&amp;rsquo;ll have to restore your disk to a full Mac OS X partition.&#xA;Then, you&amp;rsquo;ll reformat it to be a Mac OS X partition and a Windows partition (using Boot Camp).&lt;/p&gt;&#xA;&lt;p&gt;This is now the important step. You must write over the partition. So load up the Terminal and enter&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code class=&#34;language-bash line-numbers&#34;&gt;&#xA;sudo dd if=/dev/zero of=/dev/rdisk0s3 bs=1m count=100&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Where rdisk0s3 is the disk where the Windows Partition is. To know the name of your Windows partition, you can go to the Disk Utility (Applications-Utilies) and look for a partition under your hard drive.&lt;/p&gt;&#xA;&lt;p&gt;When that is done, you can restart your computer with your Windows CD and install it. Everything should be fine now.&lt;/p&gt;&#xA;&lt;p&gt;PS. Use at your own risk. The command involve writting 0&amp;rsquo;s to your partition table, which might screw it up if done unproperly.&lt;/p&gt;&#xA;&lt;p&gt;PPS. I cannot be held responsible for anything happening to you or your computer.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Firefox being slow?</title>
      <link>https://tomrochette.com/firefox-being-slow/</link>
      <pubDate>Tue, 26 Dec 2006 11:47:15 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/firefox-being-slow/</guid>
      <category>software</category><category>firefox</category><category>fasterfox</category>
      <description>&lt;p&gt;If you&amp;rsquo;ve been having some problems with your connection or especially with firefox, check if you have FasterFox. If you indeed do, please uninstall this crap. I was on dnsstuff.com and got blocked by one of their script telling me I had FasterFox (which in that case was true, even though I generally don&amp;rsquo;t install that thing). I was having a hard time loading pages for no reason but I had good internet download speed using FlashGet.&lt;/p&gt;&#xA;&lt;p&gt;In the end, I removed FasterFox, restarted FireFox, everything is back fast and furious :).&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>DVD not detected in Windows XP</title>
      <link>https://tomrochette.com/dvd-not-detected-in-windows-xp/</link>
      <pubDate>Wed, 29 Nov 2006 23:59:05 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/dvd-not-detected-in-windows-xp/</guid>
      <category>computers</category><category>windows</category><category>dvd</category>
      <description>&lt;p&gt;If you&amp;rsquo;re having trouble with your DVD not being detected in Windows XP while being detected in the BIOS, this is THE solution you&amp;rsquo;ve been looking for.&lt;/p&gt;&#xA;&lt;p&gt;This problem is generally caused by the Adaptec ASPI drivers needing to be updated. The best way to fix this problem is to download the latest Adaptec aspi_471a2 drivers. You can download them at &lt;a href=&#34;http://drivers.softpedia.com/get/Other-DRIVERS-TOOLS/Others/Adaptec-ASPI-Driver-v472.shtml&#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=drivers.softpedia.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;Softpedia.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Good luck!&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>RICHTX32.ocx registration fix</title>
      <link>https://tomrochette.com/richtx32ocx-registration-fix/</link>
      <pubDate>Mon, 05 Jun 2006 18:34:49 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/richtx32ocx-registration-fix/</guid>
      <category>computers</category><category>windows</category><category>dll</category>
      <description>&lt;blockquote&gt;&lt;p&gt;&amp;ldquo;richtx32.ocx&amp;rdquo; is not an executable file and no registration helper is registered for this file type.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;I had this thing always appearing while using my FTP software so I had to fix it. I looked all over the internet to find any possible fix but no one gave me the answer I was looking for. After a while I decided I would try to find out the latest version of this file and almost every place I went to, I found the version 6.0.88.4 which was the one not working for me. Then I went to &lt;a href=&#34;http://www.martin2k.co.uk/vb6/vb6download4.php&#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=www.martin2k.co.uk&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;http://www.martin2k.co.uk/&lt;/a&gt; and grabbed his &lt;strong&gt;Microsoft Rich Textbox Control 6.0 (SP4) (richtx32.ocx)&lt;/strong&gt; which was version 6.0.88.77. By executing &lt;code&gt;regsvr32 c:\windows\system32\RICHTX32.OCX&lt;/code&gt; on my winXP computer, the damn thing finally registered itself!&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Redirect to www</title>
      <link>https://tomrochette.com/redirect-to-www/</link>
      <pubDate>Sun, 04 Jun 2006 06:28:16 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/redirect-to-www/</guid>
      <category>sites</category><category>apache</category><category>.htaccess</category><category>rewriterule</category>
      <description>&lt;pre&gt;&lt;code class=&#34;language-apache line-numbers&#34;&gt;&#xA;Options +FollowSymLinks&#xA;RewriteEngine on&#xA;RewriteCond %{HTTP_HOST} ^your-domain-here\.com&#xA;RewriteRule ^(.*)$ http://www.your-domain-here.com/$1 [R=permanent,L]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This code placed in your .htaccess will give you the possibility to send any visitor coming to your-domain-here.com to &lt;a href=&#34;https://www.your-domain-here.com&#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=www.your-domain-here.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.your-domain-here.com&lt;/a&gt;. This has a great advantage especially with search engines because all your pages will be referenced under the same &amp;ldquo;subdomain&amp;rdquo; as if you had both, you&amp;rsquo;d get &lt;a href=&#34;https://www.your-domain-here.com&#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=www.your-domain-here.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;www.your-domain-here.com&lt;/a&gt; links and your-domain-here.com links which would count as different pages.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>K2 new slider option: killing your chances of getting spidered?</title>
      <link>https://tomrochette.com/k2-new-slider-option-killing-your-chances-of-getting-spidered/</link>
      <pubDate>Thu, 25 May 2006 06:16:50 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/k2-new-slider-option-killing-your-chances-of-getting-spidered/</guid>
      <category>sites</category><category>k2</category><category>themes</category><category>wordpress</category><category>web-crawler</category>
      <description>&lt;p&gt;Well, it took me some time until I realise that this cool slider bar option as something negative about it: it hides contains from search engines spiders.&lt;/p&gt;&#xA;&lt;p&gt;Using AJAX coding, the only one who can trigger the request to the server are the users, a bot wouldn&amp;rsquo;t be able to read any content except the one that&amp;rsquo;s appearing on the front page.&lt;/p&gt;&#xA;&lt;p&gt;Is this going to kill my chances of getting spidered?&#xA;Actually yes. As the top navigation (the ­­Older and Newer links) are also programmed to trigger javascript, the spider cannot go anywhere. When it reads a # link, it just stays on the same page, no new content for the bot to read.&lt;/p&gt;&#xA;&lt;p&gt;The thing though is that the spider can still view your list of latest post which are static. When they go to theses pages, nothing is in AJAX format, the links are all going to another post so it&amp;rsquo;s fine. The only impact the slider has is it removes a bit of power from your front page.&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Bump online people threads to the top</title>
      <link>https://tomrochette.com/bump-online-people-threads-to-the-top/</link>
      <pubDate>Tue, 09 May 2006 03:54:43 -0500</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/bump-online-people-threads-to-the-top/</guid>
      <category>sites</category><category>forum</category>
      <description>&lt;p&gt;Have you ever been on a forum waiting for people to reply to your threads? Do you find it frustrating to have to bump your own threads so you can get the response you&amp;rsquo;re looking for? If yes, then you might want to look at this concept idea:&lt;/p&gt;&#xA;&lt;p&gt;When you are online, varying from 5-10 of your &amp;ldquo;latest&amp;rdquo; post would be bumped to the top automatically as your are online. This would increase the chances of getting a reply to your messages. As well all know though, forums are being browsed by thousand of people so bumping all those threads all at once would be useless &amp;amp; cpu consuming that&amp;rsquo;s why instead of bumping all of our threads, we would be able to bump 5 chosen thread each time we are online.&lt;/p&gt;&#xA;&lt;p&gt;Doing so will help your own forum to grow as members who are online longer have better chances of getting replies and then to reply so more posts. The problem with current forums is that threads which aren&amp;rsquo;t always done end up not being answered. Why not make sure all threads are getting the reply they should get? When a user is satisfied with the answer, he can remove the thread from his list =&amp;gt; yes, this means we could ask for others people thread to get replied to.&lt;/p&gt;&#xA;&lt;p&gt;Yet, this is only an idea. I&amp;rsquo;m sure that forums such as vBulletin and Invision Power Board will find this thread and will add it to their next release as people are avid of answers. By giving them a better opportunity to get their answer, community grows, people are happy, everyone&amp;rsquo;s happy :).&lt;/p&gt;&#xA;</description>
      
    </item>
    
    <item>
      <title>Template</title>
      <link>https://tomrochette.com/template/</link>
      <pubDate>Sun, 01 Jan 1234 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/template/</guid>
      
      <description></description>
      
    </item>
    
  </channel>
</rss>
