<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Greg Smethells</title>
    <description>The latest articles on Forem by Greg Smethells (@gregsmethells).</description>
    <link>https://forem.com/gregsmethells</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3804803%2F65c0c107-8479-4d30-9a8b-9e0174fc58d2.png</url>
      <title>Forem: Greg Smethells</title>
      <link>https://forem.com/gregsmethells</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gregsmethells"/>
    <language>en</language>
    <item>
      <title>Your Decision Log Is an Archaeological Site</title>
      <dc:creator>Greg Smethells</dc:creator>
      <pubDate>Wed, 25 Mar 2026 02:25:47 +0000</pubDate>
      <link>https://forem.com/gregsmethells/your-decision-log-is-an-archaeological-site-41bk</link>
      <guid>https://forem.com/gregsmethells/your-decision-log-is-an-archaeological-site-41bk</guid>
      <description>&lt;p&gt;I was building a small project with an AI coding agent when I realized my architecture documentation was failing both of us. The agent would start each session by reading through a growing pile of decision records, trying to reconstruct what was still true. I was doing the same thing every time I came back after a week away.&lt;/p&gt;

&lt;p&gt;The documentation existed. Nobody was getting value from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  ADRs Solve the Wrong Problem
&lt;/h2&gt;

&lt;p&gt;Architecture Decision Records are append-only by convention. When a decision changes, you don't update the old record — you write a new one that supersedes it. This sounds principled. In practice, it means your &lt;code&gt;docs/decisions/&lt;/code&gt; directory grows forever and the only way to understand the current state of the architecture is to read 40 files and mentally diff them against each other.&lt;/p&gt;

&lt;p&gt;The decisions that still matter? Maybe five of them. The other 35 are historical noise — half-abandoned ideas, constraints that evaporated when you switched libraries, debates that got resolved and then relitigated and then resolved again. Nobody reads them. I stopped reading them.&lt;/p&gt;

&lt;p&gt;The directory becomes an archaeological site when what you actually needed was a sign on the door.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Actually Need Depends On What You're Doing
&lt;/h2&gt;

&lt;p&gt;When do you actually reach for decision documentation?&lt;/p&gt;

&lt;p&gt;When you're &lt;em&gt;orienting&lt;/em&gt; to a project — coming back after two weeks, or handing context to someone else — you need the 5–10 decisions that explain why the code is shaped the way it is &lt;em&gt;right now&lt;/em&gt;. Not the history. The current state.&lt;/p&gt;

&lt;p&gt;When you're &lt;em&gt;editing a specific file&lt;/em&gt; — you want the relevant context right there, not in a document you have to go find. If there's a non-obvious reason a function is structured a certain way, that reason belongs in a comment next to the function, not in a separate record you have to cross-reference.&lt;/p&gt;

&lt;p&gt;When &lt;em&gt;a decision changes&lt;/em&gt; — you want to update the record. Not append to it forever.&lt;/p&gt;

&lt;p&gt;ADRs optimize for auditability at the expense of usability. That's the wrong tradeoff for a small team or a solo project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Layers That Actually Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;DESIGN.md&lt;/code&gt; in the repo root.&lt;/strong&gt; Three sections only: Architecture, Decisions, Constraints. Hard cap at 100 lines. When a decision changes, edit it in place. When the file fills up, curate — remove what's no longer load-bearing.&lt;/p&gt;

&lt;p&gt;Here's what a few entries look like in practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Decisions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Redis for score caching, not DB reads**&lt;/span&gt;: Scores change every 5 min via worker;
  cache hit target is &amp;lt;50ms. DB fallback on miss.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Async SQLAlchemy throughout**&lt;/span&gt;: All DB access is async to avoid blocking the
  event loop under concurrent probe runs. Do not add sync sessions.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**No JWT / no OAuth**&lt;/span&gt;: API keys only. Email-verified at creation. Keeps auth
  surface small and agent-friendly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each entry is one or two lines: the decision, and the reason it's still load-bearing. If you can't summarize it that briefly, it probably belongs in a comment in the code instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inline comments.&lt;/strong&gt; Local decision context belongs in the code, next to the thing it explains. &lt;code&gt;# XXX:&lt;/code&gt; for non-obvious logic or important implementation notes. If a caching layer exists in a weird place, or a function is structured in a way that looks wrong but isn't — that reason lives in a comment, not in a document.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git history.&lt;/strong&gt; The actual audit trail. Commit messages explain why a change was made. &lt;code&gt;git blame&lt;/code&gt; ties a decision to the exact code change that enacted it. The history is embedded in the thing it describes, not floating in a separate file that may or may not stay in sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cap Is the Whole Point
