<?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: The Software's Journey</title>
    <description>The latest articles on Forem by The Software's Journey (@the-software-s-journey).</description>
    <link>https://forem.com/the-software-s-journey</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%2Forganization%2Fprofile_image%2F11778%2F21dcc762-353b-42c3-b042-29f0bf6599de.png</url>
      <title>Forem: The Software's Journey</title>
      <link>https://forem.com/the-software-s-journey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/the-software-s-journey"/>
    <language>en</language>
    <item>
      <title>Wizard of Oz Warp 🌪️ Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 17 Apr 2026 13:13:15 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/wizard-of-oz-warp-ep1-3e0f</link>
      <guid>https://forem.com/the-software-s-journey/wizard-of-oz-warp-ep1-3e0f</guid>
      <description>&lt;h2&gt;
  
  
  Episode 1: Follow the Yellow Brick Road
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Toto, I've a feeling we're not in Kansas anymore."— Dorothy Gale, The Wizard of Oz (1939)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Grey Skies of Kansas 🌩️
&lt;/h2&gt;

&lt;p&gt;Kansas is a traditional terminal. It is grey, functional, unchanged since the 1970s in ways that matter. Commands vanish upward in a wall of text. You scroll to find output from thirty seconds ago. The prompt is a single blinking cursor that knows nothing about what you typed last week. An error arrives with no suggestion of how to fix it. You copy-paste from Stack Overflow into a terminal that treats you like a system administrator from 1983.&lt;/p&gt;

&lt;p&gt;You are Dorothy. You have been working in this Kansas for years. It works. Everything works. The Ruby slippers are right there on your feet — you just do not know they are magic yet.&lt;/p&gt;

&lt;p&gt;Then the tornado arrives. It is called &lt;strong&gt;Warp&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ SIPOC — The Journey Begins
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Suppliers&lt;/th&gt;
&lt;th&gt;Inputs&lt;/th&gt;
&lt;th&gt;Process&lt;/th&gt;
&lt;th&gt;Outputs&lt;/th&gt;
&lt;th&gt;Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Warp installer (DMG)&lt;/td&gt;
&lt;td&gt;Your Mac Mini M4 Pro, macOS Sequoia&lt;/td&gt;
&lt;td&gt;Download → drag to Applications → launch → authenticate&lt;/td&gt;
&lt;td&gt;A modern Agentic Development Environment running natively on Apple Silicon&lt;/td&gt;
&lt;td&gt;You — with every future episode's workflow running here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your project idea&lt;/td&gt;
&lt;td&gt;An empty directory&lt;/td&gt;
&lt;td&gt;Scaffold warp-of-oz-tasks with uv, FastAPI, Python 3.12&lt;/td&gt;
&lt;td&gt;A running health endpoint at &lt;a href="http://localhost:8000/health" rel="noopener noreferrer"&gt;http://localhost:8000/health&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;The series codebase that grows across all 8 episodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warp's block system&lt;/td&gt;
&lt;td&gt;Every command you run&lt;/td&gt;
&lt;td&gt;Group command + output into a navigable atomic Block&lt;/td&gt;
&lt;td&gt;A terminal session you can navigate, copy, search, and share&lt;/td&gt;
&lt;td&gt;Your future self — no more scrolling through output walls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Land of Oz: What Warp Actually Is 🏙️
&lt;/h2&gt;

&lt;p&gt;Warp is not a terminal emulator with an AI bolt-on. It is an &lt;strong&gt;Agentic Development Environment&lt;/strong&gt; — a rethinking of what the terminal can be when you assume the developer also has access to a large language model, a cloud orchestration platform, and a team knowledge base.&lt;/p&gt;

&lt;p&gt;It has two parts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warp Terminal&lt;/strong&gt; — the application you download and run on your Mac. Built in Rust for performance. It supports zsh, bash, fish, and PowerShell. It adds blocks, a code-editor-quality input experience, AI features, a file editor, code review, and the ability to run local agents interactively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oz&lt;/strong&gt; — the orchestration platform that lives at &lt;code&gt;oz.warp.dev&lt;/code&gt;. Cloud agents that run in the background, triggered by Slack messages, GitHub PRs, Linear issues, or schedules. Oz is the Emerald City — not visible from Dorothy's first view of the munchkin country, but always glowing on the horizon.&lt;/p&gt;

&lt;p&gt;This episode is about arriving. The tornado. The yellow bricks. The first steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install Warp on the Mac Mini M4 Pro 💻
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Option 1: Direct download from warp.dev&lt;/span&gt;
&lt;span class="c"&gt;# Download Warp.dmg → drag to /Applications → launch&lt;/span&gt;

&lt;span class="c"&gt;# Option 2: Homebrew (recommended — keeps it updated)&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; warp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Warp runs natively on Apple Silicon — no Rosetta translation. The Mac Mini M4 Pro (24 GB unified memory, 12-core CPU) is an excellent host: Warp launches in under a second and local agent inference runs without thermal throttling.&lt;/p&gt;

&lt;p&gt;After first launch, Warp asks you to sign in. A free account unlocks AI features with generous limits. Sign in with GitHub or email.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifying the install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Warp will already be your terminal — just confirm it loaded zsh correctly&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;
&lt;span class="c"&gt;# /bin/zsh&lt;/span&gt;

&lt;span class="c"&gt;# Confirm macOS version&lt;/span&gt;
sw_vers
&lt;span class="c"&gt;# ProductName:    macOS&lt;/span&gt;
&lt;span class="c"&gt;# ProductVersion: 15.x.x (Sequoia)&lt;/span&gt;
&lt;span class="c"&gt;# BuildVersion:   ...&lt;/span&gt;

&lt;span class="c"&gt;# Confirm architecture&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# arm64   ← Apple Silicon, not x86_64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The First Blocks: The Munchkins Welcome You 🌈
&lt;/h2&gt;

&lt;p&gt;The first thing you notice in Warp is that command output is not a river — it is &lt;strong&gt;Blocks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every command and its output form a single, self-contained unit. The block has a border. You can click anywhere in it to select it. You can navigate between blocks with &lt;code&gt;Ctrl-Up&lt;/code&gt; and &lt;code&gt;Ctrl-Down&lt;/code&gt;. You can copy just the output, just the command, or both — with formatting preserved.&lt;/p&gt;

&lt;p&gt;Try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run a command&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~

&lt;span class="c"&gt;# Click somewhere else, then press Ctrl-Up&lt;/span&gt;
&lt;span class="c"&gt;# You land on the ls -la ~ block, not anywhere in the sea of text&lt;/span&gt;

&lt;span class="c"&gt;# Press Cmd-C on a block to copy just the output&lt;/span&gt;
&lt;span class="c"&gt;# Press Shift-Cmd-C to copy "command + output" — useful for sharing&lt;/span&gt;

&lt;span class="c"&gt;# Type: ls -la ~/Des&lt;/span&gt;
&lt;span class="c"&gt;# Warp auto-completes the path. Press Tab. It works.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the yellow brick road. Every step is paved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up the Series Project: &lt;code&gt;warp-of-oz-tasks&lt;/code&gt; 🏗️
&lt;/h2&gt;

&lt;p&gt;Throughout this series, we build a single Python FastAPI application — a task management API — that grows from a bare scaffold to a production-grade service with authentication, background processing, and cloud agent automation. Every feature is added in Warp, using Warp's tools, on the Mac Mini M4 Pro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install &lt;code&gt;uv&lt;/code&gt; (Python package manager)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is a Rust-based Python package manager from Astral. Massively faster than &lt;code&gt;pip&lt;/code&gt;. Perfect pairing with Warp on Apple Silicon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install uv&lt;/span&gt;
curl &lt;span class="nt"&gt;-LsSf&lt;/span&gt; https://astral.sh/uv/install.sh | sh

&lt;span class="c"&gt;# Add to PATH (uv installer does this, but verify)&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
which uv
&lt;span class="c"&gt;# /Users/you/.cargo/bin/uv (or ~/.local/bin/uv)&lt;/span&gt;

uv &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# uv 0.x.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scaffold the project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the project directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects/warp-of-oz-tasks
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/warp-of-oz-tasks

&lt;span class="c"&gt;# Initialise with uv&lt;/span&gt;
uv init &lt;span class="nt"&gt;--name&lt;/span&gt; warp-of-oz-tasks &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12

&lt;span class="c"&gt;# The project structure uv creates:&lt;/span&gt;
&lt;span class="c"&gt;# warp-of-oz-tasks/&lt;/span&gt;
&lt;span class="c"&gt;# ├── .python-version    ← pins Python version&lt;/span&gt;
&lt;span class="c"&gt;# ├── pyproject.toml     ← project metadata and dependencies&lt;/span&gt;
&lt;span class="c"&gt;# ├── README.md&lt;/span&gt;
&lt;span class="c"&gt;# └── hello.py           ← placeholder (we'll replace this)&lt;/span&gt;

&lt;span class="c"&gt;# Add FastAPI and uvicorn&lt;/span&gt;
uv add fastapi &lt;span class="s2"&gt;"uvicorn[standard]"&lt;/span&gt;

&lt;span class="c"&gt;# Confirm&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;pyproject.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Write the first source file
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Remove the placeholder&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;hello.py

&lt;span class="c"&gt;# Create the application entry point&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; src/main.py &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PYTHON&lt;/span&gt;&lt;span class="sh"&gt;'
"""
warp-of-oz-tasks: A FastAPI task management API.
Built across 8 episodes of the Warp of Oz series on a Mac Mini M4 Pro.
"""
from fastapi import FastAPI
from datetime import datetime

app = FastAPI(
    title="Warp of Oz Tasks",
    description="Follow the yellow brick road — one endpoint at a time.",
    version="0.1.0",
)

@app.get("/health")
async def health_check():
    """The Munchkins confirm you have arrived safely."""
    return {
        "status": "alive",
        "message": "Toto, I've a feeling we're not in Kansas anymore.",
        "timestamp": datetime.utcnow().isoformat(),
    }
&lt;/span&gt;&lt;span class="no"&gt;PYTHON

