<rss version="2.0">
  <channel>
    <title>Adr on LLBBL Blog</title>
    <link>https://llbbl.blog/categories/adr/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Sun, 02 Aug 2026 10:00:00 -0500</lastBuildDate>
    
    <item>
      <title>The Decision Log: A Lightweight Artifact for Agentic Coding</title>
      <link>https://llbbl.blog/2026/08/02/the-decision-log-a-lightweight.html</link>
      <pubDate>Sun, 02 Aug 2026 10:00:00 -0500</pubDate>
      
      <guid>http://llbbl.micro.blog/2026/08/02/the-decision-log-a-lightweight.html</guid>
      <description>&lt;p&gt;Coding agents are remarkably good at reopening decisions you already made.&lt;/p&gt;
&lt;p&gt;Imagine a content pipeline where posts live as local Markdown files and a database holds the scheduling metadata. You open a fresh session. Which one does the agent think is authoritative?&lt;/p&gt;
&lt;p&gt;It has to guess. And the database looks like the better answer, because databases usually are. So it proposes the obvious cleanup: make the database the source of truth and treat the files as an export format.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s wrong, for a reason the code never states. You can rebuild the database from the files. You cannot rebuild the files from the database. Drop the database and you re-index from markdown, losing some operational history on the way. Lose the markdown and the posts are gone.&lt;/p&gt;
&lt;p&gt;Some questions are still better answered by the database, scheduling among them. But the authoritative copy is whichever one you could regenerate the other from, and that asymmetry is the entire argument. It appears nowhere in the schema, nowhere in the file layout, and nowhere in the diff.&lt;/p&gt;
&lt;p&gt;So you explain it. The agent takes the point immediately, drops the idea, and gets on with the actual work. Good outcome.&lt;/p&gt;
&lt;p&gt;Then the session ends, and the next one arrives with the same instincts and the same blank slate. Nothing&amp;rsquo;s wrong with its reasoning. It&amp;rsquo;s missing the one piece of context the repository doesn&amp;rsquo;t contain: &lt;strong&gt;that road has already been walked.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what a decision log is for.&lt;/p&gt;
&lt;h2 id=&#34;issues-and-skills-leave-a-gap&#34;&gt;Issues and Skills Leave a Gap&lt;/h2&gt;
&lt;p&gt;Agentic projects tend to accumulate two useful artifacts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Issues&lt;/strong&gt; describe work. Add a field, fix the retry logic, move the cache, update the API client. They tell an agent what needs to change and, if the issue is any good, what done looks like.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skills and project instructions&lt;/strong&gt; describe process. Use this package manager. Run these tests. Never call this destructive command. They tell an agent how work should happen, repeatedly.&lt;/p&gt;
&lt;p&gt;Both matter. Neither is a natural home for, &amp;ldquo;We considered Redis, rejected it because this service has to run without another dependency, and we&amp;rsquo;ll reconsider if the process moves to multiple instances.&amp;rdquo;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;th&gt;The question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Issue&lt;/td&gt;
&lt;td&gt;What needs to change?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill or instruction&lt;/td&gt;
&lt;td&gt;How should work be done?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision log&lt;/td&gt;
&lt;td&gt;Why this path instead of another one?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The code records the result. Git records the diff. A closed issue might contain the discussion, if somebody thinks to go looking for it. The decision log keeps the conclusion and the rejected alternatives somewhere an agent can find them &lt;em&gt;before&lt;/em&gt; it starts planning.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-rejected-option-is-the-important-part&#34;&gt;The Rejected Option Is the Important Part&lt;/h2&gt;
&lt;p&gt;I wrote recently about &lt;a href=&#34;https://llbbl.blog/2026/07/21/code-is-cheap-now-decisions.html&#34;&gt;decision debt&lt;/a&gt;, the gap created when code gets produced faster than anyone records what it means or why it exists. A decision log is one small way to pay that debt as you go.&lt;/p&gt;
&lt;p&gt;The useful part isn&amp;rsquo;t &amp;ldquo;We chose SQLite.&amp;rdquo; The repository already contains a SQLite database. The useful part is why SQLite won, which alternatives lost, and what would have to change before the decision should be reopened.&lt;/p&gt;
&lt;p&gt;Without that negative history, an agent sees an absence and treats it as an oversight. No Redis? Add Redis. No abstraction around this HTTP client? Generate one. No Kubernetes deployment? Surely the project just hasn&amp;rsquo;t matured enough yet.&lt;/p&gt;
&lt;p&gt;Sometimes the missing thing is missing on purpose.&lt;/p&gt;
&lt;p&gt;Humans do this too, of course. We reopen old arguments when the people who remember them leave, or when the conclusion is buried in a meeting recording. Agents just compress the cycle. Every fresh session is a new developer joining the project with excellent technical instincts and absolutely no institutional memory.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;keep-the-entry-small&#34;&gt;Keep the Entry Small&lt;/h2&gt;
&lt;p&gt;Architecture Decision Records have been around since Michael Nygard described the pattern in 2011. They preserve the status, context, decision, and consequences of an important architectural choice. Lightweight templates like MADR also capture the options considered, the decision drivers, and why one option won.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the right idea. I just don&amp;rsquo;t need a formal architecture record for every consequential choice in a personal project.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d start with some sort of log file, holding entries like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 2026-07-26: Keep Markdown as the publishing source of truth
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;font-weight:bold&#34;&gt;**Context:**&lt;/span&gt; Posts exist as local files and as database records.
&lt;span style=&#34;font-weight:bold&#34;&gt;**Decision:**&lt;/span&gt; Frontmatter controls publish state. The database owns
scheduling metadata and is not authoritative for publishing.
&lt;span style=&#34;font-weight:bold&#34;&gt;**Rejected:**&lt;/span&gt; Making the database authoritative, or newest-write-wins.
&lt;span style=&#34;font-weight:bold&#34;&gt;**Why:**&lt;/span&gt; The database can be rebuilt from the files. The files cannot be
rebuilt from the database.
&lt;span style=&#34;font-weight:bold&#34;&gt;**Revisit when:**&lt;/span&gt; Editing moves to a multi-user hosted application.
&lt;span style=&#34;font-weight:bold&#34;&gt;**Links:**&lt;/span&gt; the repository module, the publishing documentation.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s the whole artifact.&lt;/p&gt;
&lt;p&gt;An agent that reads that before it starts planning knows the database-as-source-of-truth idea isn&amp;rsquo;t a fresh insight. It also knows exactly what would have to change before it becomes one again.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be honest that I haven&amp;rsquo;t started doing this yet, but it sounds like a good idea right?&lt;/p&gt;
&lt;p&gt;The entry doesn&amp;rsquo;t need a transcript of the debate. It needs enough context for a future person or agent to understand that the alternative was considered, why it lost, and which changed condition would make it worth discussing again.&lt;/p&gt;
&lt;h2 id=&#34;what-belongs-in-the-log&#34;&gt;What Belongs in the Log&lt;/h2&gt;
&lt;p&gt;If every choice becomes an entry, the log turns into another file nobody reads. I&amp;rsquo;d record a decision when at least one of these is true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two or more reasonable approaches existed&lt;/li&gt;
&lt;li&gt;A future agent is likely to propose the rejected option again&lt;/li&gt;
&lt;li&gt;The choice establishes a source of truth, security boundary, schema, dependency, or workflow&lt;/li&gt;
&lt;li&gt;Reversing it later would be expensive or dangerous&lt;/li&gt;
&lt;li&gt;The reason isn&amp;rsquo;t obvious from the code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;rsquo;t log naming arguments, routine implementation details, or every library function you picked. &amp;ldquo;Used a dictionary here&amp;rdquo; isn&amp;rsquo;t institutional knowledge. &amp;ldquo;Kept provider integrations on raw HTTP because the SDK doesn&amp;rsquo;t support the endpoint we need&amp;rdquo; might be.&lt;/p&gt;
&lt;p&gt;Major decisions can still become full ADRs in &lt;code&gt;docs/decisions/&lt;/code&gt; or whatever. The lightweight log is for the big middle ground between an architectural record and a comment somebody vaguely remembers leaving on a pull request.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;make-agents-read-it-at-the-right-time&#34;&gt;Make Agents Read It at the Right Time&lt;/h2&gt;
&lt;p&gt;Creating the file isn&amp;rsquo;t enough. The agent needs a retrieval rule. One sentence in the project instructions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;Before proposing changes to architecture, dependencies, data ownership,
security boundaries, or core workflows, search &lt;span style=&#34;color:#e6db74&#34;&gt;`docs/decisions.md`&lt;/span&gt; for
related decisions and revisit conditions.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then the other half:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;After a consequential decision is approved, propose a short decision-log
entry. Do not record a new project policy without human confirmation.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The instruction defines the recurring behavior. The log supplies the project-specific facts. That keeps settled choices out of a giant instruction file while still putting them in the agent&amp;rsquo;s path when they matter.&lt;/p&gt;
&lt;p&gt;When a decision changes, don&amp;rsquo;t quietly rewrite history. Add a new entry that supersedes the old one and say which revisit condition actually showed up. Version control preserves the edit, but the document should make the change legible without requiring repository archaeology.&lt;/p&gt;
&lt;h2 id=&#34;not-another-memory-system&#34;&gt;Not Another Memory System&lt;/h2&gt;
&lt;p&gt;A chat transcript contains every false start, tool result, and half-formed idea. It&amp;rsquo;s too noisy to act as a project constitution. Agent memory can help retrieve past context, but it might be private to one tool, unavailable to a collaborator, or hard to review in a pull request.&lt;/p&gt;
&lt;p&gt;A decision log needs to be deliberately boring. Plain text. Searchable. Reviewable. Stored next to the code, or accessible by it. Any human or agent can read the same entry and argue with it in the open.&lt;/p&gt;
&lt;p&gt;None of this guarantees an agent will make the right call. It removes one wasteful failure mode: spending another session rediscovering a settled tradeoff and confidently proposing the option the project already rejected.&lt;/p&gt;
&lt;p&gt;Issues tell the agent where to go. Skills tell it how to move. The decision log marks the roads we already closed, why we closed them, and when they might be worth opening again.&lt;/p&gt;
&lt;p&gt;That feels like context worth keeping.&lt;/p&gt;
&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions&#34;&gt;Documenting Architecture Decisions&lt;/a&gt; — Michael Nygard&amp;rsquo;s original 2011 ADR proposal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://adr.github.io/madr/&#34;&gt;MADR&lt;/a&gt; — a lightweight decision-record format covering options, rationale, consequences, and revisit conditions.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gds-way.digital.cabinet-office.gov.uk/standards/architecture-decisions.html&#34;&gt;The GDS Way: Documenting architecture decisions&lt;/a&gt; — keeping decision rationale in the repository while using issues to track implementation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://code.claude.com/docs/en/how-claude-code-works&#34;&gt;How Claude Code works&lt;/a&gt; — fresh session context, compaction, project instructions, and persistent memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;d appreciate a follow. You can subscribe with your email below. The emails go out once a week, or you can find me on Mastodon at &lt;a href=&#34;https://micro.blog/llbbl?remote_follow=1&#34;&gt;@logan@llbbl.blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>