&lt;/h2&gt;

&lt;p&gt;Without the 100-line limit, &lt;code&gt;DESIGN.md&lt;/code&gt; becomes the same problem as an ADR directory, just collapsed into a single file. The cap is the forcing function. Every time the file gets full, you have to decide what's still worth front-and-centering versus what's just history. That act of deciding is where the value is. Accumulation is easy. Curation is the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You're Giving Up
&lt;/h2&gt;

&lt;p&gt;You can't reconstruct the full decision history from &lt;code&gt;DESIGN.md&lt;/code&gt; alone. If you need to know exactly when a call was made and why, it won't be there.&lt;/p&gt;

&lt;p&gt;But that's what git is for — and git is a better place for it. The history is tied to the actual code change, not a separate document written after the fact. &lt;code&gt;git log -p&lt;/code&gt; tells you more about what happened and why than any ADR, as long as you write decent commit messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two-Minute Test
&lt;/h2&gt;

&lt;p&gt;Here's what crystallized this for me: Claude Code reads &lt;code&gt;DESIGN.md&lt;/code&gt; at the start of every session to orient itself before touching any code. An AI agent needs to understand the shape of a project fast, or it makes wrong turns. So does a human coming back after a week away. So does a new hire on day one.&lt;/p&gt;

&lt;p&gt;If someone can read &lt;code&gt;DESIGN.md&lt;/code&gt; and understand why the code is shaped the way it is in two minutes — not the history, not every tradeoff ever considered, just the decisions that still govern the code today — you've won.&lt;/p&gt;

&lt;p&gt;That's the test. A directory full of ADRs rarely passes it.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ADR directories are append-only and grow forever; after a year you're reading 40 files to find the 5 decisions that still matter.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DESIGN.md&lt;/code&gt; with a 100-line hard cap keeps only what's currently true — when it fills up, you're forced to decide what to keep.&lt;/li&gt;
&lt;li&gt;Git history is your audit trail; it's already tied to the code, which is where it belongs.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>documentation</category>
    </item>
    <item>
      <title>REEL: A Proper Name for the Autonomous Agent Loop</title>
      <dc:creator>Greg Smethells</dc:creator>
      <pubDate>Sat, 07 Mar 2026 08:06:58 +0000</pubDate>
      <link>https://forem.com/gregsmethells/reel-a-proper-name-for-the-autonomous-agent-loop-37fj</link>
      <guid>https://forem.com/gregsmethells/reel-a-proper-name-for-the-autonomous-agent-loop-37fj</guid>
      <description>&lt;p&gt;There is a pattern spreading through the AI coding community. You write a spec, an outer loop spawns fresh AI sessions for each task, acceptance checks gate progress, and the codebase accumulates working code — all without a human in the loop. The pattern works. But it is stuck with a name borrowed from a cartoon character.&lt;/p&gt;

&lt;p&gt;The "Ralph Wiggum loop" is fun, but it does not belong in a design document. The pattern deserves a proper name — one that works as a verb, a noun, and a proper acronym. That name is &lt;strong&gt;REEL&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a REEL?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;REEL&lt;/strong&gt; stands for &lt;strong&gt;Review Evaluated Engineering Loop&lt;/strong&gt;. It describes any autonomous coding workflow with these five characteristics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec in&lt;/strong&gt; — a structured specification defines the tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fresh session per task&lt;/strong&gt; — each task gets a clean context window (no accumulated drift)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceptance check&lt;/strong&gt; — every task must pass a defined verification (tests, linters, reviews)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State on disk&lt;/strong&gt; — progress is tracked in files, not in memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate until done&lt;/strong&gt; — failed tasks are retried, passing tasks feed context to the next&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: &lt;strong&gt;the codebase is the memory, not the context window.&lt;/strong&gt; Each fresh session reads the current state of the code, does its work, and writes results back to disk. The context window is disposable. The repo is permanent.&lt;/p&gt;