&lt;/span&gt;&lt;span class="c"&gt;# uv expects src layout — create the package&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; src
&lt;span class="nb"&gt;touch &lt;/span&gt;src/__init__.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait — let's check the &lt;code&gt;pyproject.toml&lt;/code&gt; and fix the source layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update pyproject.toml to reflect src layout&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; pyproject.toml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;TOML&lt;/span&gt;&lt;span class="sh"&gt;'
[project]
name = "warp-of-oz-tasks"
version = "0.1.0"
description = "A FastAPI task API — built with Warp, episode by episode."
requires-python = "&amp;gt;=3.12"
dependencies = [
    "fastapi&amp;gt;=0.115.0",
    "uvicorn[standard]&amp;gt;=0.30.0",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["src"]
&lt;/span&gt;&lt;span class="no"&gt;TOML
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run the first server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run with uv run (handles the venv automatically)&lt;/span&gt;
uv run uvicorn src.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open another Warp tab (&lt;code&gt;Cmd-T&lt;/code&gt;) and test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/health | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#     "status": "alive",&lt;/span&gt;
&lt;span class="c"&gt;#     "message": "Toto, I've a feeling we're not in Kansas anymore.",&lt;/span&gt;
&lt;span class="c"&gt;#     "timestamp": "2026-04-17T..."&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The yellow brick road is paved. The first block sparkles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Warp Input Editor: Cursor Movement in the Terminal 🖊️
&lt;/h2&gt;

&lt;p&gt;Traditional terminals treat the input line like a 1970s text field. Warp treats it like a code editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Multi-line input — press Shift-Enter for new lines&lt;/span&gt;
&lt;span class="c"&gt;# The entire block becomes a multi-line script&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import sys
print(f'Python {sys.version}')
print('Running on Apple Silicon' if 'arm64' in sys.platform else 'Not ARM')
"&lt;/span&gt;

&lt;span class="c"&gt;# Alt-click to place the cursor exactly where you want&lt;/span&gt;
&lt;span class="c"&gt;# Cmd-Z to undo a character you deleted in the input&lt;/span&gt;
&lt;span class="c"&gt;# Select text with Shift-Arrow and delete it&lt;/span&gt;

&lt;span class="c"&gt;# This works like VS Code. Because Warp is built to.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The &lt;code&gt;#&lt;/code&gt; Key: Your First Taste of Magic ✨
&lt;/h2&gt;

&lt;p&gt;Type &lt;code&gt;#&lt;/code&gt; in Warp's input and start describing what you want in plain English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# show me all python processes running on this machine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Warp converts this to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not AI autocomplete. This is natural language to shell command translation. Try more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# find all files larger than 100MB in my home directory&lt;/span&gt;
&lt;span class="c"&gt;# show disk usage for the current directory sorted by size&lt;/span&gt;
&lt;span class="c"&gt;# what port is uvicorn running on&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Scarecrow is acquiring a brain. But that is Episode 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project Structure So Far 📁
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/projects/warp-of-oz-tasks/
├── .python-version         ← Python 3.12
├── pyproject.toml          ← dependencies and metadata
├── README.md
└── src/
    ├── __init__.py
    └── main.py             ← health endpoint ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit this starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/warp-of-oz-tasks
git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: scaffold warp-of-oz-tasks — the tornado has landed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Series Map: Eight Episodes 🗺️
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Oz parallel&lt;/th&gt;
&lt;th&gt;Warp feature&lt;/th&gt;
&lt;th&gt;Codebase milestone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;This one — Yellow Brick Road&lt;/td&gt;
&lt;td&gt;Dorothy arrives&lt;/td&gt;
&lt;td&gt;Blocks, input editor, # key&lt;/td&gt;
&lt;td&gt;Health endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;The Scarecrow Gets a Brain&lt;/td&gt;
&lt;td&gt;Scarecrow + brain&lt;/td&gt;
&lt;td&gt;AI completions, Active AI, agent chat&lt;/td&gt;
&lt;td&gt;CRUD endpoints for tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;The Tin Man Gets a Heart&lt;/td&gt;
&lt;td&gt;Tin Man + heart&lt;/td&gt;
&lt;td&gt;WARP.md, Rules, Skills&lt;/td&gt;
&lt;td&gt;Auth middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;The Lion Gets Courage&lt;/td&gt;
&lt;td&gt;Cowardly Lion&lt;/td&gt;
&lt;td&gt;Agent pair mode, code review panel&lt;/td&gt;
&lt;td&gt;Debug a planted error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Flying Monkeys: Dispatch&lt;/td&gt;
&lt;td&gt;Flying monkeys&lt;/td&gt;
&lt;td&gt;Autonomous dispatch mode&lt;/td&gt;
&lt;td&gt;Background task processor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;The Emerald City: Oz&lt;/td&gt;
&lt;td&gt;Emerald City&lt;/td&gt;
&lt;td&gt;Cloud agents, Oz CLI, schedules&lt;/td&gt;
&lt;td&gt;Scheduled cleanup agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;The Ruby Slippers: Augment&lt;/td&gt;
&lt;td&gt;Ruby slippers&lt;/td&gt;
&lt;td&gt;Augment Code Intent + Warp&lt;/td&gt;
&lt;td&gt;Spec-driven feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;There's No Place Like Home&lt;/td&gt;
&lt;td&gt;Going home&lt;/td&gt;
&lt;td&gt;MCP, Warp Drive, full workflow&lt;/td&gt;
&lt;td&gt;Production-ready service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In &lt;strong&gt;Episode 2&lt;/strong&gt;, the Scarecrow joins the road. He needs a brain. Warp's AI features are exactly that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Warp download&lt;/strong&gt;: &lt;a href="https://www.warp.dev" rel="noopener noreferrer"&gt;warp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warp documentation&lt;/strong&gt;: &lt;a href="https://docs.warp.dev" rel="noopener noreferrer"&gt;docs.warp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oz platform&lt;/strong&gt;: &lt;a href="https://oz.warp.dev" rel="noopener noreferrer"&gt;oz.warp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;uv (Python package manager)&lt;/strong&gt;: &lt;a href="https://docs.astral.sh/uv" rel="noopener noreferrer"&gt;docs.astral.sh/uv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt;: &lt;a href="https://fastapi.tiangolo.com" rel="noopener noreferrer"&gt;fastapi.tiangolo.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;🌪️ Warp of Oz Series follows the Yellow Brick Road through Warp's Agentic Development Environment — from the first install on a Mac Mini M4 Pro to cloud agent orchestration with Oz, with Augment Code Intent as the ruby slippers that were powerful all along.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>warp</category>
      <category>terminal</category>
      <category>macos</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Magic Lamp Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 17 Apr 2026 12:33:42 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/magic-lamp-ep1-558f</link>
      <guid>https://forem.com/the-software-s-journey/magic-lamp-ep1-558f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You'll like it — not a lot, but you'll like it."&lt;/em&gt;&lt;br&gt;
— Paul Daniels&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paul Daniels never actually made things appear from nowhere. The secret to his act was subtler: he made &lt;em&gt;you&lt;/em&gt; see life in the lifeless. A silk handkerchief folded just so. A coin that hesitated before vanishing. The magic wasn't in the props — it was in the relationship between performer and object. The audience believed because the performer believed first.&lt;/p&gt;

&lt;p&gt;This is a project that works the same way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎭 The Performance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PIXSTARS&lt;/strong&gt; is a 20-minute silent theatrical piece for a live event. The setup is deliberately sparse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One performer on stage&lt;/li&gt;
&lt;li&gt;One animatronic desk lamp named &lt;strong&gt;Pinokio&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A live piano&lt;/li&gt;
&lt;li&gt;A deconstructed rendering of Guns N' Roses' &lt;em&gt;November Rain&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;No dialogue. Not a single word.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lamp is not a prop. It is a co-performer. It has 14 distinct personality states — from &lt;code&gt;INERT&lt;/code&gt; to &lt;code&gt;ARROGANT&lt;/code&gt; to &lt;code&gt;DYING&lt;/code&gt; to &lt;code&gt;REBORN&lt;/code&gt; — and moves through them on choreographed cues as the music plays. The performer holds three simultaneous character identities (Rockstar, Creator, Witness). The lamp holds the mirror.&lt;/p&gt;

&lt;p&gt;Think Kim Ki-duk, not Cirque du Soleil. Sparse. Patient. Emotionally loaded.&lt;/p&gt;




&lt;h2&gt;
  
  
  🪄 The Paul Daniels Problem
&lt;/h2&gt;

&lt;p&gt;When Paul Daniels placed a lifeless prop on his table, it was just an object. The moment he began working with it — tilting, pausing, reacting — it became a &lt;em&gt;character&lt;/em&gt;. The prop hadn't changed. The frame around it had.&lt;/p&gt;

&lt;p&gt;Building Pinokio means solving the same problem in code: how do you cross the line from &lt;em&gt;object that moves&lt;/em&gt; to &lt;em&gt;character that lives&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;The answer, it turns out, is architecture.&lt;/p&gt;

&lt;p&gt;A lamp that moves on command is a prop. A lamp that has &lt;strong&gt;emotional states&lt;/strong&gt;, &lt;strong&gt;reacts to music&lt;/strong&gt;, &lt;strong&gt;speaks with its body&lt;/strong&gt;, and &lt;strong&gt;wakes up on cue&lt;/strong&gt; — that's a character. The difference is not hardware. It's the layer of abstraction between the mechanical and the theatrical.&lt;/p&gt;

&lt;p&gt;This series documents exactly how that abstraction is built.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ The Stack
&lt;/h2&gt;

&lt;p&gt;Before we get into code, here is the complete hardware and software picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mac Mini M4 Pro&lt;/td&gt;
&lt;td&gt;Show control host, runs everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pololu Mini Maestro 24-ch USB servo controller&lt;/td&gt;
&lt;td&gt;Lamp motion brain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4x MG996R servos&lt;/td&gt;
&lt;td&gt;Large articulation: base, shoulder, elbow, head tilt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2x MG90S servos&lt;/td&gt;
&lt;td&gt;Fine motion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEAN WELL LRS-50-5 PSU&lt;/td&gt;
&lt;td&gt;5V servo rail, isolated from logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino Nano&lt;/td&gt;
&lt;td&gt;NeoPixel serial bridge (the Maestro doesn't speak NeoPixel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NeoPixel RGBW ring&lt;/td&gt;
&lt;td&gt;Lamp head LED indicator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logitech C920 webcam&lt;/td&gt;
&lt;td&gt;Mounted near lamp — gaze source or projection input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raspberry Pi Zero 2 WH&lt;/td&gt;
&lt;td&gt;Satellite node: mic, speaker, LED — no soldering required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enttec DMX USB Pro&lt;/td&gt;
&lt;td&gt;Stage lighting control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Software subsystems&lt;/strong&gt; (all on the Mac Mini):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│                   SHOW CONDUCTOR                    │
│           conductor/main.py  (YAML timeline)        │
└────────┬──────────┬──────────┬──────────┬───────────┘
         │ OSC      │ OSC      │ OSC      │ OSC
         ▼          ▼          ▼          ▼
    Port 3819   Port 9001   Port 9002   Port 9003
    ┌───────┐  ┌────────┐  ┌──────────┐  ┌─────────┐
    │Ardour │  │  Lamp  │  │Projection│  │Lighting │
    │  DAW  │  │adapter │  │(pygame)  │  │  (DMX)  │
    └───────┘  └────────┘  └──────────┘  └─────────┘
                                  all mirrored to
                              Port 9004 / WS 8765
                         ┌──────────────────────┐
                         │    Digital Twin      │
                         │  (BabylonJS + Deno)  │
                         └──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every subsystem speaks &lt;strong&gt;OSC&lt;/strong&gt; (Open Sound Control) over UDP on localhost. The conductor doesn't know or care whether the lamp adapter talks to real servos or a simulator — it just sends &lt;code&gt;/lamp/state CURIOUS&lt;/code&gt; and moves on.&lt;/p&gt;

&lt;p&gt;That decoupling is the key architectural decision. More on that in episode 2.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎛️ OSC: The Nervous System
&lt;/h2&gt;

&lt;p&gt;OSC is the protocol that holds the show together. It's a UDP-based message format originally designed for musical instruments and live sound, which makes it a natural fit for real-time stage control. Messages look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/lamp/state        CURIOUS
/projection/scene  DISNEY_CASTLE
/lighting/state    DISNEY_SOFT
/toggle_roll       (Ardour play/stop)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each subsystem listens on its own port. The conductor dispatches all messages for a single cue within the same 50ms polling tick. The result is near-simultaneous state transitions across audio, video, light, and motion.&lt;/p&gt;

&lt;p&gt;The complete port map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# conductor/config.py
&lt;/span&gt;&lt;span class="n"&gt;ARDOUR_OSC_PORT&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3819&lt;/span&gt;   &lt;span class="c1"&gt;# Ardour 9 control surface
&lt;/span&gt;&lt;span class="n"&gt;LAMP_OSC_PORT&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9001&lt;/span&gt;   &lt;span class="c1"&gt;# Lamp personality adapter
&lt;/span&gt;&lt;span class="n"&gt;PROJECTION_OSC_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9002&lt;/span&gt;   &lt;span class="c1"&gt;# Pygame display
&lt;/span&gt;&lt;span class="n"&gt;LIGHTING_OSC_PORT&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9003&lt;/span&gt;   &lt;span class="c1"&gt;# Enttec DMX USB Pro
&lt;/span&gt;&lt;span class="n"&gt;TWIN_OSC_PORT&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9004&lt;/span&gt;   &lt;span class="c1"&gt;# Digital Twin OSC bridge
&lt;/span&gt;&lt;span class="n"&gt;TWIN_WS_PORT&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8765&lt;/span&gt;   &lt;span class="c1"&gt;# Digital Twin WebSocket (browser)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⏱️ The Timeline: 15 Cues, 9 Minutes 15 Seconds
&lt;/h2&gt;

&lt;p&gt;The entire show lives in a single YAML file. Here's a slice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# conductor/timeline.yaml (excerpt)&lt;/span&gt;
&lt;span class="na"&gt;cues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SHOW_START&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;INERT&lt;/span&gt;
    &lt;span class="na"&gt;projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BLACKOUT&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BLACKOUT&lt;/span&gt;
    &lt;span class="na"&gt;ardour&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;transport_play&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DRUMS_BEGIN&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CURIOUS&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;340.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OVERHEATING&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OVERHEATING&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OVERHEAT&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;380.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LAMP_DEATH&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DYING&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DEATH&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;460.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REVEAL_AI&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;WEAK&lt;/span&gt;
    &lt;span class="na"&gt;projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AI_SIGNATURE&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REBIRTH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At second 0, the lamp is &lt;code&gt;INERT&lt;/code&gt; and Ardour begins playing. By second 60, the drums enter and the lamp becomes &lt;code&gt;CURIOUS&lt;/code&gt;. By second 380, it is &lt;code&gt;DYING&lt;/code&gt;. The arc from object to character to death to rebirth — all scripted, all precise, all driven by this YAML.&lt;/p&gt;

&lt;p&gt;Paul Daniels rehearsed his timing with a stopwatch. So does Pinokio.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 What's Coming in This Series
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt; (this one)&lt;/td&gt;
&lt;td&gt;Architecture overview — the magic prop metaphor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Show Conductor — OSC dispatching and timeline execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14 Personalities in a Lampshade — servo states and motion vocabulary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Light the Stage — DMX control, pygame projection, and the digital twin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Finding Its Voice — HiveMind, Coqui XTTS, and the Raspberry Pi satellite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By the end of episode 5, Pinokio will have gone from a desk lamp on a table to a character capable of reacting to music, shifting emotional states on cue, speaking in a synthesised voice, and lighting up its own head in synchrony with its mood — all orchestrated from a single Python process on a Mac Mini.&lt;/p&gt;

&lt;p&gt;Not a lot. But you'll like it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next: Episode 2 — The Show Conductor: how 15 YAML cues orchestrate five subsystems in real time.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>hardware</category>
      <category>showcontrol</category>
      <category>makers</category>
    </item>
    <item>
      <title>Air Traffic Control Scaleway Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 17 Apr 2026 10:09:31 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/air-traffic-control-scaleway-ep1-5hcj</link>
      <guid>https://forem.com/the-software-s-journey/air-traffic-control-scaleway-ep1-5hcj</guid>
      <description>&lt;h1&gt;
  
  
  Cleared for Approach: Identity and Access Management on Scaleway
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;“F-A-B, Mr. Tracy. All runways are cleared. But before any aircraft lifts off, we must know exactly&lt;/em&gt; who &lt;em&gt;is behind the controls — and precisely&lt;/em&gt; what &lt;em&gt;they are cleared to do.”&lt;/em&gt;&lt;em&gt;— International Rescue, Thunderbird 5 Orbital Station&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Welcome to the &lt;strong&gt;Scaleway Air Traffic Control Centre&lt;/strong&gt; — your operations hub in the French cloud.&lt;/p&gt;

&lt;p&gt;In this series, we run our infrastructure the way International Rescue manages its missions: with discipline, precision, and absolute clarity about who is authorised to do what. In a busy airport, you do not simply wave aircraft onto the runway. Every pilot has a licence. Every aircraft has a flight plan. Every gate has a crew with specific clearances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity and Access Management (IAM)&lt;/strong&gt; on Scaleway works on precisely this principle.&lt;/p&gt;

&lt;p&gt;Think of your Scaleway &lt;strong&gt;Organisation&lt;/strong&gt; as Thunderbird Island itself — the central command. Your &lt;strong&gt;Projects&lt;/strong&gt; are the individual Thunderbird vehicles: Dev is Thunderbird 1 (fast, agile, first on the scene), Production is Thunderbird 2 (heavy lifting, critical cargo), and Test is Thunderbird 3 (probing unmapped territory). Each requires its own flight crew, its own access codes, and its own launch protocols.&lt;/p&gt;

&lt;p&gt;By the end of this episode, you will have configured the entire clearance architecture: SSH keys, collaborators, groups, applications, policies, and an API key — all locked down in a manner that would satisfy even the most zealous International Rescue security review.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Mission Parameters
&lt;/h2&gt;

&lt;p&gt;In this hands-on episode, you will learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up multiple &lt;strong&gt;Projects&lt;/strong&gt; within a Scaleway Organisation&lt;/li&gt;
&lt;li&gt;Access the &lt;strong&gt;IAM&lt;/strong&gt; section of the Scaleway Console&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;member accounts&lt;/strong&gt; and invite collaborators to your Organisation&lt;/li&gt;
&lt;li&gt;Navigate between Organisations as a guest member&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Group&lt;/strong&gt; and assign members to it&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;Applications&lt;/strong&gt; for non-human (programmatic) principals&lt;/li&gt;
&lt;li&gt;Define &lt;strong&gt;Policies&lt;/strong&gt; with scoped permission sets for different principals&lt;/li&gt;
&lt;li&gt;Attach an existing Policy to an Application&lt;/li&gt;
&lt;li&gt;Generate an &lt;strong&gt;API key&lt;/strong&gt; with a controlled expiry window&lt;/li&gt;
&lt;li&gt;Authenticate a live Scaleway API request using a secret key&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pre-Launch Checklist
&lt;/h3&gt;

&lt;p&gt;Before Scott Tracy can take Thunderbird 1 to maximum velocity, ground crew run their checks. Do the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ You hold an active &lt;a href="https://console.scaleway.com" rel="noopener noreferrer"&gt;Scaleway account&lt;/a&gt; and own an Organisation&lt;/li&gt;
&lt;li&gt;✅ Two teammates are available — they will serve as co-pilots, each assigned a different clearance level&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 SIPOC — How IAM Moves Through the System
&lt;/h2&gt;

&lt;p&gt;Before we touch the Console, let us map the process. IAM is not a single action — it is a pipeline. The &lt;strong&gt;SIPOC&lt;/strong&gt; model (Supplier → Input → Process → Output → Consumer) reveals exactly how identity and access flow through your Scaleway Organisation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;SIPOC Element&lt;/th&gt;
&lt;th&gt;IAM Equivalent&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Supplier&lt;/td&gt;
&lt;td&gt;Scaleway IAM engine + your Organisation Owner account&lt;/td&gt;
&lt;td&gt;The platform and the human who configures it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;Member definitions, Group memberships, Application names, Policy rules&lt;/td&gt;
&lt;td&gt;“User: teammate-1, Group: Developers, Scope: Dev project, Permission: FullAccess”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;Process&lt;/td&gt;
&lt;td&gt;Creating Projects → Onboarding members → Defining Groups → Writing Policies → Issuing API keys&lt;/td&gt;
&lt;td&gt;All the hands-on steps in this episode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;A working IAM architecture: scoped permissions enforced across all projects&lt;/td&gt;
&lt;td&gt;Teammate 1 can create Instances in Dev. Teammate 2 can create Instances in Production. Applications hold API keys.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;td&gt;Developers, CI/CD pipelines, automation scripts, and applications that interact with Scaleway resources&lt;/td&gt;
&lt;td&gt;Your team, app-1, app-2, and your own curl commands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Supplier              Input                Process               Output               Consumer
─────────             ─────────            ─────────             ─────────            ─────────
Scaleway IAM   ──▶   Members         ──▶  Create Projects  ──▶  Scoped        ──▶   Developers
engine               Groups               Onboard users         policies              CI/CD
                     Applications         Define groups         enforced              pipelines
Organisation         Policy rules         Write policies        across all            Applications
Owner account        SSH keys             Issue API keys        projects              (app-1, app-2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Tower to crew: The SIPOC view tells us something important — IAM is only as good as the inputs you provide. Vague policy rules produce vague clearances. Garbage in, unrestricted access out. Thunderbird Island does not operate on vague.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🛫 Section 1 — Establishing the Flight Zones: Set Up Projects
&lt;/h2&gt;

&lt;p&gt;Every International Rescue operation begins with a clear separation of zones. We mirror this discipline with three Scaleway Projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 — Create Three Projects
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Organisation Dashboard&lt;/strong&gt; menu, select the &lt;strong&gt;Projects&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Project&lt;/strong&gt; and enter &lt;code&gt;Dev&lt;/code&gt; as the Project Name.&lt;/li&gt;
&lt;li&gt;Repeat to create a project named &lt;code&gt;Production&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Repeat once more for a project named &lt;code&gt;Test&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1.2 — Generate Three SSH Keys — One Per Zone
&lt;/h3&gt;

&lt;p&gt;An SSH key is your pilot’s licence. Each zone gets its own key; cross-zone entry is not permitted. Open your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate Ed25519 keys, AES-256-GCM encrypted, no passphrase&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"login"&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; aes256-gcm@openssh.com &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="nt"&gt;-f&lt;/span&gt; handson-iam-dev.pub &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;

ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"login"&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; aes256-gcm@openssh.com &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="nt"&gt;-f&lt;/span&gt; handson-iam-production.pub &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;

ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"login"&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; aes256-gcm@openssh.com &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="nt"&gt;-f&lt;/span&gt; handson-iam-test.pub &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Why Ed25519? It is modern, compact, and resistant to the brute-force attacks that might trouble a less security-conscious organisation. The -Z &lt;a href="mailto:aes256-gcm@openssh.com"&gt;aes256-gcm@openssh.com&lt;/a&gt; flag encrypts the private key file at rest. International Rescue keeps its launch codes safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1.3 — Register SSH Keys to Each Project
&lt;/h3&gt;

&lt;p&gt;Repeat this procedure for &lt;code&gt;Dev&lt;/code&gt;, &lt;code&gt;Test&lt;/code&gt;, and &lt;code&gt;Production&lt;/code&gt; — using the corresponding key file each time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;cat handson-iam-dev.pub&lt;/code&gt; in your terminal to display the public key.&lt;/li&gt;
&lt;li&gt;Copy the key. It begins with &lt;code&gt;ssh-ed25519&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Organisation Dashboard&lt;/strong&gt;, click the &lt;code&gt;Dev&lt;/code&gt; project, then select the &lt;strong&gt;SSH keys&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add SSH key&lt;/strong&gt;. Enter a name such as &lt;code&gt;Hands on IAM dev&lt;/code&gt; and paste the public key.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add SSH key&lt;/strong&gt; to confirm.&lt;/li&gt;
&lt;li&gt;Repeat for &lt;code&gt;Test&lt;/code&gt; and &lt;code&gt;Production&lt;/code&gt; using their respective key files.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧑‍✈️ Section 2 — Crew Manifest: Adding Collaborators
&lt;/h2&gt;

&lt;p&gt;No mission launches with anonymous personnel aboard. We now bring our two teammates into the Organisation — each with their own identity and password, ready to receive specific clearances.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Management &amp;amp; Governance&lt;/strong&gt; drop-down, select &lt;strong&gt;IAM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Users&lt;/strong&gt; tab, then click &lt;strong&gt;Create member&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For each teammate: enter their &lt;code&gt;username&lt;/code&gt;, select &lt;strong&gt;Send password by email&lt;/strong&gt;, then add their &lt;code&gt;email&lt;/code&gt; and personal information. Leave &lt;strong&gt;Assign member to group&lt;/strong&gt; empty for now. Click &lt;strong&gt;Create member&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ask each teammate to check their inbox and log in to your Organisation.&lt;/li&gt;
&lt;li&gt;Repeat for the second teammate.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Once logged in, teammates can reach your Organisation via the Organisation drop-down → + Add Organisation. They will see the projects you created — but, with no policy assigned yet, they cannot touch anything. Clearance is coming. Patience, as Brains would say.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🏗️ Section 3 — Clearance Architecture: Groups, Applications &amp;amp; Policies
&lt;/h2&gt;

&lt;p&gt;With the crew aboard, we build the clearance architecture — the system that determines who may access which runway, and with what authority.&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Group&lt;/strong&gt; is a flight crew qualification — all pilots in the group share the same category of clearance.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Policy&lt;/strong&gt; is the air traffic control instruction that says precisely which zones that clearance covers.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Application&lt;/strong&gt; is an unmanned probe — a programmatic identity with its own flight plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.1 — Create the Developers Group
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt;, select the &lt;strong&gt;Groups&lt;/strong&gt; tab. Click &lt;strong&gt;Create group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;Developers&lt;/code&gt; as the Name. Leave Tags empty.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add a member&lt;/strong&gt; and add your first teammate.&lt;/li&gt;
&lt;li&gt;Confirm with &lt;strong&gt;Create group&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.2 — Deploy Unmanned Probes: Create Applications
&lt;/h3&gt;

&lt;p&gt;Thunderbird 3 can fly to Space Station Alpha without a human crew. Our Applications are the cloud equivalent — automated systems that need identities and permissions, but no login.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt;, select the &lt;strong&gt;Applications&lt;/strong&gt; tab. Click &lt;strong&gt;Create application&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name it &lt;code&gt;app-1&lt;/code&gt;. Leave Tags and Policy empty. Confirm.&lt;/li&gt;
&lt;li&gt;Repeat to create a second application named &lt;code&gt;app-2&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.3 — Issue Flight Plans: Create Policies &amp;amp; Configure Rules
&lt;/h3&gt;

&lt;p&gt;Three principals. Three policies. Each one a precisely scoped flight authorisation.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;strong&gt;IAM&lt;/strong&gt; → &lt;strong&gt;Policies&lt;/strong&gt; → &lt;strong&gt;Create policy&lt;/strong&gt; for each of the following.&lt;/p&gt;

&lt;h4&gt;
  
  
  Policy A — Developers Group
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Hands on IAM developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;Group → Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → Dev project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Permissions&lt;/td&gt;
&lt;td&gt;AllProducts → AllProductsFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 2 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → All current and future projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 2 — Permissions&lt;/td&gt;
&lt;td&gt;AllProducts → AllProductsReadOnly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Work through the policy wizard in order: set &lt;strong&gt;① Scope&lt;/strong&gt; and validate; set &lt;strong&gt;② Permission sets&lt;/strong&gt; and validate; leave &lt;strong&gt;③ CEL conditions&lt;/strong&gt; empty; add a second rule via &lt;strong&gt;Add rule&lt;/strong&gt; and repeat. Finalise with &lt;strong&gt;Create policy&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tower confirms: Teammate 1 now has full command over the Dev zone and read-only visibility everywhere else. Ask them to attempt launching an Instance in both Dev and Production. Dev succeeds; Production refuses. Exactly as the clearance system intends.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Policy B — Individual User
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Hands on IAM User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;User → Teammate 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → Production project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Permissions&lt;/td&gt;
&lt;td&gt;Compute → InstancesFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Tower confirms: Teammate 2 has been given the Production runway — specifically for compute resources. They can create and manage Instances there, and nowhere else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Policy C — Application Principal
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;app-policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;Application → app-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → Test project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Permissions&lt;/td&gt;
&lt;td&gt;AllProducts → AllProductsFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3.4 — Transfer Flight Plan: Attach Policy to app-2
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;app-2&lt;/code&gt; currently has no clearance — it sits idle on the apron. Rather than writing a new policy, we duplicate the existing &lt;code&gt;app-policy&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt; → &lt;strong&gt;Applications&lt;/strong&gt;, click &lt;code&gt;app-2&lt;/code&gt;, then open the &lt;strong&gt;Groups &amp;amp; Policies&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Policies&lt;/strong&gt; section, click &lt;strong&gt;Attach a policy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Duplicate an existing policy&lt;/strong&gt;, then choose &lt;code&gt;app-policy&lt;/code&gt;. Confirm.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🗺️ IAM Architecture — The Clearance Map
&lt;/h2&gt;

&lt;p&gt;Your Organisation’s IAM implementation should now match the following layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│                     ORGANISATION                               │
│                                                                │
│  PRINCIPALS             POLICIES              PROJECTS         │
│  ──────────────         ─────────────         ───────────      │
│                                                                │
│  Developers  ──────▶  IAM developers ──▶  Dev (Full)          │
│  Group                                ──▶  All (Read-Only)    │
│  (Teammate 1)                                                  │
│                                                                │
│  Teammate 2  ──────▶  IAM User       ──▶  Production          │
│  (IAM user)                               (InstancesFullAccess)│
│                                                                │
│  app-1       ──────▶  app-policy     ──▶  Test (Full)         │
│                                                                │
│  app-2       ──────▶  app-policy     ──▶  Test (Full)         │
│               (duplicated)                                     │
└────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 Section 4 — The Master Override: API Keys
&lt;/h2&gt;

&lt;p&gt;Every control tower has a master key — used sparingly, stored securely, and never left on the desk. In Scaleway, the &lt;strong&gt;API key&lt;/strong&gt; is that master key. It allows you to issue commands to the platform programmatically, bypassing the Console entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 — Generate an API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt;, select the &lt;strong&gt;API keys&lt;/strong&gt; tab. Click &lt;strong&gt;Generate API key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Myself (IAM user)&lt;/strong&gt; as the bearer.&lt;/li&gt;
&lt;li&gt;Leave Description empty. Set &lt;strong&gt;Expiration&lt;/strong&gt; to &lt;code&gt;1 hour&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;No&lt;/strong&gt; for Object Storage usage.&lt;/li&gt;
&lt;li&gt;Copy and securely store the &lt;strong&gt;Secret Key&lt;/strong&gt; displayed. It will not be shown again.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Security Protocol — Restricted: A Secret Key is sensitive data of the highest classification. Never commit it to a repository, paste it into a chat message, or leave it in a shell history file. The Organisation Owner’s API key inherits full permissions — treat it accordingly. International Rescue does not negotiate with those who mishandle launch codes.&lt;/p&gt;

&lt;p&gt;Note: When an Organisation Owner generates an API key for themselves, the key carries all permissions, since the Owner holds all permissions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.2 — Rename a Project via the Scaleway API
&lt;/h3&gt;

&lt;p&gt;We will demonstrate the API key by renaming the &lt;code&gt;Test&lt;/code&gt; project to &lt;code&gt;updated_test&lt;/code&gt; — without touching the Console. A single &lt;code&gt;curl&lt;/code&gt; command, precisely aimed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Project&lt;/strong&gt; header drop-down, select &lt;code&gt;Test&lt;/code&gt;, then click &lt;strong&gt;Copy ID&lt;/strong&gt; next to the project name to copy its UUID.&lt;/li&gt;
&lt;li&gt;Open a terminal and run the following command, substituting your actual secret key and project ID:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Auth-Token: &amp;lt;your_secret_key&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "updated_test"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.scaleway.com/account/v3/projects/&amp;lt;test_project_id&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Refresh your browser. The &lt;code&gt;Test&lt;/code&gt; project is now named &lt;code&gt;updated_test&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Take care with invisible whitespace when copying keys and IDs from the Console — a single hidden character produces a 401 Unauthorised response, and even the most experienced tower controller will spend a frustrating few minutes debugging. You have been warned by someone who has been there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🚀 Section 5 — Advanced Flight Options
&lt;/h2&gt;

&lt;p&gt;You have now proven your ability at the controls. But International Rescue never stops improving its equipment. The API key you generated can power far more than a single &lt;code&gt;curl&lt;/code&gt; call. Two recommended flight paths once you have your bearings:&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaleway CLI
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/scaleway/scaleway-cli/blob/master/docs/commands/iam.md" rel="noopener noreferrer"&gt;Scaleway CLI&lt;/a&gt; gives you full IAM control from the terminal. Install it and try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all IAM policies in your organisation&lt;/span&gt;
scw iam policy list

&lt;span class="c"&gt;# Describe a specific policy by ID&lt;/span&gt;
scw iam policy get policy-id&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-policy-id&amp;gt;

&lt;span class="c"&gt;# List all IAM users&lt;/span&gt;
scw iam user list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Terraform Provider
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/resources/iam_api_key" rel="noopener noreferrer"&gt;Scaleway Terraform provider&lt;/a&gt; lets you manage IAM as infrastructure-as-code. A minimal API key resource looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"scaleway_iam_application"&lt;/span&gt; &lt;span class="s2"&gt;"app_ci"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-ci-pipeline"&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Programmatic identity for CI/CD pipeline"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"scaleway_iam_api_key"&lt;/span&gt; &lt;span class="s2"&gt;"app_ci_key"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;application_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scaleway_iam_application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app_ci&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"CI pipeline key — rotated monthly"&lt;/span&gt;
  &lt;span class="nx"&gt;expires_at&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2026-04-01T00:00:00Z"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The Terraform approach is strongly recommended for any IAM configuration that will persist beyond a lab environment. Infrastructure-as-code means your clearance architecture is version-controlled, peer-reviewed, and reproducible — three qualities that Jeff Tracy demands of every Thunderbird system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📋 Episode Debrief
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“All systems nominal. Clearances verified. The runway is yours — and only yours. Thunderbirds are GO.”&lt;/em&gt;&lt;em&gt;— Jeff Tracy, Thunderbird Island Operations Centre&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this episode, you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Created three Projects — &lt;code&gt;Dev&lt;/code&gt;, &lt;code&gt;Production&lt;/code&gt;, &lt;code&gt;Test&lt;/code&gt; — each with its own SSH key&lt;/li&gt;
&lt;li&gt;✅ Onboarded two collaborators as Organisation members&lt;/li&gt;
&lt;li&gt;✅ Established a &lt;code&gt;Developers&lt;/code&gt; Group for shared clearance management&lt;/li&gt;
&lt;li&gt;✅ Registered two Applications as non-human principals (&lt;code&gt;app-1&lt;/code&gt;, &lt;code&gt;app-2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Defined three Policies with scoped permission sets across group, user, and application principals&lt;/li&gt;
&lt;li&gt;✅ Duplicated an existing Policy and attached it to &lt;code&gt;app-2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Generated an API key with a one-hour expiry window&lt;/li&gt;
&lt;li&gt;✅ Executed a live Scaleway API call via &lt;code&gt;curl&lt;/code&gt; to rename a project&lt;/li&gt;
&lt;li&gt;✅ Mapped the full process through the SIPOC model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The clearance architecture is in place. In the next episode, we will spin up our first compute resources inside these carefully guarded zones — and the IAM rules we built today will be the first thing that greets them.&lt;/p&gt;

&lt;h2&gt;
  
  
  📡 Further Transmissions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.scaleway.com/en/docs/iam/concepts/" rel="noopener noreferrer"&gt;Scaleway IAM documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/scaleway/scaleway-cli/blob/master/docs/commands/iam.md" rel="noopener noreferrer"&gt;Scaleway CLI — IAM command reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/resources/iam_api_key" rel="noopener noreferrer"&gt;Terraform Provider — &lt;/a&gt;&lt;code&gt;scaleway_iam_api_key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scaleway.com/en/developers/api/account/#path-projects-update-project" rel="noopener noreferrer"&gt;Scaleway API — Update Project endpoint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Estimated reading time: 12 minutes. Estimated hands-on time: 45–60 minutes with teammates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This series is part of the *&lt;/em&gt;&lt;strong&gt;the-software-s-journey&lt;/strong&gt;** publication on DEV.to — cloud infrastructure explained through the metaphors that make it stick.*&lt;/p&gt;

</description>
      <category>scaleway</category>
      <category>cloud</category>
      <category>iam</category>
      <category>security</category>
    </item>
    <item>
      <title>Game on Djangular 🎮 Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Thu, 16 Apr 2026 13:33:21 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/game-on-djangular-ep1-43a8</link>
      <guid>https://forem.com/the-software-s-journey/game-on-djangular-ep1-43a8</guid>
      <description>&lt;h2&gt;
  
  
  Episode 1: Welcome to the Vault
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Every gamer has a backlog. The good ones have a system.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Backlog Problem 🎯
&lt;/h2&gt;

&lt;p&gt;Every gamer knows the feeling. Forty-three games in your library. You can only name eight of them from memory. Three are half-finished from two years ago. You started one last week but cannot remember whether the save file is on the laptop or the desktop. Someone on Reddit just posted that a game you bought on sale is “not worth it past hour 12” and you are on hour 11.&lt;/p&gt;

&lt;p&gt;You need a Vault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GameLib&lt;/strong&gt; is that vault: a full-stack web application where gamers manage their personal libraries, track progress, discover new titles, and share reviews. Built for a Web Development course at KBTU, it is a working example of the &lt;strong&gt;Djangular&lt;/strong&gt; stack — Django REST Framework on the backend, Angular on the frontend, PostgreSQL as the game database, and JWT tokens as the keys to your personal collection.&lt;/p&gt;

&lt;p&gt;This series builds GameLib from the ground up and extends it into enterprise territory: XML file exchange with external Linux servers, TLS and mutual TLS certificate management, SailPoint IAM for identity verification, and a full PKI infrastructure managed by &lt;code&gt;django-ca&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂️ SIPOC — The Vault
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Suppliers&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Inputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Process&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Customers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gamers (registered users)&lt;/td&gt;
&lt;td&gt;Game titles, play status, ratings, reviews&lt;/td&gt;
&lt;td&gt;Angular frontend → DRF API → PostgreSQL&lt;/td&gt;
&lt;td&gt;A personal vault: tracked games, statuses, scores, reviews&lt;/td&gt;
&lt;td&gt;The gamer — with a searchable, filterable record of their entire library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The global game catalogue&lt;/td&gt;
&lt;td&gt;Game metadata: title, genre, description, cover image&lt;/td&gt;
&lt;td&gt;Django admin / seed scripts → Game model&lt;/td&gt;
&lt;td&gt;A browsable catalogue of all games the system knows about&lt;/td&gt;
&lt;td&gt;All users — browsing before adding to their vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External Linux server (Episodes 5–8)&lt;/td&gt;
&lt;td&gt;XML files containing game catalogue updates or vault exports&lt;/td&gt;
&lt;td&gt;Django backend ↔ Linux server via HTTP/HTTPS/mTLS&lt;/td&gt;
&lt;td&gt;Synchronised data; audit trail; identity-verified exchange&lt;/td&gt;
&lt;td&gt;Enterprise operators, partner systems, compliance teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Gamer Metaphor: Your Stack as Your Library 🗂️
&lt;/h2&gt;

&lt;p&gt;The metaphor is exact, not decorative.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Game library world&lt;/th&gt;
&lt;th&gt;Djangular stack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your game Vault (personal collection)&lt;/td&gt;
&lt;td&gt;PostgreSQL + Django &lt;code&gt;UserGame&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The global catalogue you browse&lt;/td&gt;
&lt;td&gt;DRF read-only &lt;code&gt;Game&lt;/code&gt; and &lt;code&gt;Genre&lt;/code&gt; endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding a game to your Vault&lt;/td&gt;
&lt;td&gt;Authenticated POST to &lt;code&gt;UserGame&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your status badge (Playing/Finished/Planned)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;status&lt;/code&gt; field — string enum on &lt;code&gt;UserGame&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your review and score out of ten&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Review&lt;/code&gt; model — one per user per game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Genre filter on the shelf&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;django-filter&lt;/code&gt; + DRF &lt;code&gt;FilterBackend&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your login / session token&lt;/td&gt;
&lt;td&gt;JWT via &lt;code&gt;djangorestframework-simplejwt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular loading your shelf on login&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;HttpClient&lt;/code&gt; → DRF API → component binding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exporting saves to a remote server&lt;/td&gt;
&lt;td&gt;Django &lt;code&gt;requests.post()&lt;/code&gt; with XML payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encrypting the connection to the server&lt;/td&gt;
&lt;td&gt;TLS — self-signed cert, &lt;code&gt;verify=ca.crt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both sides proving who they are&lt;/td&gt;
&lt;td&gt;mTLS — mutual certificate handshake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The key factory that issues all certs&lt;/td&gt;
&lt;td&gt;PKI — Root CA + Intermediate CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The guild’s member identity check&lt;/td&gt;
&lt;td&gt;SailPoint IAM — verifying server requester&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A banned player’s membership card&lt;/td&gt;
&lt;td&gt;Revoked certificate — CRL or OCSP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Project Structure 🗂️
&lt;/h2&gt;

&lt;p&gt;Based on the GameLib repository at &lt;a href="https://github.com/software-journey/djangular" rel="noopener noreferrer"&gt;github.com/software-journey/djangular&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;djangular/
├── backend/                    ← Django project
│   ├── manage.py
│   ├── gamelib/                ← Django settings/urls/wsgi
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── games/                  ← Django app: catalogue
│   │   ├── models.py           ← Game, Genre
│   │   ├── serializers.py
│   │   ├── views.py
│   │   └── urls.py
│   ├── vault/                  ← Django app: personal library
│   │   ├── models.py           ← UserGame, Review
│   │   ├── serializers.py
│   │   ├── views.py
│   │   └── urls.py
│   ├── users/                  ← Django app: auth
│   │   ├── models.py           ← Custom User
│   │   ├── serializers.py
│   │   └── views.py
│   ├── xml_bridge/             ← Django app: XML exchange (Ep.5–7)
│   │   ├── client.py           ← HTTP/HTTPS/mTLS requests
│   │   ├── serializers.py      ← lxml XML serialisation
│   │   └── views.py
│   └── requirements.txt
│
└── frontend/gamelib/           ← Angular project
    ├── src/
    │   ├── app/
    │   │   ├── core/           ← AuthService, JwtInterceptor, Guards
    │   │   ├── features/
    │   │   │   ├── catalogue/  ← Browse games, genre filter
    │   │   │   ├── vault/      ← Your library, status, reviews
    │   │   │   └── auth/       ← Login, register
    │   │   └── shared/         ← Components, pipes, models
    │   └── environments/
    └── angular.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Series Map: Nine Episodes 🗺️
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Gamer concept&lt;/th&gt;
&lt;th&gt;Technical concept&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;This one&lt;/em&gt; — Welcome to the Vault&lt;/td&gt;
&lt;td&gt;The backlog problem&lt;/td&gt;
&lt;td&gt;Architecture overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Building the Game Catalogue&lt;/td&gt;
&lt;td&gt;Designing the Vault&lt;/td&gt;
&lt;td&gt;Django models, DRF serializers, viewsets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Your Login Token&lt;/td&gt;
&lt;td&gt;The guild membership card&lt;/td&gt;
&lt;td&gt;JWT auth, simplejwt, Angular interceptor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Loading Your Shelf&lt;/td&gt;
&lt;td&gt;The front of the Vault&lt;/td&gt;
&lt;td&gt;Angular components, services, routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Save Data Over the Wire&lt;/td&gt;
&lt;td&gt;Syncing to a remote server&lt;/td&gt;
&lt;td&gt;XML POST/GET to Linux server, HTTP toggle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Encrypting the Channel&lt;/td&gt;
&lt;td&gt;Locking the save file&lt;/td&gt;
&lt;td&gt;TLS, self-signed certs, &lt;code&gt;requests&lt;/code&gt; verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Both Sides of the Lock&lt;/td&gt;
&lt;td&gt;Proving who you are&lt;/td&gt;
&lt;td&gt;mTLS, client cert generation, full handshake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;The Guild Registry&lt;/td&gt;
&lt;td&gt;The guildmaster’s identity check&lt;/td&gt;
&lt;td&gt;SailPoint IAM, SCIM 2.0, access verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;The Key Factory&lt;/td&gt;
&lt;td&gt;Where all locks are made&lt;/td&gt;
&lt;td&gt;PKI management, &lt;code&gt;django-ca&lt;/code&gt;, CRL, OCSP, rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Technology Stack Cheat Sheet 📋
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.12+&lt;/li&gt;
&lt;li&gt;Django 5.x + Django REST Framework 3.15+&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;djangorestframework-simplejwt&lt;/code&gt; — JWT auth&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;django-filter&lt;/code&gt; — queryset filtering&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;django-cors-headers&lt;/code&gt; — CORS for Angular dev server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;psycopg2-binary&lt;/code&gt; — PostgreSQL adapter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt; — HTTP client for XML exchange&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lxml&lt;/code&gt; — XML serialisation / deserialisation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cryptography&lt;/code&gt; / OpenSSL — TLS / mTLS cert handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;django-ca&lt;/code&gt; — PKI certificate authority management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular 17+ with standalone components&lt;/li&gt;
&lt;li&gt;TypeScript 5+&lt;/li&gt;
&lt;li&gt;Angular &lt;code&gt;HttpClient&lt;/code&gt; + &lt;code&gt;HttpInterceptor&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Angular Router with route guards&lt;/li&gt;
&lt;li&gt;RxJS for reactive state&lt;/li&gt;
&lt;li&gt;Angular Material (optional) or TailwindCSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL 16+&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;External Linux server:&lt;/strong&gt; Nginx (TLS termination) + custom XML endpoint&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IAM:&lt;/strong&gt; SailPoint IdentityIQ or IdentityNow (SCIM 2.0 API)&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick-Start: Running GameLib Locally 🚀
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repo&lt;/span&gt;
git clone https://github.com/Elsa-Yanke/web-dev-project-2026.git
&lt;span class="nb"&gt;cd &lt;/span&gt;web-dev-project-2026

&lt;span class="c"&gt;# Backend setup&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate          &lt;span class="c"&gt;# Windows: venv\Scripts\activate&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Create PostgreSQL database&lt;/span&gt;
createdb gamelib_db               &lt;span class="c"&gt;# or use pgAdmin&lt;/span&gt;

&lt;span class="c"&gt;# Configure environment&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env              &lt;span class="c"&gt;# fill in DB credentials, SECRET_KEY&lt;/span&gt;
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

&lt;span class="c"&gt;# Frontend setup (new terminal)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend/gamelib
npm &lt;span class="nb"&gt;install
&lt;/span&gt;ng serve                          &lt;span class="c"&gt;# http://localhost:4200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;strong&gt;Episode 2&lt;/strong&gt;, we open the database and build the models: Game, Genre, UserGame, Review. The Vault takes shape.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔗 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GameLib repository&lt;/strong&gt;: &lt;a href="https://github.com/software-journey/djangular" rel="noopener noreferrer"&gt;github.com/software-journey/djangular&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Django REST Framework&lt;/strong&gt;: &lt;a href="https://www.django-rest-framework.org" rel="noopener noreferrer"&gt;django-rest-framework.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular&lt;/strong&gt;: &lt;a href="https://angular.dev" rel="noopener noreferrer"&gt;angular.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;djangorestframework-simplejwt&lt;/strong&gt;: &lt;a href="https://django-rest-framework-simplejwt.readthedocs.io" rel="noopener noreferrer"&gt;django-rest-framework-simplejwt.readthedocs.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;🎮 Game on Djangular Series is a series about building GameLib — a full-stack game library tracker — with Django REST Framework and Angular, extended with XML exchange, TLS/mTLS, SailPoint IAM, and PKI management.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>angular</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.8</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:38 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep8-20d2</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep8-20d2</guid>
      <description>&lt;h1&gt;
  
  
  The Gifts Are Under the Tree — From Spec to Merged PR 🎄
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every year, on the morning of December 25th, I allow myself one quiet moment before the sleigh is unpacked and the Thank-You Letters start arriving. I sit in the empty Workshop, still warm from the night’s work, and look at the bare shelves where the gifts used to be. They are gone because they were delivered. Every one of them. On time, as specified, to the right address. That moment — that quiet confirmation that everything worked — is what we have been building towards in this entire series. Today, we deliver.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Complete Picture
&lt;/h2&gt;

&lt;p&gt;Over the past seven episodes, we have assembled all the pieces of the Intent workshop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Episode 1&lt;/strong&gt;: The Workshop and what Intent is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 2&lt;/strong&gt;: The Living Spec — the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 3&lt;/strong&gt;: Santa the Coordinator and the Specialist Elves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 4&lt;/strong&gt;: Isolated workspaces and resumable sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 5&lt;/strong&gt;: Spec-Driven Development and finishing on time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 6&lt;/strong&gt;: The Context Engine — the Workshop Library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 7&lt;/strong&gt;: Multi-agent orchestration in waves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we put them all together and walk through a complete Intent session, from the moment Head Elf Pepper opens the application to the moment the pull request is merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Add a real-time gift delivery progress dashboard to the North Pole’s internal web application. The dashboard should show live sleigh position, remaining delivery count, and an estimated completion time. It must work on tablets and update every 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the existing Reindeer GPS API (v2)&lt;/li&gt;
&lt;li&gt;No changes to the Delivery Manifest microservice&lt;/li&gt;
&lt;li&gt;Safari / iPad compatible&lt;/li&gt;
&lt;li&gt;Must pass existing end-to-end test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Open Intent and Set the Goal
&lt;/h2&gt;

&lt;p&gt;Pepper opens Intent on her MacBook. She types into the Coordinator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We need a real-time gift delivery dashboard. Show sleigh position
on a map, remaining delivery count, and estimated completion time.
Updates every 30 seconds. Must work on iPad Safari.
Use Reindeer GPS API v2. No changes to Delivery Manifest Service.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator reads this prompt alongside the Context Engine’s analysis of the codebase. It knows the existing frontend stack (React, TypeScript), the API patterns used elsewhere in the project, and the existing test suite structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Coordinator Drafts the Living Spec
&lt;/h2&gt;

&lt;p&gt;Within seconds, the Coordinator produces:&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;## Gift Delivery Dashboard — Living Spec&lt;/span&gt;

&lt;span class="gu"&gt;### Goal&lt;/span&gt;
Real-time dashboard showing sleigh position, delivery count,
and ETA. Updates every 30 seconds. iPad Safari compatible.

&lt;span class="gu"&gt;### Success Criteria&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map renders in &amp;lt; 1s on iPad Safari
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Position updates within 30s of GPS data change
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery count matches Manifest API response
&lt;span class="p"&gt;-&lt;/span&gt; [ ] ETA calculated from current position + remaining stops
&lt;span class="p"&gt;-&lt;/span&gt; [ ] All existing e2e tests pass
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Lighthouse accessibility score ≥ 90

&lt;span class="gu"&gt;### Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Reindeer GPS API v2 (existing auth token pattern)
&lt;span class="p"&gt;-&lt;/span&gt; Delivery Manifest Service: read-only, no new endpoints
&lt;span class="p"&gt;-&lt;/span&gt; Safari / iPad: no Chrome-only APIs

&lt;span class="gu"&gt;### Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New React component: &lt;span class="sb"&gt;`&amp;lt;DeliveryDashboard /&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS polling service (30s interval, exponential backoff on fail)
&lt;span class="p"&gt;-&lt;/span&gt; Map: Leaflet.js (already in dependencies — see package.json)
&lt;span class="p"&gt;-&lt;/span&gt; Offline fallback: show last known position with staleness indicator

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] GPS Polling Service — GPS Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map Component — Map Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery Count &amp;amp; ETA Widget — Data Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Safari/iPad CSS fixes — Responsive Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integration tests — Test Elf (starts after GPS + Map done)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Accessibility audit — A11y Elf (background)

&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
(none yet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reads the spec. She adds one clarification: &lt;em&gt;“ETA should display in local Workshop time, not UTC.”&lt;/em&gt; The Coordinator updates the spec and records the decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review time: 4 minutes. No code written yet. One important decision already captured.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Intent Creates Isolated Workspaces
&lt;/h2&gt;

&lt;p&gt;The Coordinator identifies the dependency graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPS Elf and Map Elf can start in parallel immediately.&lt;/li&gt;
&lt;li&gt;Data Elf can start immediately (it only reads from the Manifest API).&lt;/li&gt;
&lt;li&gt;Responsive Elf can start once Map Elf has a working component.&lt;/li&gt;
&lt;li&gt;Test Elf starts after GPS Elf and Map Elf complete.&lt;/li&gt;
&lt;li&gt;A11y Elf runs as a background agent throughout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intent creates five Git worktrees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat/dashboard-gps-service        ← GPS Elf
feat/dashboard-map-component      ← Map Elf
feat/dashboard-data-widgets       ← Data Elf
feat/dashboard-responsive         ← Responsive Elf (waiting)
feat/dashboard-tests              ← Test Elf (waiting)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wave 1 agents — GPS Elf, Map Elf, Data Elf — start simultaneously. The A11y Elf begins in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Wave 1 Runs
&lt;/h2&gt;

&lt;p&gt;Pepper watches the Intent window. Three agent conversations are active. Code appears in the Changes panel. The spec’s task list updates as work progresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPS Elf&lt;/strong&gt; implements the polling service, using the existing auth token pattern it found via the Context Engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// gps-polling.service.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GpsPollingService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;startPolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SleighPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reindeerGpsApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The spec updates: ✅ GPS Polling Service — GPS Elf — done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map Elf&lt;/strong&gt; creates the &lt;code&gt;&amp;lt;DeliveryMap /&amp;gt;&lt;/code&gt; component using Leaflet.js, which it found already installed in &lt;code&gt;package.json&lt;/code&gt; via the Context Engine. It does not install a duplicate library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Elf&lt;/strong&gt; builds the delivery count and ETA widget, correctly calling the Manifest API’s read-only endpoint and displaying ETA in Workshop local time (it read the spec decision).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Handoffs and Wave 2
&lt;/h2&gt;

&lt;p&gt;Both GPS Elf and Map Elf report completion. The spec records the interfaces they produced:&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; GPS service exposes: &lt;span class="sb"&gt;`startPolling(cb: (SleighPosition) =&amp;gt; void)`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Map component props: &lt;span class="sb"&gt;`{ position: SleighPosition; zoom?: number }`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator briefs Responsive Elf with the updated spec and the actual component structure. No guesswork. Test Elf receives both the GPS service interface and the Map component props, plus the existing e2e test patterns from the Context Engine.&lt;/p&gt;

&lt;p&gt;Wave 2 begins. Responsive Elf adds Safari/iPad CSS. Test Elf writes integration tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The Verifier Checks Everything
&lt;/h2&gt;

&lt;p&gt;Wave 2 complete. The Coordinator spawns the Verifier Elf with the full spec and all five implementations.&lt;/p&gt;

&lt;p&gt;Verifier’s report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Map renders in &amp;lt; 1s on iPad Safari — confirmed (Lighthouse: 0.7s)
✅ Position updates within 30s — confirmed
✅ Delivery count matches Manifest API — confirmed
✅ ETA in Workshop local time — confirmed
✅ Existing e2e tests pass — confirmed
✅ Lighthouse accessibility score ≥ 90 — confirmed (score: 94)
⚠️  Minor: GPS service does not log polling errors to existing
    structured logger (see logger.ts — used throughout codebase)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The warning is real and useful. The Context Engine told the Verifier about &lt;code&gt;logger.ts&lt;/code&gt;. A generic agent would have missed it.&lt;/p&gt;

&lt;p&gt;The Coordinator sends the GPS Elf back for a five-minute fix. It adds one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GPS polling failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Re-verification: all green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: The Pull Request
&lt;/h2&gt;

&lt;p&gt;The Coordinator integrates all five worktrees into a single branch &lt;code&gt;feat/delivery-dashboard&lt;/code&gt; and opens a pull request. The PR description is generated from the Living Spec:&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;## Gift Delivery Dashboard&lt;/span&gt;

Implements real-time dashboard (sleigh position, delivery count, ETA).

&lt;span class="gu"&gt;### Changes&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`GpsPollingService`&lt;/span&gt; with 30s polling + exponential backoff
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryMap /&amp;gt;`&lt;/span&gt; using existing Leaflet.js dependency
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryStats /&amp;gt;`&lt;/span&gt; widget with ETA in Workshop local time
&lt;span class="p"&gt;-&lt;/span&gt; New: iPad/Safari responsive CSS
&lt;span class="p"&gt;-&lt;/span&gt; New: Integration test suite (12 tests, all passing)

&lt;span class="gu"&gt;### Verified Against Spec&lt;/span&gt;
All 6 success criteria confirmed by Verifier Agent.
Existing e2e suite: all passing.

&lt;span class="gu"&gt;### Decisions Recorded&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; ETA displayed in Workshop local time (not UTC) — per Pepper, Dec 3
&lt;span class="p"&gt;-&lt;/span&gt; Used existing Leaflet.js (not installed new mapping library)
&lt;span class="p"&gt;-&lt;/span&gt; GPS errors logged via existing structured logger (logger.ts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reviews the spec (4 minutes). She reviews the diff (10 minutes, because the spec told her exactly what to look for). She approves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total elapsed time: 47 minutes. Zero rework. Christmas safe.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built Together
&lt;/h2&gt;

&lt;p&gt;Over this series, Father Christmas and Head Elf Pepper have explained every layer of Intent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Workshop Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Living Spec&lt;/td&gt;
&lt;td&gt;Source of truth, auto-updated&lt;/td&gt;
&lt;td&gt;Master Gift List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinator Agent&lt;/td&gt;
&lt;td&gt;Plans, delegates, manages handoffs&lt;/td&gt;
&lt;td&gt;Father Christmas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specialist Agents&lt;/td&gt;
&lt;td&gt;Execute focused tasks in parallel&lt;/td&gt;
&lt;td&gt;Craft Elves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolated Workspaces&lt;/td&gt;
&lt;td&gt;No collisions between parallel agents&lt;/td&gt;
&lt;td&gt;Private workbenches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec-Driven Development&lt;/td&gt;
&lt;td&gt;Plan first, code follows&lt;/td&gt;
&lt;td&gt;Write the List before carving begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Engine&lt;/td&gt;
&lt;td&gt;Deep codebase knowledge for every agent&lt;/td&gt;
&lt;td&gt;The Workshop Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Agent Orchestration&lt;/td&gt;
&lt;td&gt;Waves, handoffs, background agents&lt;/td&gt;
&lt;td&gt;Workshop floor choreography&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resumable Sessions&lt;/td&gt;
&lt;td&gt;State preserved across restarts&lt;/td&gt;
&lt;td&gt;Workshop never forgets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: The Complete Intent Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer, Coordinator, Specialists, Context Engine, AI models&lt;/td&gt;
&lt;td&gt;Goal statement, codebase, constraints, model selection&lt;/td&gt;
&lt;td&gt;Spec → Review → Wave 1 agents → Handoffs → Wave 2 → Verifier → PR&lt;/td&gt;
&lt;td&gt;Verified code, living spec, decision log, merged PR&lt;/td&gt;
&lt;td&gt;Engineering team, product owner, CI/CD, end users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Pepper, Father Christmas, all Elves, the Library&lt;/td&gt;
&lt;td&gt;Gift order, Workshop constraints, quality standards&lt;/td&gt;
&lt;td&gt;Write List → Agree → Parallel building → Handoffs → QC → Sleigh&lt;/td&gt;
&lt;td&gt;All gifts delivered correctly, on time, to every child&lt;/td&gt;
&lt;td&gt;Children of the world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Intent is available in &lt;strong&gt;public beta for macOS&lt;/strong&gt;. &lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;Download it here&lt;/a&gt;. It uses your existing Augment credits. You can also bring Claude Code, Codex, or OpenCode if you already have subscriptions.&lt;/p&gt;

&lt;p&gt;Augment’s documentation is at &lt;a href="https://docs.augmentcode.com" rel="noopener noreferrer"&gt;docs.augmentcode.com&lt;/a&gt;. Their manifesto — &lt;em&gt;The End of Linear Work&lt;/em&gt; — is worth reading before your first session.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Final Word from Father Christmas
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I have been doing this for over a thousand years. Every century, the tools improve. The quill gave way to the telegraph, the telegraph to the computer, and now the computer gives way to the agent. But the fundamental challenge has never changed: how do you coordinate complex, parallel work towards a shared goal, on an unmovable deadline, without chaos?The answer, in 1025 and in 2025, is the same: a clear plan, a good team, and the discipline to keep the plan honest.Augment Intent is the first software I have encountered that truly understands this. It puts the plan first. It keeps the plan honest. It coordinates the team without the Elves colliding. And it finishes on time.I am proud of everything we have built in this Workshop. I hope you will build something wonderful in yours.Merry Christmas, and Happy Coding.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This concludes the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. All eight episodes are available on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for reading. May your specs be living and your merges be clean.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>devworkflow</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.6</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:32 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep6-5g3e</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep6-5g3e</guid>
      <description>&lt;h1&gt;
  
  
  The Workshop Knows Every Toy — The Context Engine 🧠
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;People often ask: how do the Elves know how to build anything? We do not run a formal university. There is no Elf Academy. The answer is the Workshop Library — a living collection of every toy blueprint, every material data sheet, every technique manual, and every lesson learned from every Christmas since 843 AD. When an Elf sits down at their workbench, they are not starting from scratch. They are standing on twelve centuries of accumulated knowledge. Augment calls their version of this the Context Engine. I call it essential.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem Every AI Tool Has
&lt;/h2&gt;

&lt;p&gt;Most AI coding tools share one fundamental limitation: they know a great deal about programming in general, and almost nothing about &lt;strong&gt;your&lt;/strong&gt; codebase in particular.&lt;/p&gt;

&lt;p&gt;Ask a generic AI assistant to add a feature to your application and it will produce something that compiles — but may ignore your naming conventions, duplicate utilities you already have, conflict with an architecture decision made six months ago, or violate a security pattern your team spent weeks establishing.&lt;/p&gt;

&lt;p&gt;The AI does not know what it does not know. And what it does not know is everything specific to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Context Engine Does
&lt;/h2&gt;

&lt;p&gt;Augment’s Context Engine solves this by maintaining a &lt;strong&gt;live, semantic understanding of your entire stack&lt;/strong&gt; — not just the files you have open, but everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;: every file, class, function, interface across the whole repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: the libraries you use and how you use them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: inline comments, READMEs, architecture docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style&lt;/strong&gt;: your naming conventions, code patterns, formatting preferences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent changes&lt;/strong&gt;: what has changed, when, and why (from commit messages and PRs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues&lt;/strong&gt;: open tickets and known problems in the tracker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Context Engine does not just store this as flat text. It builds &lt;strong&gt;semantic understanding&lt;/strong&gt; — it knows that &lt;code&gt;UserAuthService&lt;/code&gt; depends on &lt;code&gt;TokenRepository&lt;/code&gt;, that the codebase uses dependency injection everywhere, that the team agreed six weeks ago to use RS256 for all signing operations.&lt;/p&gt;

&lt;p&gt;When a Specialist Agent is spawned in Intent, it does not receive a raw dump of your entire codebase (which would exceed any model’s context window). The Context Engine &lt;strong&gt;curates&lt;/strong&gt; the relevant context: from 4,456 potential sources, it selects the 682 actually relevant to this task. The Elf gets the right blueprints for the toy it is building, not the entire library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The North Pole Library Analogy
&lt;/h2&gt;

&lt;p&gt;Imagine your Workshop contains twelve centuries of toy designs. Before the Context Engine, an Elf would walk to the Library, spend an hour searching, find three relevant blueprints, and guess at the rest. Slow, incomplete, error-prone.&lt;/p&gt;

&lt;p&gt;With the Context Engine, the Library is &lt;strong&gt;live and intelligent&lt;/strong&gt;. The moment an Elf is assigned to build a toy locomotive, the Library automatically surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every locomotive built in the past ten years (with the code patterns used).&lt;/li&gt;
&lt;li&gt;The wheel standard the Workshop adopted in 2019.&lt;/li&gt;
&lt;li&gt;The paint specification that applies to all wheeled toys.&lt;/li&gt;
&lt;li&gt;The safety test that all vehicles must pass.&lt;/li&gt;
&lt;li&gt;The in-progress work by the Gauge Elf that this locomotive’s tracks must match.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Elf starts with full situational awareness. It will not accidentally use the old wheel standard. It will not duplicate the paint specification utility someone wrote three years ago. It will not create a track gauge that conflicts with the in-progress work next door.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Multi-Agent Work
&lt;/h2&gt;

&lt;p&gt;In single-agent workflows, limited context is an inconvenience. The agent produces slightly generic code that needs tidying.&lt;/p&gt;

&lt;p&gt;In multi-agent workflows, limited context is a &lt;strong&gt;coordination failure&lt;/strong&gt;. If Agent A does not know that Agent B is using RS256 signing, Agent A might implement its own signing with a different algorithm. The Verifier will catch this — but only after both agents have done significant work that now needs to be reconciled.&lt;/p&gt;

&lt;p&gt;The Context Engine prevents this by ensuring &lt;strong&gt;all agents share the same understanding&lt;/strong&gt; of the codebase from the start. When the Coordinator drafts the spec, it can declare &lt;em&gt;“use RS256 for signing — see existing pattern in *&lt;code&gt;auth/signing.ts&lt;/code&gt;&lt;/em&gt;”* because it has that knowledge available. Every Specialist that reads the spec inherits that context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Engine vs Vanilla Models: The Numbers
&lt;/h2&gt;

&lt;p&gt;Augment published benchmarks comparing agent performance on the Elasticsearch repository (3.6 million lines of Java, 2,187 contributors). Their agents — powered by the Context Engine — outperformed other tools on a blind evaluation of 500 agent-generated pull requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Augment&lt;/th&gt;
&lt;th&gt;Others&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Outperforms&lt;/td&gt;
&lt;td&gt;Underperforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;+14.8&lt;/td&gt;
&lt;td&gt;-9 to -12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Reuse&lt;/td&gt;
&lt;td&gt;Notable&lt;/td&gt;
&lt;td&gt;Below baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Practice adherence&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Weakest area&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The largest gap was in &lt;strong&gt;code reuse&lt;/strong&gt; and &lt;strong&gt;best practice adherence&lt;/strong&gt; — exactly the dimensions where knowing the codebase matters most. Any model can write code that compiles. Knowing when to reuse an existing utility instead of writing a new one requires context.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Context Engine Feeds Intent Specifically
&lt;/h2&gt;

&lt;p&gt;Inside Intent, the Context Engine serves three distinct consumers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Coordinator&lt;/strong&gt; uses it to write a better spec. When it knows the existing architecture, it can propose task decompositions that respect real dependencies rather than imagined ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Specialists&lt;/strong&gt; use it to write better code. They know the patterns, the utilities, the interfaces they must respect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Verifier&lt;/strong&gt; uses it to catch spec violations that are only visible with codebase knowledge. “This code bypasses the existing rate-limiting middleware” is only a useful comment if the Verifier knows that middleware exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: Context Engine in Action
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Repository, CI/CD history, docs, issues, recent changes&lt;/td&gt;
&lt;td&gt;Raw codebase files, dependency manifests, commit history, tickets&lt;/td&gt;
&lt;td&gt;Index → Semantic analysis → Relevance ranking → Context curation per task&lt;/td&gt;
&lt;td&gt;Curated, task-relevant context for each agent&lt;/td&gt;
&lt;td&gt;Coordinator Agent, all Specialist Agents, Verifier Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;The Workshop Library (12 centuries of blueprints)&lt;/td&gt;
&lt;td&gt;Every toy design, material spec, historical decisions&lt;/td&gt;
&lt;td&gt;Library catalogues → Semantic search → Relevant blueprints selected per Elf&lt;/td&gt;
&lt;td&gt;Exactly the right materials and references for each workbench&lt;/td&gt;
&lt;td&gt;Every Elf, Father Christmas, Quality Control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A Note on Privacy
&lt;/h2&gt;

&lt;p&gt;Father Christmas takes privacy seriously. So does Augment. The Context Engine processes your codebase to build its index, and Augment’s &lt;a href="https://trust.augmentcode.com" rel="noopener noreferrer"&gt;Trust Center&lt;/a&gt; documents how data is handled. For enterprise teams with sensitive codebases, it is worth reviewing before you hand the Library over to the Engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;In Episode 7, we bring everything together: multiple Elves, working simultaneously, without chaos. &lt;strong&gt;Multi-Agent Orchestration&lt;/strong&gt; — the art of running a parallel workshop without collision, confusion, or Christmas catastrophe.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An Elf without context is an Elf making expensive guesses. Give them the Library. Give them the Context Engine. Watch them build miracles.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>contextengine</category>
      <category>ai</category>
    </item>
    <item>
      <title>Luxo Jr. ThingsBoard 🎬 Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:13 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/luxo-jr-thingsboard-ep1-1co5</link>
      <guid>https://forem.com/the-software-s-journey/luxo-jr-thingsboard-ep1-1co5</guid>
      <description>&lt;h2&gt;
  
  
  Episode 1: The Prop That Came Alive
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The question is not whether a lamp can have a personality. The question is whether you are willing to do the work to give it one.”&lt;/em&gt;&lt;br&gt;
— paraphrasing John Lasseter, very liberally&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A Desk Lamp That Changed Everything 💡
&lt;/h2&gt;

&lt;p&gt;In 1986, John Lasseter had a real Luxo brand desk lamp on his drawing table. He had been using it as a rendering model — studying how light fell on its surfaces, how its joints articulated. It was a prop. An inert object. A piece of hardware.&lt;/p&gt;

&lt;p&gt;Then he gave it joints. He gave it movement. He gave it &lt;em&gt;reaction&lt;/em&gt; — a curious tilt of the head when the ball rolled by, a deflated slump when the ball burst, an instant excited pivot when something bigger and bouncier appeared. He gave it a story.&lt;/p&gt;

&lt;p&gt;Within two minutes of film, the audience at SIGGRAPH 1986 was on its feet screaming. Not because the lamp was technically impressive — though it was. Because they had forgotten it was a lamp. It had become, impossibly, &lt;em&gt;something alive&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is the precise ambition of the IoT platform &lt;strong&gt;ThingsBoard&lt;/strong&gt;: to take your physical hardware — sensors, actuators, meters, controllers — and give them the equivalent of Lasseter’s joints. Telemetry. Attributes. Dashboards. Rules. Relationships. Commands. To animate the inert thing and turn it into something you can watch, understand, and direct.&lt;/p&gt;

&lt;p&gt;In this series, we build stage props. We give them personality. By Episode 8, they will perform.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂️ SIPOC — The Stage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Suppliers&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Inputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Process&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Customers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Physical devices (sensors, actuators, meters)&lt;/td&gt;
&lt;td&gt;Raw telemetry data: temperature, humidity, power, position&lt;/td&gt;
&lt;td&gt;ThingsBoard: ingest, store, visualise, process, alert&lt;/td&gt;
&lt;td&gt;Live dashboards, alarm notifications, RPC commands, analytics&lt;/td&gt;
&lt;td&gt;Operators, homeowners, engineers, stakeholders — anyone who needs to &lt;em&gt;see and act on&lt;/em&gt; what devices are doing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home Assistant (Ep.7)&lt;/td&gt;
&lt;td&gt;Entity states and sensor readings via MQTT&lt;/td&gt;
&lt;td&gt;MQTT bridge: HA → ThingsBoard for enterprise-scale visualisation&lt;/td&gt;
&lt;td&gt;Enterprise dashboard showing all HA devices alongside industrial sensors&lt;/td&gt;
&lt;td&gt;IT/OT teams bridging consumer smart home with professional IoT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ThingsBoard AI Solution Creator (Ep.6)&lt;/td&gt;
&lt;td&gt;A plain-language description of your use case&lt;/td&gt;
&lt;td&gt;AI agent: generates entity profiles, dashboards, alarm rules, roles&lt;/td&gt;
&lt;td&gt;A working prototype of your IoT solution in under 10 minutes&lt;/td&gt;
&lt;td&gt;System integrators, explorers, business stakeholders doing PoC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Stage Props Metaphor 🎭
&lt;/h2&gt;

&lt;p&gt;Every stage production has &lt;strong&gt;props&lt;/strong&gt; — the physical objects on stage that the cast interacts with: lamps, chairs, telephones, clocks. A prop sitting in the prop house is inert. It has physical properties (weight, colour, shape) but no story, no behaviour, no relationship to anything else.&lt;/p&gt;

&lt;p&gt;Bring the prop onto the stage and give it context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;position&lt;/strong&gt; (where on the stage it sits)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;character&lt;/strong&gt; (what role it plays in the story)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joints&lt;/strong&gt; (how it can move and change)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cues&lt;/strong&gt; (when it does something — the lamp flickers when the villain enters)&lt;/li&gt;
&lt;li&gt;A place on the &lt;strong&gt;prompt book&lt;/strong&gt; (the director’s master view of the whole production)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly what ThingsBoard does to a physical sensor or actuator:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage props world&lt;/th&gt;
&lt;th&gt;ThingsBoard world&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;An inert prop in the prop house&lt;/td&gt;
&lt;td&gt;A sensor with no platform — just hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giving the prop joints &amp;amp; articulation&lt;/td&gt;
&lt;td&gt;Registering a &lt;strong&gt;Device&lt;/strong&gt; with a &lt;strong&gt;Device Profile&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The prop’s observable state&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Telemetry&lt;/strong&gt; — timestamped key-value data the device sends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The prop’s fixed characteristics&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Attributes&lt;/strong&gt; — static properties (location, model number, threshold)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grouping props on the same set&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Assets&lt;/strong&gt; — logical containers (rooms, floors, buildings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The director’s prompt book&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;Dashboard&lt;/strong&gt; — master view of the whole production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A lighting cue (“if lamp &amp;gt; 50°C → warn director”)&lt;/td&gt;
&lt;td&gt;An &lt;strong&gt;Alarm Rule&lt;/strong&gt; — automated trigger on telemetry threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The director calling “Action!”&lt;/td&gt;
&lt;td&gt;An &lt;strong&gt;RPC command&lt;/strong&gt; — instructing a device to do something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Pixar logo animation&lt;/td&gt;
&lt;td&gt;Your finished, running, production-grade IoT solution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Luxo Jr. had one prop — a desk lamp — and gave it so much personality that it became a mascot seen before every Pixar film for forty years. You have sensors, meters, and controllers. ThingsBoard gives them the same treatment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What ThingsBoard Actually Is 🏗️
&lt;/h2&gt;

&lt;p&gt;ThingsBoard is an &lt;strong&gt;open-source IoT platform&lt;/strong&gt; for data collection, processing, visualisation, and device management. It is production-grade: companies use it to manage tens of thousands of devices across smart energy, fleet tracking, agriculture, smart buildings, and industrial automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The key capabilities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Device connectivity&lt;/strong&gt; — ThingsBoard speaks MQTT, HTTP, CoAP, LwM2M, and more. Any device that can transmit data via one of these protocols can connect. If it cannot, the ThingsBoard IoT Gateway (Python, open-source) acts as a translator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telemetry and attributes&lt;/strong&gt; — Every data point a device sends is stored as a timestamped key-value pair. Device metadata (location, firmware version, thresholds) is stored as attributes — permanent properties rather than time-series values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboards and widgets&lt;/strong&gt; — A rich, configurable UI for visualising your data: time-series charts, gauges, maps, alarm tables, entity lists, and custom widgets. Dashboards are built by wiring widgets to device telemetry and attributes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule Engine&lt;/strong&gt; — A visual, flow-based processing system. Incoming messages pass through chains of nodes that filter, transform, and react. An alarm fires. An email sends. A command goes back to the device. A Kafka message is published.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entity model&lt;/strong&gt; — Devices, Assets, Customers, Users, and more — all connected via typed relations. A building contains floors, which contain rooms, which contain devices. The hierarchy is modelled explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alarms&lt;/strong&gt; — When telemetry crosses a threshold, ThingsBoard creates an alarm, propagates it up the entity hierarchy, and notifies the appropriate users via the Notification Centre.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which edition?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Edition&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community Edition (CE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted, learning, open-source projects&lt;/td&gt;
&lt;td&gt;Free (Apache 2.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Professional Edition (PE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise features: platform integrations, entity groups, white-labelling&lt;/td&gt;
&lt;td&gt;Commercial licence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero-setup SaaS — US or EU regions&lt;/td&gt;
&lt;td&gt;Free tier + paid plans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For this series, everything works on Community Edition and Cloud. Where PE-specific features appear, they are labelled.&lt;/p&gt;




&lt;h2&gt;
  
  
  ThingsBoard and Home Assistant: Two Stages, One Show 🏠
&lt;/h2&gt;

&lt;p&gt;Home Assistant (HA) is your &lt;em&gt;personal&lt;/em&gt; stage — the smart home controller that knows Rianne’s heating schedule, whether Beau and Elvis are in the garden, and which lights to turn off at bedtime.&lt;/p&gt;

&lt;p&gt;ThingsBoard is the &lt;em&gt;enterprise&lt;/em&gt; stage — built for industrial-scale telemetry, multi-tenant isolation, hierarchical entity models, and professional dashboards.&lt;/p&gt;

&lt;p&gt;They are not competitors. They are collaborators. In Episode 7, we bridge them via MQTT — HA publishes its entity states to ThingsBoard’s MQTT broker. ThingsBoard ingests them as device telemetry, displays them on dashboards alongside other sensors, and applies alarm rules that HA has no native concept of.&lt;/p&gt;

&lt;p&gt;The result: your home’s Luxo Jr. lamp plays alongside industrial-scale equipment on the same stage. The prompt book covers both.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Series Map: Eight Episodes 🎬
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Stage props concept&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;This one&lt;/em&gt; — What ThingsBoard is&lt;/td&gt;
&lt;td&gt;The prop house and the stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Devices, Assets, Profiles, Relations&lt;/td&gt;
&lt;td&gt;Building the set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;MQTT, HTTP, telemetry, attributes&lt;/td&gt;
&lt;td&gt;The prop speaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Dashboards and widgets&lt;/td&gt;
&lt;td&gt;The prompt book&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Rule Engine, alarms, notifications&lt;/td&gt;
&lt;td&gt;The director’s cue sheet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;AI Solution Creator&lt;/td&gt;
&lt;td&gt;Animating the lamp in 10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Home Assistant ↔ ThingsBoard via MQTT&lt;/td&gt;
&lt;td&gt;Two stages, one show&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Production deployment, ThingsBoard Edge, scaling&lt;/td&gt;
&lt;td&gt;The Pixar logo — going live&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The prop house is open. The stage is set. In Episode 2, we build the first set and register our first device.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔗 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard website&lt;/strong&gt;: &lt;a href="https://thingsboard.io" rel="noopener noreferrer"&gt;thingsboard.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard Cloud&lt;/strong&gt; (free tier): &lt;a href="https://thingsboard.io/installations/" rel="noopener noreferrer"&gt;thingsboard.io/installations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard docs&lt;/strong&gt;: &lt;a href="https://thingsboard.io/docs" rel="noopener noreferrer"&gt;thingsboard.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Solution Creator blog post&lt;/strong&gt;: &lt;a href="https://thingsboard.io/blog/ai-solution-creator/" rel="noopener noreferrer"&gt;thingsboard.io/blog/ai-solution-creator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Luxo Jr. (Wikipedia)&lt;/strong&gt;: &lt;a href="https://en.wikipedia.org/wiki/Luxo_Jr._(character)" rel="noopener noreferrer"&gt;en.wikipedia.org/wiki/Luxo_Jr.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;🎬 Stage Props! is a series about ThingsBoard — the IoT platform that gives your devices joints, personality, and behaviour, the way John Lasseter gave Luxo Jr. a soul.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>thingsboard</category>
      <category>beginners</category>
      <category>homeautomation</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.2</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:39:56 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep2-3fac</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep2-3fac</guid>
      <description>&lt;h1&gt;
  
  
  The Master Gift List That Writes Itself 🎄
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every year, on the first of December, I sit at my great oak desk and open the Master Gift List. In the old days, I wrote it once and hoped for the best. By the fifteenth, it bore little resemblance to reality. An Elf had improvised. A supplier had changed a toy’s colour. Three children had written amended letters. The List lied to me — and I only found out on Christmas Eve.No more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem With Static Specifications
&lt;/h2&gt;

&lt;p&gt;In software, as in Christmas, requirements arrive in waves. The product owner changes her mind. The designer refines the mockup. The security review adds three new constraints.&lt;/p&gt;

&lt;p&gt;Traditional specifications — whether a Confluence page, a Notion doc, or a PDF handed over at the start of a sprint — share one fatal flaw: &lt;strong&gt;they are written once and then abandoned&lt;/strong&gt;. The moment the first line of code is committed, the spec begins to drift. By the time you ship, nobody is quite sure what the original intention was.&lt;/p&gt;

&lt;p&gt;Fred Brooks called this “document rot.” Father Christmas calls it “the Lying List,” and it has ruined more Christmas Eves than I care to admit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Living Spec: What Intent Does Differently
&lt;/h2&gt;

&lt;p&gt;In Augment Intent, the specification is not a document you write and forget. It is a &lt;strong&gt;living spec&lt;/strong&gt; — a Markdown file that lives inside your workspace and evolves as work progresses.&lt;/p&gt;

&lt;p&gt;Here is how it works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. You seed the spec.&lt;/strong&gt; Head Elf Pepper (that is you) types a goal into the Coordinator. The Coordinator drafts an initial spec: requirements, architecture decisions, task breakdown, success criteria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The spec is the source of truth.&lt;/strong&gt; Every Specialist Agent receives the spec as its briefing. Not a copy of a chat history. Not a vague summary. The actual, versioned spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. As Elves complete tasks, the spec updates.&lt;/strong&gt; When the Auth Agent finishes the token service, the spec marks that task complete. When the API Agent discovers a complication, the spec records the decision. The spec stays accurate because it is being written by the same agents that are doing the work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. When you change your mind, the update propagates.&lt;/strong&gt; If Pepper changes a constraint mid-flight, the Coordinator updates the spec and re-briefs any Elves whose work is affected. No more Elves building to an outdated design.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Tale of Two Lists
&lt;/h2&gt;

&lt;p&gt;Let me show you the difference in concrete terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Old Way (Static List):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ticket XMAS-1234
Title: Improve gift delivery speed
Description: Make it faster. Children are waiting.
Assigned to: @delivery-elf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ticket is, forgive my language, &lt;strong&gt;useless to an agent&lt;/strong&gt;. What does “faster” mean? Faster than last year? Faster than a competitor? Faster per route, or faster in aggregate? An Elf handed this will make a reasonable guess — and the guess may be entirely wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The New Way (Living Spec):&lt;/strong&gt;&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;## Gift Delivery Optimisation — Living Spec&lt;/span&gt;

&lt;span class="gu"&gt;### Goal&lt;/span&gt;
Reduce average per-route delivery time by 20% vs Christmas 2024.

&lt;span class="gu"&gt;### Success Criteria&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Route calculation completes in &amp;lt; 200ms
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Zero missed deliveries in smoke test (1,000 houses)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Sleigh fuel consumption unchanged or reduced

&lt;span class="gu"&gt;### Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Must work with existing reindeer harness API (v3.2)
&lt;span class="p"&gt;-&lt;/span&gt; No changes to the chimney-descent module (frozen until Jan)

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] Profile current route-calculation bottleneck — Dasher Agent
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Implement A&lt;span class="err"&gt;*&lt;/span&gt; pathfinding — Prancer Agent (in progress)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integration test against 2024 route dataset — Blitzen Agent
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Update delivery manifest schema — Rudolph Agent

&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; 2025-12-03: Chose A&lt;span class="err"&gt;*&lt;/span&gt; over Dijkstra for weighted graph support
&lt;span class="p"&gt;-&lt;/span&gt; 2025-12-05: Excluded Antarctic routes from v1 scope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This spec is &lt;strong&gt;machine-executable&lt;/strong&gt;. Every Elf knows what “done” means. Every constraint is explicit. Every decision is recorded. And when Prancer finishes A*, the spec will tick that box and Blitzen will know it is time to start testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: The Living Spec Process
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer (Head Elf Pepper), Coordinator Agent, Specialist Agents&lt;/td&gt;
&lt;td&gt;Initial goal statement, codebase context, model selection&lt;/td&gt;
&lt;td&gt;Goal → Coordinator drafts spec → Agents execute &amp;amp; update → Spec reflects reality&lt;/td&gt;
&lt;td&gt;Always-accurate living spec, completed task list, decision log&lt;/td&gt;
&lt;td&gt;All Specialist Agents, human reviewers, future contributors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Pepper, Father Christmas, the Elves&lt;/td&gt;
&lt;td&gt;“Deliver all gifts 20% faster”&lt;/td&gt;
&lt;td&gt;Santa writes the List → Elves build → List updates as gifts are wrapped&lt;/td&gt;
&lt;td&gt;A gift list that is always true&lt;/td&gt;
&lt;td&gt;Every Elf, every Quality Inspector, the Head of Logistics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why This Matters for Parallel Work
&lt;/h2&gt;

&lt;p&gt;Here is the key insight. When three Elves work simultaneously on different parts of the toy, each one needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the other two are building.&lt;/li&gt;
&lt;li&gt;Which interfaces they must respect.&lt;/li&gt;
&lt;li&gt;What has already been decided.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without a living spec, each Elf improvises. The train set’s power connector uses a different voltage than the controller the second Elf built. Integration collapses at the last minute.&lt;/p&gt;

&lt;p&gt;With a living spec, those interfaces are declared upfront. When the first Elf changes something, the spec records it, and the second Elf’s briefing updates. &lt;strong&gt;The spec is the coordination mechanism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As Augment’s manifesto puts it: once you are running multiple agents in parallel, the spec stops being process and starts being infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Notes: Writing a Good Spec Seed
&lt;/h2&gt;

&lt;p&gt;Father Christmas has learned, through decades of painful experience, that the quality of the output depends entirely on the quality of the intent put in. Here are my rules for seeding a Living Spec:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Name the goal, not the solution.&lt;/strong&gt; Write &lt;em&gt;“reduce onboarding drop-off by 20%”&lt;/em&gt;, not &lt;em&gt;“add a progress bar to the onboarding screen”&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State the constraints explicitly.&lt;/strong&gt; Frozen modules, existing APIs, budget limits — write them down before any Elf starts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define done.&lt;/strong&gt; A measurable success criterion is worth a hundred vague requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record decisions as they are made.&lt;/strong&gt; An undocumented decision is an ambiguity waiting to cause a merge conflict.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Is Coming Next
&lt;/h2&gt;

&lt;p&gt;In Episode 3, Father Christmas will introduce the most important relationship in the Workshop: &lt;strong&gt;Santa the Coordinator and the Elves as Specialist Agents&lt;/strong&gt;. We will examine who does what, how handoffs work, and why the Verifier Elf might be the most important Elf in the building.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Master Gift List is only as good as the team that follows it. Fortunately, my team is excellent.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>specdriven</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.4</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:39:50 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep4-33ph</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep4-33ph</guid>
      <description>&lt;h1&gt;
  
  
  Every Elf Gets a Workbench — Isolated Workspaces 🔨
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the early Workshop days, all the Elves shared one big table. It seemed efficient. It was a disaster. Jingle would sand a wheel just as Jangle reached for it. Twinkle’s paint would end up on Tinkle’s train set. The great Christmas Collision of 1889 — I do not wish to speak of it. The solution was obvious in retrospect: give every Elf their own workbench. Isolated, private, but connected to the same Master Gift List.Augment Intent does the same thing. It just calls them workspaces.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem With Sharing a Codebase
&lt;/h2&gt;

&lt;p&gt;When multiple agents — or indeed multiple humans — work on the same set of files at the same time, collisions are inevitable. Agent A modifies &lt;code&gt;auth-middleware.ts&lt;/code&gt; at line 47. Agent B modifies the same file at line 52. Neither agent knows the other is there. The merge conflict that results is not a bug in either agent’s reasoning. It is a &lt;strong&gt;coordination failure&lt;/strong&gt; — the absence of isolation.&lt;/p&gt;

&lt;p&gt;Git was designed for humans working mostly in series. A branch is opened, worked on for days or weeks, then merged. The assumption is that the pace of change is human-paced.&lt;/p&gt;

&lt;p&gt;AI agents are not human-paced. They can modify dozens of files in minutes. Under parallel multi-agent execution, the conflict rate rises faster than any team can manage manually.&lt;/p&gt;

&lt;p&gt;Intent solves this with &lt;strong&gt;isolated workspaces backed by Git worktrees&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Git Worktree?
&lt;/h2&gt;

&lt;p&gt;A worktree is a lesser-known Git feature that allows you to check out &lt;strong&gt;multiple branches of the same repository simultaneously&lt;/strong&gt;, each in its own directory. Unlike opening two terminal windows and hoping for the best, worktrees are a first-class Git concept: they share the repository’s object store, so no data is duplicated, but each worktree has its own working tree and index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Classic git workflow (one checkout)&lt;/span&gt;
git checkout feat/jwt-auth
&lt;span class="c"&gt;# ... work, commit, push&lt;/span&gt;

&lt;span class="c"&gt;# Git worktree (multiple simultaneous checkouts)&lt;/span&gt;
git worktree add ../api-gateway-worktree feat/jwt-auth
git worktree add ../auth-service-worktree feat/auth-service
&lt;span class="c"&gt;# Both directories exist simultaneously, sharing one .git object store&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Intent automates all of this. When the Coordinator spawns a Specialist, Intent creates a dedicated worktree for that agent automatically. The Elf gets its own workbench. Other Elves cannot see its in-progress files. The files are isolated until the Elf is done and the Coordinator integrates the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Elf Workbench in Practice
&lt;/h2&gt;

&lt;p&gt;Imagine the Coordinator has spawned three Specialist Agents for the JWT authentication task from Episode 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Workshop Floor
├── Auth Token Elf          → worktree: feat/auth-token-service
├── Gateway Middleware Elf  → worktree: feat/gateway-middleware
└── Test Suite Elf          → worktree: feat/integration-tests (waiting)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each worktree contains a copy of the relevant files at the point the Elf starts. Changes made by Auth Token Elf in &lt;code&gt;auth-service/src/token-service.ts&lt;/code&gt; are &lt;strong&gt;invisible to Gateway Middleware Elf&lt;/strong&gt; until they are explicitly integrated. There are no accidental clobberings. No race conditions on file writes.&lt;/p&gt;

&lt;p&gt;The Coordinator tracks the state of each worktree. When both implementation Elves complete, it orchestrates the merge — resolving any conflicts at the spec level (because the interface contracts were declared there) rather than discovering them at the file level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumable Sessions: The Workshop Is Open When You Return
&lt;/h2&gt;

&lt;p&gt;There is another form of isolation that Father Christmas values enormously: &lt;strong&gt;temporal isolation&lt;/strong&gt;. The ability to close the Workshop at night and find it exactly as you left it in the morning.&lt;/p&gt;

&lt;p&gt;In most AI tools, closing the window ends the session. Context is lost. Agents forget. You start over.&lt;/p&gt;

&lt;p&gt;Intent’s workspaces are &lt;strong&gt;resumable&lt;/strong&gt;. When you close the application and reopen it the next morning, every agent is exactly where it was. The spec is unchanged. The worktrees are intact. The in-progress commits are safe. The Elves are waiting at their workbenches, ready to continue.&lt;/p&gt;

&lt;p&gt;This is possible because Intent uses &lt;strong&gt;auto-commit&lt;/strong&gt; — as agents complete units of work, their changes are committed to their branch automatically. The persistent state is the git history itself, which survives any restart.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent workspace state on close:
├── spec: JWT auth — 6/9 tasks complete
├── Auth Token Elf: feat/auth-token-service — all commits saved
├── Gateway Middleware Elf: feat/gateway-middleware — all commits saved
└── Test Suite Elf: feat/integration-tests — waiting to start

Intent workspace state on reopen (next morning):
└── [identical to above — nothing lost]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Father Christmas, this means I can step away from the Workshop on December 23rd for a brief rest, return on the 24th, and find every Elf at their bench with their gifts half-wrapped exactly as I left them. The Workshop never forgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Unified Window: Code, Browser, Terminal, Git
&lt;/h2&gt;

&lt;p&gt;Isolation does not mean fragmentation. Intent keeps everything visible in &lt;strong&gt;one window&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;code editor&lt;/strong&gt; shows the active agent’s files.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;built-in Chrome browser&lt;/strong&gt; previews localhost changes in real time.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;terminal&lt;/strong&gt; runs builds, tests, and scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git integration&lt;/strong&gt; handles staging, committing, and branch management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need to switch between VS Code, iTerm, Chrome, and SourceTree. The Workshop floor is one room with everything on it.&lt;/p&gt;

&lt;p&gt;This matters for agent work because agents need to &lt;strong&gt;see results immediately&lt;/strong&gt;. A Specialist that modifies a React component can open the browser preview in the same window, verify the rendering, and either commit or adjust — without handing off to a human to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: Isolated Workspace Management
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Coordinator, Git repository, file system&lt;/td&gt;
&lt;td&gt;Task assignment, branch name, starting file state&lt;/td&gt;
&lt;td&gt;Coordinator spawns agent → Intent creates worktree → Agent works in isolation → Auto-commit saves progress → Coordinator integrates on completion&lt;/td&gt;
&lt;td&gt;Isolated branch per agent, no conflicts, resumable state&lt;/td&gt;
&lt;td&gt;Coordinator Agent, Developer, CI/CD pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Father Christmas, the main toy vault&lt;/td&gt;
&lt;td&gt;Elf assignment, workbench materials&lt;/td&gt;
&lt;td&gt;Santa assigns bench → Elf gets private materials → works without interruption → gifts stored safely → Santa integrates at end&lt;/td&gt;
&lt;td&gt;No collisions, no broken gifts, always resumable&lt;/td&gt;
&lt;td&gt;Quality Control, Head Elf Pepper, the Sleigh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Practical Tip: When to Merge
&lt;/h2&gt;

&lt;p&gt;Father Christmas has one firm rule about workbenches: an Elf’s work stays on their bench until it is &lt;strong&gt;finished and verified&lt;/strong&gt;. Premature merges cause half-built toys to appear in the main inventory, confusing other Elves.&lt;/p&gt;

&lt;p&gt;In Intent terms: the Coordinator should not merge a Specialist’s branch until:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Specialist has reported completion.&lt;/li&gt;
&lt;li&gt;The Verifier Agent has confirmed compliance with the spec.&lt;/li&gt;
&lt;li&gt;Any interface contracts with other Elves have been respected.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The spec is the checklist. When all boxes are ticked, the merge is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;In Episode 5, Father Christmas will explain &lt;strong&gt;Spec-Driven Development&lt;/strong&gt; — the philosophical shift that puts the living spec at the centre of the workflow and uses it to ensure everything finishes in time for Christmas. This is the &lt;em&gt;why&lt;/em&gt; behind everything we have built so far.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A tidy workbench is the sign of an organised mind. And an organised Workshop is the sign of gifts arriving on time.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>git</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.5</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:39:14 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep5-hm6</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep5-hm6</guid>
      <description>&lt;h1&gt;
  
  
  Finishing Before Christmas — Spec-Driven Development 📜
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do you know why Christmas always arrives on time? Not because I am superhuman. Not because the reindeer are faster than physics should allow. Christmas arrives on time because of one inviolable rule in the North Pole: nothing gets built until we agree, in writing, on what done looks like. We call it the Master Gift List. The world calls it Spec-Driven Development. The result is the same: no surprises on Christmas morning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Old Way: Code First, Regret Later
&lt;/h2&gt;

&lt;p&gt;There is a seductive pattern in software development that I call &lt;strong&gt;Build First, Discover Later&lt;/strong&gt;. It goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Someone has a rough idea.&lt;/li&gt;
&lt;li&gt;A developer (or, increasingly, an agent) starts building immediately.&lt;/li&gt;
&lt;li&gt;Halfway through, the stakeholder sees a demo and says: &lt;em&gt;“That is not what I meant at all.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Everything is reworked. The deadline slips. Someone’s Christmas is ruined.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have witnessed this pattern in the Workshop. A zealous Elf, eager to begin, starts carving a rocking horse before Father Christmas has decided whether it should be red or blue, large or small, with or without a mane. Three hours later, the horse is red, large, and maned — and the child’s letter clearly specified &lt;em&gt;blue, small, no mane&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The problem is not the Elf’s carving ability. The problem is that work began before intent was explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Spec-Driven Development?
&lt;/h2&gt;

&lt;p&gt;Spec-Driven Development (SDD) is a workflow practice, not a programming paradigm. It has one central principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The spec is the primary artifact. Code is the result of executing it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In SDD, you do not write code and then document it. You write a spec — a precise, executable description of what you intend to build — and then agents (or humans) implement it. The spec comes first. The spec stays current. The spec is what gets reviewed.&lt;/p&gt;

&lt;p&gt;Augment Intent was built around this principle. Their product manifesto states it plainly: &lt;strong&gt;at that point, the plan becomes the product.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Pillars of SDD in Intent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pillar 1: Write the Spec Before Any Code
&lt;/h3&gt;

&lt;p&gt;The Coordinator Agent will not spawn Specialists until a spec exists. This is not bureaucracy — it is discipline. A spec written before implementation captures the human’s &lt;strong&gt;intent&lt;/strong&gt; (what success looks like, what constraints exist, what decisions have been made) rather than narrating code that has already been written.&lt;/p&gt;

&lt;p&gt;A good pre-implementation spec answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the goal, measured how?&lt;/li&gt;
&lt;li&gt;What must not change (frozen modules, existing contracts, budget)?&lt;/li&gt;
&lt;li&gt;What does “done” look like in a test?&lt;/li&gt;
&lt;li&gt;Which parts depend on which others?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pillar 2: The Spec Updates as Work Progresses
&lt;/h3&gt;

&lt;p&gt;A spec that does not evolve becomes fiction. Intent’s living spec updates automatically as agents complete tasks, record decisions, and encounter new constraints. When you return to the spec after a day of agent work, it reflects &lt;strong&gt;what was actually built&lt;/strong&gt;, not what was originally planned.&lt;/p&gt;

&lt;p&gt;This closes the gap that traditionally exists between the plan and the product. In most organisations, that gap is enormous and filled with undocumented decisions, tribal knowledge, and polite disagreements about what the requirements “really meant.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 3: Review the Spec, Not Just the Code
&lt;/h3&gt;

&lt;p&gt;Code review is expensive. Reviewing a 2,000-line pull request is difficult, slow, and error-prone. Reviewing a spec is cheap. A well-structured spec can be reviewed in minutes, catching fundamental misalignments before a single line of code is written.&lt;/p&gt;

&lt;p&gt;SDD moves the review point earlier in the pipeline. You review &lt;strong&gt;intent&lt;/strong&gt; first. Implementation follows. This is why Intent has the Verifier Agent checking output against the spec — because the spec is the ground truth, and the code is measured against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Christmas Deadline as a Forcing Function
&lt;/h2&gt;

&lt;p&gt;Father Christmas has one advantage over most product teams: &lt;strong&gt;an unmovable deadline&lt;/strong&gt;. Christmas is December 25th. Always. Everywhere. It does not slip. It does not move to accommodate a stakeholder who changed their mind in November.&lt;/p&gt;

&lt;p&gt;This deadline is a gift (pun intended). It forces the Workshop to be explicit about scope from the very beginning. We cannot add “one more toy” on December 20th without removing something else. Every addition requires a trade-off. The Master Gift List enforces this.&lt;/p&gt;

&lt;p&gt;SDD imposes the same discipline on software teams. When the spec defines the scope, additions are &lt;strong&gt;visible&lt;/strong&gt;. You can see exactly what is in and what is out. Scope creep does not happen silently — it requires a spec change, which requires a decision, which requires a conversation. That conversation, had early, is cheap. Had at 11pm on December 24th, it is catastrophic.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDD vs Traditional Approaches
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Traditional&lt;/th&gt;
&lt;th&gt;Spec-Driven&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source of truth&lt;/td&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;Living Spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When specs are written&lt;/td&gt;
&lt;td&gt;After or alongside code&lt;/td&gt;
&lt;td&gt;Before code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec accuracy over time&lt;/td&gt;
&lt;td&gt;Drifts (document rot)&lt;/td&gt;
&lt;td&gt;Stays current (auto-updated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent alignment&lt;/td&gt;
&lt;td&gt;Re-explain each session&lt;/td&gt;
&lt;td&gt;Automatic via spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review point&lt;/td&gt;
&lt;td&gt;Code review only&lt;/td&gt;
&lt;td&gt;Spec review + code review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope control&lt;/td&gt;
&lt;td&gt;Implicit, often invisible&lt;/td&gt;
&lt;td&gt;Explicit, requires spec change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactoring cost&lt;/td&gt;
&lt;td&gt;Break and fix&lt;/td&gt;
&lt;td&gt;Spec-guided&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: Spec-Driven Development Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Product owner, developer, Coordinator Agent&lt;/td&gt;
&lt;td&gt;Business goal, constraints, success criteria&lt;/td&gt;
&lt;td&gt;Write spec → Review spec → Spawn agents → Agents implement → Spec updates → Verifier checks&lt;/td&gt;
&lt;td&gt;Working software that matches intent, accurate documentation, decision log&lt;/td&gt;
&lt;td&gt;Engineering team, product owner, QA, end users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Management, Head Elf Pepper, Father Christmas&lt;/td&gt;
&lt;td&gt;Child’s wish list, Workshop constraints, quality standards&lt;/td&gt;
&lt;td&gt;Write the Master List → Agree on scope → Elves build → List updates → QC checks&lt;/td&gt;
&lt;td&gt;Gifts that match the wish list, accurate gift manifest, no surprises&lt;/td&gt;
&lt;td&gt;Children, parents, Father Christmas himself&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A Worked Example: The Christmas Eve Delivery App
&lt;/h2&gt;

&lt;p&gt;Let us say Head Elf Pepper wants to build a real-time delivery tracker for the sleigh. The old way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pepper: "Build a delivery tracker."
Agent: [builds something]
Pepper: "That is not what I wanted."
[Repeat until December 24th.]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDD way:&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;## Christmas Eve Delivery Tracker — Spec&lt;/span&gt;

&lt;span class="gu"&gt;### Goal&lt;/span&gt;
Real-time map showing sleigh position and remaining deliveries,
updating every 30 seconds, accessible on elves' tablets.

&lt;span class="gu"&gt;### Success Criteria&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map renders in &amp;lt; 1 second on standard tablet browser
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Position updates within 30s of sleigh movement
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Remaining house count is accurate (matches manifest)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Works offline (last known position shown if signal lost)

&lt;span class="gu"&gt;### Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Must use existing Reindeer GPS API (v2)
&lt;span class="p"&gt;-&lt;/span&gt; No server-side changes to Delivery Manifest Service
&lt;span class="p"&gt;-&lt;/span&gt; Must work in Safari (elves use iPads)

&lt;span class="gu"&gt;### Out of Scope (v1)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Historical route replay
&lt;span class="p"&gt;-&lt;/span&gt; Per-gift tracking
&lt;span class="p"&gt;-&lt;/span&gt; Weather overlay

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Implement GPS polling service — Tracker Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Build map component — Map Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integrate manifest API — Data Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Offline fallback — Resilience Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integration tests — Test Elf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This spec takes ten minutes to write and saves days of rework. The Elves know exactly what to build. Pepper reviews the spec and agrees it is correct before a line of code is written. The Verifier knows exactly what to check.&lt;/p&gt;

&lt;p&gt;This is SDD. This is how Christmas gets delivered on time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;In Episode 6, Father Christmas will explain the &lt;strong&gt;Context Engine&lt;/strong&gt; — the magical knowledge base that ensures every Elf in the Workshop understands every toy design, every material property, and every past decision. Without it, SDD is impossible at scale.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The plan is the product. Everything else is wrapping paper.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>specdriven</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:39:08 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep1-4668</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep1-4668</guid>
      <description>&lt;h1&gt;
  
  
  Santa’s Secret Weapon: Welcome to the Workshop! 🎅
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ho ho ho! Come in, come in — the fire is warm and the cocoa is hot. Pull up a stool and let Father Christmas tell you a story. Not about reindeer, not about presents — but about the most magical piece of software to land in the Workshop since the invention of the Nice List.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem With Being Father Christmas
&lt;/h2&gt;

&lt;p&gt;Every year it is the same. December arrives like an avalanche, and suddenly Father Christmas has more tasks than minutes.&lt;/p&gt;

&lt;p&gt;The chimneys of the world do not care that Jingle-Bell the Elf is busy repainting the rocking horses while Twinkle the Elf is still debugging the train set firmware. The world expects &lt;strong&gt;one coordinated, perfectly wrapped result&lt;/strong&gt; under every tree by Christmas morning.&lt;/p&gt;

&lt;p&gt;For centuries, I managed this with clipboards, coloured yarn on a corkboard, and a great deal of shouting across the workshop floor. Then, this year, Head Elf Pepper handed me a laptop and said: &lt;em&gt;“Santa, you need to see Augment Intent.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Reader, I wept a single dignified tear into my beard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Augment Intent?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;Augment Intent&lt;/a&gt; is a &lt;strong&gt;macOS developer workspace&lt;/strong&gt; designed for the age of AI agents. It is not merely a chat window where you ask a single Elf to do one thing. It is a &lt;strong&gt;coordinated workshop&lt;/strong&gt; where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Coordinator&lt;/strong&gt; (that would be me, Father Christmas) breaks down a complex goal into a living &lt;strong&gt;Spec&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialist Agents&lt;/strong&gt; (my Elves) run in &lt;strong&gt;parallel&lt;/strong&gt;, each tackling their portion of the work.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Verifier Agent&lt;/strong&gt; checks that what was built actually matches the Spec.&lt;/li&gt;
&lt;li&gt;The entire workspace — code, browser, terminal, git — lives in &lt;strong&gt;one window&lt;/strong&gt;, and the state &lt;strong&gt;persists&lt;/strong&gt; when you close the lid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: it is the North Pole Workshop, but running on silicon instead of snowflakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The North Pole Analogy, Explained
&lt;/h2&gt;

&lt;p&gt;Before we dive into the technical magic in later episodes, let me introduce the cast of characters you will meet throughout this series.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The Workshop&lt;/th&gt;
&lt;th&gt;Augment Intent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Father Christmas&lt;/td&gt;
&lt;td&gt;Coordinator Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head Elf Pepper&lt;/td&gt;
&lt;td&gt;You, the Developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Elves&lt;/td&gt;
&lt;td&gt;Specialist Agents (Implement, Verify, Debug, Review…)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Master Gift List&lt;/td&gt;
&lt;td&gt;The Living Spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Each Elf’s Workbench&lt;/td&gt;
&lt;td&gt;Isolated Workspace / Git Worktree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Workshop Floor&lt;/td&gt;
&lt;td&gt;Intent’s unified window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Context Engine&lt;/td&gt;
&lt;td&gt;The Workshop’s shared knowledge of every toy design, material, and elf skill&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The magic of Christmas has always been &lt;strong&gt;parallelism with coordination&lt;/strong&gt;. Teddy-bear Elves do not wait for train-set Elves to finish. They work simultaneously, guided by the same Master Gift List. That is precisely what Intent enables for software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Series Covers
&lt;/h2&gt;

&lt;p&gt;Over the coming episodes, Father Christmas will walk you through Intent one concept at a time, always in the style of a cosy fireside chat. Here is the full gift list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Welcome to the Workshop (you are here!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;The Master Gift List — Living Specs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Santa &amp;amp; the Elves — Coordinator vs Specialist Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Every Elf Has a Workbench — Isolated Workspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Finishing in Time for Christmas — Spec-Driven Development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;The Context Engine — The Workshop Knows Every Toy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Parallel Elves, No Chaos — Multi-Agent Orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;The Delivery — From Spec to Merged Pull Request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: The Workshop at a Glance
&lt;/h2&gt;

&lt;p&gt;Before any Elf touches a piece of wood, Father Christmas draws the SIPOC on the big blackboard. Here is Intent’s SIPOC.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What provides&lt;/td&gt;
&lt;td&gt;Developer intent, codebase, models (Claude Opus, Sonnet, GPT…)&lt;/td&gt;
&lt;td&gt;Task description, repository files, rules &amp;amp; guidelines&lt;/td&gt;
&lt;td&gt;Spec creation → Coordinator planning → Parallel agent execution → Verification&lt;/td&gt;
&lt;td&gt;Working code, updated spec, pull request&lt;/td&gt;
&lt;td&gt;Engineering team, end users, CI/CD pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop equivalent&lt;/td&gt;
&lt;td&gt;Head Elf Pepper, the toy blueprints, the Elf skill registry&lt;/td&gt;
&lt;td&gt;The gift order, the raw materials, the Elf roster&lt;/td&gt;
&lt;td&gt;Santa writes the Master List → assigns Elves → Elves build in parallel → quality check&lt;/td&gt;
&lt;td&gt;Wrapped, labelled gifts → sleigh&lt;/td&gt;
&lt;td&gt;Children of the world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;You may be thinking: &lt;em&gt;“Santa, I already have VS Code and a single agent. Why do I need a whole workshop?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fair question. The answer is the same reason I do not gift-wrap eight billion presents with one pair of hands. Beyond a certain complexity, &lt;strong&gt;serial work with a single agent creates a bottleneck&lt;/strong&gt;. The agent re-explains context, loses state between sessions, and cannot parallelise.&lt;/p&gt;

&lt;p&gt;As Augment’s own manifesto puts it: &lt;em&gt;parallel execution is no longer the hard part — coordination is.&lt;/em&gt; Intent solves the coordination problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Intent is currently in &lt;strong&gt;public beta for macOS&lt;/strong&gt;. You can &lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;download it here&lt;/a&gt;. It works with your existing Augment credits, and you can even bring Claude Code, Codex, or OpenCode if you already have a subscription for those.&lt;/p&gt;

&lt;p&gt;In the next episode, Father Christmas will introduce &lt;strong&gt;The Master Gift List&lt;/strong&gt; — the Living Spec that keeps every Elf pointed at the same star.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Until then: stay warm, write good specs, and remember — Christmas is only ever early for developers who plan ahead.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>aiagents</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.7</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:38:31 +0000</pubDate>
      <link>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep7-3k93</link>
      <guid>https://forem.com/the-software-s-journey/santa-augmentcode-intent-ep7-3k93</guid>
      <description>&lt;h1&gt;
  
  
  Parallel Elves, Zero Chaos — Multi-Agent Orchestration 🎁
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The secret to running a smooth Workshop is understanding the difference between work that can happen at the same time and work that cannot. You cannot paint a toy before it is carved. You cannot test a toy before it is assembled. But you can absolutely carve a hundred toys simultaneously, paint them in parallel once each is carved, and run quality checks in a third wave. The key is knowing the dependencies. The key, always, is the spec.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  From Solo Agent to Agent Orchestra
&lt;/h2&gt;

&lt;p&gt;In the early days of AI-assisted coding, the workflow was simple: one developer, one agent, one task at a time. The agent typed fast, but the work was serial. Task A finished before Task B started.&lt;/p&gt;

&lt;p&gt;This is like running the North Pole Workshop with one Elf. Technically sufficient. Practically absurd.&lt;/p&gt;

&lt;p&gt;The shift to multi-agent work is not simply “run more agents.” It is a fundamentally different coordination challenge. Fred Brooks described it for humans in &lt;em&gt;The Mythical Man-Month&lt;/em&gt;: adding more workers to a project does not automatically accelerate it, because communication overhead grows and integration becomes the dominant cost. AI agents do not repeal this dynamic — they accelerate it.&lt;/p&gt;

&lt;p&gt;Intent’s multi-agent orchestration is the answer to Brooks’ challenge, applied to AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three-Wave Pattern
&lt;/h2&gt;

&lt;p&gt;Father Christmas has observed that most Workshop tasks fall into three waves of parallelism. Intent reflects this naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 1 — Parallel Implementation&lt;/strong&gt;Tasks that are independent of each other can start simultaneously. The Auth Token Elf and the Gateway Middleware Elf do not need each other’s output. They start at the same time, work on separate worktrees, and finish independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 2 — Dependent Integration&lt;/strong&gt;Tasks that depend on Wave 1 completing. The Test Suite Elf cannot write meaningful integration tests until both implementation Elves are done. It waits for its inputs, then starts immediately when they arrive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 3 — Verification and Review&lt;/strong&gt;The Verifier and Code Review Elves run after Wave 2. They check everything against the spec, catch remaining issues, and produce the final verdict.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wave 1 (parallel):
  Auth Token Elf ─────────────────────── done ──┐
  Gateway Middleware Elf ──────────────── done ──┤

Wave 2 (parallel, starts after Wave 1):          │
  Test Suite Elf ◄──────────────────────────────┤
  Docs Generator Elf ◄──────────────────────────┘

Wave 3 (after Wave 2):
  Verifier Elf ◄──────────────── checks all ──► Report
  Code Review Elf ◄────────────────────────── Review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator manages these waves automatically, based on the dependency graph in the spec. No human needs to tell it when Wave 2 can start. The spec encodes that information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background Agents: The Night Shift
&lt;/h2&gt;

&lt;p&gt;Intent also supports &lt;strong&gt;background agents&lt;/strong&gt; — Elves who work quietly while you are focused elsewhere.&lt;/p&gt;

&lt;p&gt;In the JWT authentication example from Episode 3, while the two main implementation Elves are doing their headline work, three background Elves are running simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lint &amp;amp; Type Check Elf&lt;/strong&gt;: continuously checking that changes do not break type safety or style rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Suite Elf&lt;/strong&gt;: writing tests in the background as interfaces are published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs Generator Elf&lt;/strong&gt;: updating API documentation as endpoint signatures emerge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These background agents do not block the main flow. They run in their own worktrees, produce their own commits, and report back to the Coordinator when done. The Coordinator integrates their output into the final pull request.&lt;/p&gt;

&lt;p&gt;In the Workshop, these are the Elves who quietly restock materials, update the inventory, and prepare the packaging while the headline crafting is happening. They are not glamorous. They are indispensable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Handoffs Gracefully
&lt;/h2&gt;

&lt;p&gt;The most fragile moment in any multi-agent workflow is the &lt;strong&gt;handoff&lt;/strong&gt;: when one agent’s output becomes another agent’s input.&lt;/p&gt;

&lt;p&gt;Without orchestration, handoffs fail silently. Agent A finishes and commits. Agent B starts and discovers Agent A’s interface is different from what the spec described. Confusion, rework, delay.&lt;/p&gt;

&lt;p&gt;Intent handles handoffs through the spec. When Agent A completes, it &lt;strong&gt;updates the spec&lt;/strong&gt; with the actual interface it produced. The Coordinator reads this update and re-briefs Agent B with the accurate information before it starts. Agent B always starts with the truth.&lt;/p&gt;

&lt;p&gt;This is analogous to a baton in a relay race. The baton is the spec. The Coordinator ensures it is passed correctly. No dropped batons. No Christmas Eve disasters.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Which Specialist
&lt;/h2&gt;

&lt;p&gt;Intent ships with a default set of Specialists. Here is Father Christmas’s guide to deploying them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Specialist&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;th&gt;North Pole Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Investigate&lt;/td&gt;
&lt;td&gt;Before writing the spec — explore feasibility&lt;/td&gt;
&lt;td&gt;Scout Elves assessing a new toy design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement&lt;/td&gt;
&lt;td&gt;Core code production&lt;/td&gt;
&lt;td&gt;Craft Elves at their workbenches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;td&gt;After implementation — check against spec&lt;/td&gt;
&lt;td&gt;Quality Control Elves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critique&lt;/td&gt;
&lt;td&gt;Review the spec before coding starts&lt;/td&gt;
&lt;td&gt;Senior Elves challenging the design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;When tests fail or behaviour is wrong&lt;/td&gt;
&lt;td&gt;Repair Elves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Review&lt;/td&gt;
&lt;td&gt;Automated PR review with codebase context&lt;/td&gt;
&lt;td&gt;Senior Elves reviewing finished work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rule is: &lt;strong&gt;never skip Investigate for genuinely novel tasks&lt;/strong&gt;, and &lt;strong&gt;never skip Verify before merging&lt;/strong&gt;. Skipping these is how gifts arrive with missing parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing Your Own Elves
&lt;/h2&gt;

&lt;p&gt;Intent is designed to be open. You can bring your own specialist agents — Claude Code, OpenAI Codex, or OpenCode — and integrate them into the orchestration. If your team has built a custom agent that specialises in your domain (a “Security Review Elf” that knows your specific compliance requirements, for example), it can be plugged in as a Specialist.&lt;/p&gt;

&lt;p&gt;Father Christmas respects specialisation. The best Toy Locomotive Elf is not the best Rag Doll Elf. The Workshop thrives because it matches the right Elf to the right toy.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: Multi-Agent Orchestration
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Coordinator, all Specialist Agents, Context Engine, spec&lt;/td&gt;
&lt;td&gt;Task dependency graph, agent roster, model selections, codebase&lt;/td&gt;
&lt;td&gt;Identify parallelism → Wave 1 agents start → Handoffs via spec → Wave 2 starts → Background agents run → Verifier checks → PR ready&lt;/td&gt;
&lt;td&gt;Verified, integrated pull request; updated spec; decision log&lt;/td&gt;
&lt;td&gt;Developer, CI/CD, code reviewers, end users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Father Christmas, all Elves, the Library&lt;/td&gt;
&lt;td&gt;Dependency chart, Elf skills, material availability&lt;/td&gt;
&lt;td&gt;Independent tasks start together → Handoffs recorded in Master List → Dependent tasks start when inputs ready → QC checks everything&lt;/td&gt;
&lt;td&gt;All gifts built correctly, verified, packaged, on the sleigh&lt;/td&gt;
&lt;td&gt;Children, parents, Christmas morning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Mythical Man-Month, Solved (Partially)
&lt;/h2&gt;

&lt;p&gt;Brooks was right: coordination is the dominant cost. Adding more agents to a poorly organised task makes it worse.&lt;/p&gt;

&lt;p&gt;But Brooks was writing about human coordination, with its communication overhead and context-switching costs. Intent changes the calculus. When the spec is the coordination layer — when every agent is briefed from the same living document, when handoffs are managed by the Coordinator, when each agent has its own isolated workspace — the overhead of adding an agent is dramatically lower than adding a human.&lt;/p&gt;

&lt;p&gt;Not zero. Not magic. But dramatically lower.&lt;/p&gt;

&lt;p&gt;This is how the North Pole gets better every year. We do not just add Elves. We improve the coordination. The Workshop gets smarter, not just bigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;In our final episode, Father Christmas walks you through the complete journey: from first prompt to &lt;strong&gt;merged pull request&lt;/strong&gt;. We bring together the spec, the Coordinator, the Elves, the workbenches, the Context Engine, and the orchestration — and we ship.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An orchestra without a conductor is noise. With a conductor, it is music. The spec is the score. The Coordinator is the conductor. The Elves are the musicians. And the result, when everything works, is Christmas.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>multiagent</category>
      <category>orchestration</category>
    </item>
  </channel>
</rss>