&lt;p&gt;This makes REELs fundamentally different from long-running agent sessions. There is no context window to exhaust, no degradation over time, no catastrophic forgetting. Each task starts clean and inherits progress through the only artifact that matters — the code itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "REEL"?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The acronym earns every letter.&lt;/strong&gt; Review Evaluated Engineering Loop — "review" because every task is review-gated before it passes; "evaluated" because acceptance checks evaluate each result; "engineering" because the output is engineered software, not just generated code; "loop" because it iterates until the spec is satisfied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works as a verb.&lt;/strong&gt; "Reel in the feature" is natural English for persistent, iterative effort. You cast your line (write a spec), reel it in (iterate through tasks), and land the catch (working code). The fishing metaphor maps perfectly: patience, persistence, incremental progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works as a noun.&lt;/strong&gt; "I ran a REEL on the auth refactor" — clean and unambiguous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It sounds like "real."&lt;/strong&gt; The near-homophone is a feature, not an accident. When the REEL finishes, the spec becomes &lt;em&gt;real&lt;/em&gt;. Working code, passing tests, reviewed and linted — real software, built autonomously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compare to RAG.&lt;/strong&gt; Nobody says "Retrieval-Augmented Generation" in conversation — they say RAG. The acronym &lt;em&gt;is&lt;/em&gt; the term. REEL works the same way: short, memorable, and precise enough that the expansion only matters the first time you hear it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;A REEL follows this flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spec directory (md/json/feature — any mix)
  |
  v
Parse tasks + dependencies + namespaces
  |
  v
Verification pass (run acceptance checks on existing code)
  |
  v
For each eligible task:
  |-&amp;gt; Create git worktree (isolated branch per task)
  |-&amp;gt; Spawn fresh AI session (with progress context)
  |-&amp;gt; Execute task in worktree
  |-&amp;gt; Run acceptance check
  |-&amp;gt; Run lint gate (fresh session)
  |-&amp;gt; Run review gate (fresh session)
  |-&amp;gt; Merge worktree into feature branch
  |-&amp;gt; Record progress
  |-&amp;gt; Update state
  |
  v
Next task (or retry on failure with fresh worktree)
  |
  v
Advance spec to next pipeline stage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Worktree Isolation
&lt;/h3&gt;

&lt;p&gt;Each task gets its own git worktree branched from the feature branch. The main worktree is the orchestration desk — state, progress, and logs live there, untouched by task work. When a task passes, its worktree merges back into the feature branch. When a task fails, the worktree is discarded and a fresh one is created for the retry, branched from the latest feature branch state (which includes all previously merged work).&lt;/p&gt;

&lt;p&gt;This eliminates an entire class of problems: cross-task file contamination, &lt;code&gt;git add -A&lt;/code&gt; staging another task's files, and concurrent edits clobbering each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three Quality Gates
&lt;/h3&gt;

&lt;p&gt;Every task must pass three gates before it is marked as done:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Acceptance check&lt;/strong&gt; — the spec-defined verification command (tests, build, custom script)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lint gate&lt;/strong&gt; — a fresh AI session runs language-specific linters on changed files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review gate&lt;/strong&gt; — a fresh AI session runs a code review, blocking on Minor or higher severity findings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each gate runs in its own session with its own budget. The lint and review gates can be disabled with &lt;code&gt;--no-lint&lt;/code&gt; and &lt;code&gt;--no-review&lt;/code&gt; for speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  State Management
&lt;/h3&gt;

&lt;p&gt;Per-task progress (pass/fail, attempt counts, errors) is tracked in &lt;code&gt;.reel/state.json&lt;/code&gt; — spec files are never modified. You can abort at any time — SIGINT/SIGTERM traps save state — and resume exactly where you left off. When all tasks in a spec pass, the spec file advances to the next pipeline stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Progress Accumulation
&lt;/h3&gt;

&lt;p&gt;After each task passes, a summary (description + files changed) is appended to &lt;code&gt;.reel/progress.txt&lt;/code&gt;. Subsequent tasks receive this context in their prompt, preventing duplication across sessions without polluting the context window.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safety Controls
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Max iterations:&lt;/strong&gt; 20 total iterations across all tasks (configurable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-task budget:&lt;/strong&gt; $1.00 default spend cap per task&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry limit:&lt;/strong&gt; 3 attempts per task before marking as failed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker:&lt;/strong&gt; 3 consecutive failures halt the entire run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock file:&lt;/strong&gt; prevents concurrent runs on the same spec&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful abort:&lt;/strong&gt; SIGINT/SIGTERM traps save state for resume&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pipeline Stages
&lt;/h2&gt;

&lt;p&gt;REEL organizes specs into a pipeline. The filesystem &lt;em&gt;is&lt;/em&gt; the board — a spec file's directory determines its stage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec/
  todo/       — Approved backlog, ready to work
  design/     — In design phase
  inflight/   — Being implemented (REEL core behavior)
  review/     — In review phase
  active/     — Done, actively enforced specification
  archived/   — Historical, out of flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When all tasks in a spec pass, REEL advances it to the next stage via &lt;code&gt;git mv&lt;/code&gt;. The transition is atomic and auditable — it is just a commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec Formats
&lt;/h2&gt;

&lt;p&gt;A REEL is driven by structured specs in three formats — use whichever fits your workflow. Mix formats freely within the same pipeline directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gherkin&lt;/strong&gt; (&lt;code&gt;.feature&lt;/code&gt; files) — recommended for larger specs:&lt;/p&gt;

&lt;p&gt;Each &lt;code&gt;Scenario&lt;/code&gt; becomes a task. Tag-based metadata provides stable IDs, dependencies, and acceptance overrides:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Auth Refactor

  &lt;span class="err"&gt;@id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;a1b2c3d4&lt;/span&gt;
  &lt;span class="nt"&gt;@acceptance:pytest&lt;/span&gt; &lt;span class="err"&gt;tests/test_session.py&lt;/span&gt;
  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Extract session manager
    &lt;span class="nf"&gt;Given &lt;/span&gt;route handlers contain inline session logic
    &lt;span class="nf"&gt;When &lt;/span&gt;the session manager module is created
    &lt;span class="nf"&gt;Then &lt;/span&gt;all session operations are delegated to the new module

  &lt;span class="nt"&gt;@id:e5f6a7b8&lt;/span&gt;
  &lt;span class="nt"&gt;@depends-on:a1b2c3d4&lt;/span&gt;
  &lt;span class="nt"&gt;@acceptance:pytest&lt;/span&gt; &lt;span class="err"&gt;tests/test_refresh.py&lt;/span&gt;
  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Add token refresh
    &lt;span class="nf"&gt;Given &lt;/span&gt;the session manager exists
    &lt;span class="nf"&gt;When &lt;/span&gt;a token expires during a request
    &lt;span class="nf"&gt;Then &lt;/span&gt;the token is refreshed automatically
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IDs are 8-character lowercase hex (truncated UUID v4) — globally unique and stable across refactors. Generate them with &lt;code&gt;reel --generate-id [spec-dir]&lt;/code&gt;, which scans existing IDs to prevent collisions. Feature files without &lt;code&gt;@id:&lt;/code&gt; tags fall back to auto-generated sequential IDs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt; (heading-per-task):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## a1b2c3d4: Extract session manager&lt;/span&gt;

Move session handling out of route handlers into a dedicated module.

&lt;span class="gs"&gt;**Acceptance:**&lt;/span&gt; &lt;span class="sb"&gt;`pytest tests/test_session.py`&lt;/span&gt;

&lt;span class="gu"&gt;## e5f6a7b8: Add token refresh&lt;/span&gt;

Implement automatic token refresh in the session manager.

&lt;span class="gs"&gt;**Acceptance:**&lt;/span&gt; &lt;span class="sb"&gt;`pytest tests/test_refresh.py`&lt;/span&gt;
&lt;span class="gs"&gt;**Depends on:**&lt;/span&gt; a1b2c3d4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JSON&lt;/strong&gt; (structured):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Auth Refactor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Extract session manager"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"acceptance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pytest tests/test_session.py"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"e5f6a7b8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add token refresh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"acceptance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pytest tests/test_refresh.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Automatic namespacing:&lt;/strong&gt; In directory mode, each file's tasks are prefixed with the file stem to prevent ID collisions. &lt;code&gt;spec/inflight/auth.md&lt;/code&gt; produces &lt;code&gt;auth:a1b2c3d4&lt;/code&gt;, &lt;code&gt;auth:e5f6a7b8&lt;/code&gt;. Within-file dependencies use bare IDs (auto-resolved); cross-file dependencies use qualified IDs like &lt;code&gt;auth:a1b2c3d4&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  History
&lt;/h2&gt;

&lt;p&gt;Geoffrey Huntley &lt;a href="https://ghuntley.com/loop/" rel="noopener noreferrer"&gt;identified the autonomous agent loop pattern&lt;/a&gt; in mid-2025, demonstrating that writing structured specs and feeding them to fresh AI sessions produced better results than marathon single-session coding.&lt;/p&gt;

&lt;p&gt;The community adopted the pattern enthusiastically in late 2025, calling it the "Ralph Wiggum loop" — a pop-culture name that went viral but lacks technical precision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REEL&lt;/strong&gt; provides a culturally agnostic, technically precise replacement. The pattern itself is tool-agnostic — it works with any AI coding CLI that supports non-interactive mode. Its name should be too.&lt;/p&gt;

&lt;p&gt;The pattern has earned a real name. Next time you describe it, try calling it a REEL — and see if the conversation gets a little clearer.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>autonomouscoding</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
