<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Walter Gugenberger</title><description>Practical notes on distributed systems, AI-assisted development, and career engineering.</description><link>https://waltergugenberger.com/</link><item><title>How I code with AI</title><link>https://waltergugenberger.com/blog/how-i-code-with-ai/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/how-i-code-with-ai/</guid><description>How my workflow changed once agents write the code: I plan and write specs, a fleet of Claude instances does the typing, and reviewing and merging stay with me.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Anthropic &lt;a href=&quot;https://www.anthropic.com/institute/recursive-self-improvement&quot;&gt;published some numbers&lt;/a&gt; on how AI is speeding up its own development. Over 80 percent of their production code is now written by Claude, code output per engineer is up 8x since 2024, and the length of tasks an AI can finish on its own doubles every four months. It&apos;s not just them either. GitHub saw about one billion commits in all of 2025. Right now it&apos;s running at 275 million a week.&lt;/p&gt;
&lt;p&gt;I can see it in my own work. I haven&apos;t written a function by hand in weeks. I still have my IDEs installed, but I open them so rarely at this point that IntelliJ has to rebuild its cache every single time, and anyone who has sat through that knows exactly the pain I&apos;m talking about. Most of what I ship starts with me telling a machine what I want, from my phone or in a shell.&lt;/p&gt;
&lt;h2&gt;The plan is the work&lt;/h2&gt;
&lt;p&gt;I always planned before coding, but the plans were rough. Implementation details never had to be spelled out, because I knew the codebase and I had the experience, and between the two of them the how would work itself out while I typed. An agent doesn&apos;t bring any of that. What you hand over is a description, and a vague description gets you vague code back.&lt;/p&gt;
&lt;p&gt;So how I start depends on the task now. Some days it&apos;s TDD, I define the tests and the agent writes code against them until they pass. Bigger or riskier work gets a thorough plan upfront, what it should do, where it fits, what it&apos;s not allowed to break, and then the agent writes its own implementation plan back to me before it touches anything and we go back and forth over it until I run out of objections. When the stakes are low I just vibe code. Let the agent go, follow its intuition, see where it lands.&lt;/p&gt;
&lt;p&gt;The tooling supports all of it. Plan mode to write the spec, where the agent can read everything but change nothing. Goal mode to finish, where it runs until the feature is done. And loops that prompt the agents for me on a schedule, so the next task gets picked up and the queue keeps moving and the checks get rerun without me typing any of those prompts myself.&lt;/p&gt;
&lt;p&gt;If the plan is mush, it doesn&apos;t matter how smart the model is.&lt;/p&gt;
&lt;h2&gt;The fleet&lt;/h2&gt;
&lt;p&gt;I run five to ten Claude instances at once. Even that undersells it, because one instance isn&apos;t one worker. Give it a big job and it fans out into hundreds of subagents, each working on its own piece and reporting back up, so what looks like ten agents is really ten managers with staff.&lt;/p&gt;
&lt;p&gt;A lot of work splits up like this. Reviews that go through the whole diff from a dozen angles with a second wave checking whatever the first wave flagged, migrations where every file gets its own agent, reading a subsystem from a few directions at once, tests and specs across a big batch in one pass. I never did any of this before. Coordinating it by hand cost more than it was worth.&lt;/p&gt;
&lt;p&gt;So what do I do all day? I keep the sessions open and round robin from one to another. I figure out what to ask for, I cut it into pieces an agent can finish, and I look at what comes back and decide whether it&apos;s any good, which is most of the job and the one part there&apos;s no handing off.&lt;/p&gt;
&lt;p&gt;The agents run wherever it makes sense: my laptop, a Linux box in my basement, an EC2 instance, the ephemeral boxes Anthropic spins up and throws away. Even right now I have one of those ephemeral boxes open, and another agent is over on the EC2 instance working on a platform I built. I&apos;m not typing code in either one. All of it runs in tmux over remote connections so the sessions survive me walking away. I covered that setup in &lt;a href=&quot;/blog/i-built-a-product-from-my-phone/&quot;&gt;I built a product from my phone&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Review and sign-off&lt;/h2&gt;
&lt;p&gt;When the work comes back, I review it. The first pass isn&apos;t me though. Automated review runs on the diff before I even look, some of it &lt;code&gt;/code-review&lt;/code&gt;, the bigger part a set of review skills I wrote myself, standards from years of doing this, written down so a machine applies them every single time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The spec is the contract. Code that quietly does something the spec doesn&apos;t say gets flagged, not merged.&lt;/li&gt;
&lt;li&gt;If something can&apos;t be undone, I want a good reason it isn&apos;t a soft delete.&lt;/li&gt;
&lt;li&gt;Keep the surface small. Don&apos;t add the endpoint or the button if you don&apos;t have to.&lt;/li&gt;
&lt;li&gt;If it ships, it ships with the logs and metrics to debug it later.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I copied my own taste into something that checks the work for me, and what that buys me is that the boring stuff is already gone by the time I&apos;m reading, so my attention goes to the questions that actually need a person. Is this the right approach. Does it fit the system, or just this corner of it. And is there a case nobody thought about.&lt;/p&gt;
&lt;p&gt;The human is still in the loop, that part hasn&apos;t changed. A person merges, and if it ships broken, &quot;the agent wrote it&quot; is not an excuse anyone gets to use. The merge is the one button in the loop I still press myself.&lt;/p&gt;
&lt;h2&gt;What the job is now&lt;/h2&gt;
&lt;p&gt;What&apos;s left is the planning, the judgment, and the sign-off. The typing was the part that left.&lt;/p&gt;
&lt;p&gt;The AI labs already have a name for this that fits better than &quot;software engineer&quot;: member of technical staff. It sounds like nothing, but it covers the spread, product and engineering and the infra the agents run on, plus the open problem of orchestrating all of it. I think that&apos;s where at least some of this work is going.&lt;/p&gt;
&lt;p&gt;How far this goes isn&apos;t up to me. &lt;a href=&quot;https://metr.org/time-horizons/&quot;&gt;METR tracks how long a task an agent can finish on its own&lt;/a&gt;, and the line keeps doubling. That&apos;s the curve to watch.&lt;/p&gt;
</content:encoded><category>ai</category><category>ai-agents</category><category>devtools</category><category>spec-driven-dev</category><category>career</category></item><item><title>Marquis: an AI-native media intelligence platform</title><link>https://waltergugenberger.com/blog/marquis/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/marquis/</guid><description>An AI-native media intelligence platform run entirely through conversation. Built by one engineer, in production for a PR firm since May 2026.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Marquis is a media-intelligence platform I built for my wife&apos;s PR firm. It watches news coverage for the firm&apos;s clients around the clock, uses AI to decide what is about them and how it reads, and delivers browsable coverage, daily briefs in Slack, and weekly reports. It has been in production since May 2026, replacing links pasted into Slack and a spreadsheet.&lt;/p&gt;
&lt;p&gt;I built it in about two months of evenings and weekends, largely from my phone. One engineer. This post is about how that is possible.&lt;/p&gt;
&lt;h2&gt;The frontend is a protocol&lt;/h2&gt;
&lt;p&gt;Marquis has no forms. Operators run it by talking to Claude: &quot;onboard a new client&quot;, &quot;why is this feed noisy?&quot;, &quot;compare this month&apos;s coverage to last month&apos;s&quot;. The assistant picks the right actions and does them.&lt;/p&gt;
&lt;p&gt;That works because the product is built as tools and skills behind MCP, an open protocol. Any chat interface that speaks MCP and supports skills can drive Marquis. Claude is just the current front door. When the models get better or a new client app ships, the product&apos;s interface improves without Marquis shipping a line of code. I never build another frontend for another channel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/marquis/cowork.png&quot; alt=&quot;An AI assistant onboarding a new Marquis client from one message: four tool calls run and the client is live.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There is a web app, and it deliberately does less. It exists for the one thing conversation is bad at, scanning a whole portfolio at a glance. You cannot build clients or queries there. That still happens in conversation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/marquis/dashboard.png&quot; alt=&quot;The Marquis dashboard: an attention-first view of every monitored client, with alerts for coverage spikes and stale collection.&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Asynchronous by design&lt;/h2&gt;
&lt;p&gt;Triggering a collection run takes about a second. The coverage lands minutes later. That gap is deliberate. The backend is asynchronous end to end, the way Werner Vogels has argued the world already is. It scales to many clients without redesign. When a new source or destination is needed, it fans out and nothing else has to change.&lt;/p&gt;
&lt;h2&gt;AI on both sides&lt;/h2&gt;
&lt;p&gt;The intelligence layer runs on the latest models from Anthropic and Google. Every article gets a relevance decision and a sentiment read. When the AI is not sure, it holds the article and asks a human in Slack instead of guessing.&lt;/p&gt;
&lt;p&gt;That layer got a real test recently. The firm needed coverage on a high-value news target whose press ran almost entirely through South American outlets, some of it in Spanish, some in English. Onboarding took one Claude conversation. And because the intelligence is an LLM, the language barrier never showed up. Marquis read the coverage in whatever language it arrived and delivered the sentiment in plain English.&lt;/p&gt;
&lt;p&gt;AI agents also wrote the code, under the same discipline I would hold a human team to. Specs drive every repository and changes land through pull requests. The operator documentation carries a freshness contract that ties it to the code it describes. That discipline is why I trust what the agents build.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/marquis/coverage.png&quot; alt=&quot;A client&apos;s coverage view: scored articles with sentiment, source, and drill-down analysis.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/marquis/docs.png&quot; alt=&quot;The built-in operator guide, written and kept current by the same agents that build the product.&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Stack&lt;/h2&gt;
&lt;p&gt;Kotlin · Python · TypeScript · React · AWS.&lt;/p&gt;
&lt;h2&gt;More&lt;/h2&gt;
&lt;p&gt;I wrote about the build in &lt;a href=&quot;/blog/building-marquis&quot;&gt;Building Marquis&lt;/a&gt; and about the workflow in &lt;a href=&quot;/blog/i-built-a-product-from-my-phone&quot;&gt;I built a product from my phone&lt;/a&gt;. More posts in the series are on the way. If you want to talk, &lt;a href=&quot;https://www.linkedin.com/in/waltergugenberger&quot;&gt;LinkedIn&lt;/a&gt; is the best way to reach me.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Marquis is proprietary software, owned and operated by &lt;a href=&quot;https://thelafayettecompany.com&quot;&gt;The Lafayette Company&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>marquis</category><category>ai</category><category>showcase</category></item><item><title>Thank You, America</title><link>https://waltergugenberger.com/blog/thank-you-america/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/thank-you-america/</guid><description>A note of thanks on America&apos;s 250th, for every opportunity and for everyone who paid for this freedom.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Thank you, America, for every opportunity you have given me, from my family to my career. For someone who came from Europe, this would never have been imaginable where I grew up.&lt;/p&gt;
&lt;p&gt;This freedom was paid for. By the 56 men who signed the Declaration of Independence, and with it their own death sentence. By the members of our armed services, who stand watch, right now, somewhere I will never have to. Thank you.&lt;/p&gt;
&lt;p&gt;We all come from different backgrounds, and they all led us here. That, ultimately, is what unites us as Americans.&lt;/p&gt;
</content:encoded></item><item><title>The Case for Soft Deletes</title><link>https://waltergugenberger.com/blog/the-case-for-soft-deletes/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/the-case-for-soft-deletes/</guid><description>Why I default to soft deletes: customers get an undo button, and an AI agent that goes rogue in your system can only ever do reversible damage.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I always liked soft deletes as a feature because it allowed customers to undo their potential mistakes. It also allowed the engineers to better debug, so it was just an overall nice feature, right? It was also a comforting sort of safety net, because the alternative is that if someone deletes something, you might have to roll back the database, you might have to go digging in the logs, et cetera. It also doubles as a rough audit log, since the deleted rows are still in the table, just tombstoned.&lt;/p&gt;
&lt;p&gt;But now that increasingly agents are used to access our systems, I do think soft deletes have a much bigger use case. If your agent goes rogue and starts deleting a bunch of stuff, the agent is much faster than a human could delete it. Even a human could use a script, but the agent can do it without a human really knowing. A human has to actively run the script. The agent could just do it in the background.&lt;/p&gt;
&lt;p&gt;If you build an application with soft deletes in mind and gate it by an API, that gives your AI an additional guardrail. To me, that&apos;s a basic rule of letting agents touch production. The API protects itself from bad inputs, sort of the same way validation does. The agent can ask for whatever it wants, but a delete is still just a reversible delete.&lt;/p&gt;
&lt;p&gt;And honestly, that&apos;s the part I like most about it. If the agent does go off the rails and deletes everything it can reach, you haven&apos;t really lost anything. It&apos;s all still there with a flag on it, so recovering is just a matter of flipping those flags back. Worst case, the app is down for a little while, but the data is never actually gone.&lt;/p&gt;
&lt;p&gt;Soft deletes aren&apos;t free, though. You have to remember to filter out the deleted rows on basically every query, and the day you forget is the day you show someone data they thought was gone. Unique constraints get awkward too, since a deleted row still occupies that email or that slug. And the whole thing only holds if everything goes through the API. The moment someone runs a script straight against the database, the safety net isn&apos;t there.&lt;/p&gt;
&lt;p&gt;As always, there is, of course, a use case for hard deletes. If you provision infrastructure, it&apos;s probably a good idea to deprovision that part so you don&apos;t incur cost when something&apos;s deleted. Even that you could delay by a certain time window, but it&apos;s really up to the app. Generally, when I can, I will do soft deletes, just for the convenience, the laziness, but now more and more also as the additional safeguard.&lt;/p&gt;
</content:encoded><category>ai</category><category>ai-agents</category><category>architecture</category></item><item><title>Building Marquis</title><link>https://waltergugenberger.com/blog/building-marquis/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/building-marquis/</guid><description>My wife&apos;s PR firm tracked media coverage in a spreadsheet. I asked if they wanted something better. Two months later, Marquis went live.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every time The Lafayette Company earned a piece of media coverage, someone pasted the link into Slack, then into a spreadsheet. That was the whole system.&lt;/p&gt;
&lt;p&gt;The spreadsheet was a log. No way to tell if sentiment was shifting, no view across sources they hadn&apos;t found yet, just whatever ended up in a cell.&lt;/p&gt;
&lt;p&gt;My wife founded The Lafayette Company in 2015. Eleven years in, she&apos;s built it into a seven-person PR firm in Alexandria. I handle their IT, which means I&apos;m in their Slack and I see how the work flows. One evening I asked her whether automated news collection would be useful.&lt;/p&gt;
&lt;p&gt;She said sentiment was the main thing. Whether a client got covered, they already knew. What she couldn&apos;t see was whether the tone was positive or negative, and whether it was moving in a direction they should care about. Beyond that, why were they building reports by hand when a machine could do it? And they were missing coverage from sources that weren&apos;t already landing in Slack.&lt;/p&gt;
&lt;p&gt;They already had media monitoring software. It found clips and filed them, and that was where it stopped. It couldn&apos;t tell you whether sentiment was shifting, and nobody was getting a report out of it. The missing piece was analysis.&lt;/p&gt;
&lt;p&gt;So I started building.&lt;/p&gt;
&lt;p&gt;Marquis collects from news APIs and RSS feeds across more than 150,000 sources via EventRegistry, Google RSS, and GDELT. It runs on a schedule, scores sentiment from the news APIs, calculates earned media value, and stores everything. When a report is due, it builds one and drops it into Slack and cloud storage, so nobody has to go looking for it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/diagrams/marquis-workflow.svg&quot; alt=&quot;Marquis workflow: Collect → Analyze → Deliver&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The main interface is Claude. Analysts tell Claude which clients to monitor, what topics to track, how often to run. A Claude plugin handles the setup. When they want to understand what&apos;s happening with a client&apos;s coverage, they ask. Claude fetches the data and talks about it. You can ask why sentiment dropped in a particular week, or how the last month compares to the quarter before, and you get an answer instead of a chart.&lt;/p&gt;
&lt;p&gt;There&apos;s a web interface too, and it does quite little on purpose. It&apos;s an observability tool for the visualizations and portfolio views a text conversation is bad at. The input layer stays in the chat.&lt;/p&gt;
&lt;p&gt;I built the whole thing in about two months of evenings and weekends, most of it written on my phone. If that sounds implausible, I wrote about &lt;a href=&quot;/blog/i-built-a-product-from-my-phone&quot;&gt;how the setup works&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The pilot ran last week. The first automated report came back in a few minutes. The same report would have taken several hours to assemble by hand. The main open issue is cold start latency on low-traffic endpoints. As of this week, the firm is running on it.&lt;/p&gt;
</content:encoded><category>marquis</category><category>ai</category><category>aws</category><category>distributed-systems</category></item><item><title>I built a product from my phone</title><link>https://waltergugenberger.com/blog/i-built-a-product-from-my-phone/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/i-built-a-product-from-my-phone/</guid><description>I built a media intelligence platform for a small PR firm over two months. About three-quarters of it got written on my phone.</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I built a media intelligence platform for The Lafayette Company, my wife&apos;s PR firm in Alexandria, over two months of evenings and weekends. Roughly three-quarters of it got written on my phone.&lt;/p&gt;
&lt;p&gt;The reason I wanted this was boring. I have a family and real obligations. Finding a clean hour at a laptop is a narrow window on a day like mine, and it almost never lines up with when I actually have ideas. Mostly I had ideas when I wasn&apos;t near a laptop. In the pickup line at school, or while my kid was getting ready for soccer practice.&lt;/p&gt;
&lt;p&gt;It&apos;s the same principle that used to keep work calls tied to a desk phone. You take the Zoom from the car now because the meeting and the afternoon pickup are both non-negotiable, and only one of them can move. Coding just hadn&apos;t caught up yet.&lt;/p&gt;
&lt;p&gt;So I put the agent somewhere the phone could reach it.&lt;/p&gt;
&lt;h2&gt;The setup&lt;/h2&gt;
&lt;p&gt;A small EC2 instance runs a tmux session with Claude Code inside. The Claude iOS app connects over a remote channel. I dictate or type what I want, the agent starts, I close the app.&lt;/p&gt;
&lt;p&gt;Sometimes I come back fifteen minutes later, sometimes two days later. I open the app and the session is where I left it. Same shell and files, same thought I was mid-sentence on. Whatever the agent got done while I was gone is waiting.&lt;/p&gt;
&lt;p&gt;I&apos;d been watching self-hostable autonomous agents like OpenClaw for a while. The shape was right, but I didn&apos;t want to install one. I already work in Claude Code every day. Then Claude Code, randomly, shipped a remote-control function right around when I was thinking about this.&lt;/p&gt;
&lt;h2&gt;The kit&lt;/h2&gt;
&lt;p&gt;The parts are ordinary: EC2, tmux, Claude Code, the Claude iOS app, and a small CDK stack to hold it together. The version I run is in &lt;a href=&quot;https://github.com/wuiidl/blog-code&quot;&gt;blog-code&lt;/a&gt;, kept bare so you can fork it and have it running in an afternoon.&lt;/p&gt;
&lt;p&gt;The setup has limits worth naming. Debugging something complex still needs a laptop. So does reading a long diff carefully, or any architectural decision that wants multiple files open at once. The phone handles direction-setting work well. I write a spec, kick off a task, look at what comes back. That&apos;s where most of the hours actually went.&lt;/p&gt;
&lt;p&gt;The total hours didn&apos;t go up. In a typical week I spent about as much time on this as I would have anyway. But the time I already had started to count. Fifteen minutes in a parking lot, stretches that used to be dead time. Over two months of those, I had a product.&lt;/p&gt;
</content:encoded><category>ai</category><category>ai-agents</category><category>devtools</category><category>aws</category><category>mobile</category></item><item><title>Living Specs for AI Agents</title><link>https://waltergugenberger.com/blog/living-specs-for-agents/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/living-specs-for-agents/</guid><description>AI agents forget everything between sessions. One living spec file the agent reads on startup replaces the morning ritual of re-explaining the project.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every morning when I logged back in, I had to re-educate the AI agent. What are we building, where are we in it, what did we decide yesterday, what&apos;s the convention for this thing and the constraint on that thing and the reason we went with option B instead of A. Ten minutes sometimes, twenty other times. Every single day.&lt;/p&gt;
&lt;p&gt;Multiply that across a week and across a team and it adds up fast. AI agents don&apos;t remember. Every session is day one and that&apos;s not changing any time soon, so the question is what you do about it.&lt;/p&gt;
&lt;p&gt;The answer I landed on is simple. Write it down once, in a place the agent reads on startup, and stop re-typing it. For Claude Code that file is &lt;code&gt;CLAUDE.md&lt;/code&gt;. For Kiro it&apos;s &lt;code&gt;AGENTS.md&lt;/code&gt; or something similar. The name doesn&apos;t matter as long as the agent reads it before it does anything else.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a new idea. &lt;code&gt;.cursorrules&lt;/code&gt;, &lt;code&gt;.aider.conf&lt;/code&gt;, and similar files have been doing something like this for years. What changed is that modern agents are better at actually acting on them, and the cost of keeping them updated is low enough to be worth it.&lt;/p&gt;
&lt;p&gt;So that&apos;s where I put the things I was repeating every morning. The stack, the branches, the conventions, rules like &quot;never push from an agent&quot; and &quot;only commit when I ask.&quot; The stuff a new teammate would want on day one, because that&apos;s exactly what the agent is, a new teammate every single morning.&lt;/p&gt;
&lt;p&gt;A trimmed version of mine:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# project-name

Web app built with Astro, deployed on Vercel. This file is the
single source of truth for any agent working in this repo. Read
it completely before doing anything else.

## Rules

- DO NOT push code. Ever. Only the human pushes.
- DO NOT commit unless explicitly told to.
- DO NOT merge to `main` without explicit approval. `main` is
  production. Merging is deploying.
- DO NOT start work without a spec. No spec, no code.
- DO NOT invent outside scope. If it&apos;s not in a spec and wasn&apos;t
  explicitly requested, don&apos;t do it.
- DO NOT deviate from specs. If code contradicts a spec, stop
  and flag it.
- DO NOT generate filler. No AI slop, no hedging, no padding.
  If it reads like AI wrote it, rewrite it or flag it.
- DO NOT guess when you can ask.
- Update this file when you learn something durable about the
  project. The next session depends on it.

## Spec-driven workflow

All work is driven by specifications. No exceptions.

- `docs/system-specs/` describes the current state of the project.
  These are living documents. If the system changes, the spec
  changes. If they disagree, one of them is wrong and you fix it.
- `docs/task-specs/` holds one file per piece of work, prefixed
  with the date: `2026-04-15_some-task.md`. Once the task ships
  the spec is frozen. It becomes a historical record of what was
  built and why. Never rewrite a shipped task spec.
- Before starting any work, check for a task spec. If none exists,
  create one first.

## Content workflow

1. Human shares an idea. Agent categorizes it and routes it to
   the content bank or a task spec.
2. When ready, agent creates a dated task spec. Ask probing
   questions to get the real story before writing begins. Don&apos;t
   fill gaps, surface them.
3. Draft on a branch. Never pad. If a section is thin, ask for
   more rather than generating generic content.
4. Review via PR. Every sentence earns its place.
5. Merge only with explicit approval.

## Branches

- `main` is production. What&apos;s in main is live.
- `develop` is the integration branch for ongoing work.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I put one rule at the top of the file. It&apos;s a living document. When the agent learns something durable about the project, it updates the file itself. The next morning that context is already there and I don&apos;t re-type it.&lt;/p&gt;
&lt;p&gt;It only works if you keep the file honest. Skip an update after something changes and the next session works from a stale picture, which is worse than starting from nothing.&lt;/p&gt;
&lt;h2&gt;Two kinds of specs&lt;/h2&gt;
&lt;p&gt;Once the entry point was sorted I had to deal with the rest of the docs. I used to have a flat &lt;code&gt;docs/&lt;/code&gt; folder with a pile of specs. Some described the current state of the system and others described a specific piece of work I&apos;d done six months ago. They lived next to each other and drifted apart. That confused me and it definitely confused the agent.&lt;/p&gt;
&lt;p&gt;So I split them. &lt;strong&gt;&lt;code&gt;docs/system-specs/&lt;/code&gt;&lt;/strong&gt; is living documentation that describes what the system is right now. If the system changes, the spec changes. If the spec and the code disagree, one of them is wrong and you fix it. &lt;strong&gt;&lt;code&gt;docs/task-specs/&lt;/code&gt;&lt;/strong&gt; is frozen, one file per piece of work, prefixed with the date: &lt;code&gt;2026-04-15_some-task.md&lt;/code&gt;. Once the task ships the spec becomes a historical record. You don&apos;t rewrite it, it&apos;s the timeline of what got built and why.&lt;/p&gt;
&lt;p&gt;The agent knows which is which because they live in different folders. When I start a new task the agent creates a task spec with today&apos;s date, we iterate on it, and once I approve it implements against the spec. When it&apos;s done the spec stays and a month from now if I want to know why I did something the dated file is right there.&lt;/p&gt;
&lt;h2&gt;Beyond code&lt;/h2&gt;
&lt;p&gt;None of this is specific to code, which I didn&apos;t expect when I started. This blog you&apos;re reading right now is set up the same way. There&apos;s a &lt;code&gt;CLAUDE.md&lt;/code&gt; that tells the agent how I write and what my content pillars are, a system-specs folder with the content strategy and post conventions, and a task-specs folder with a dated spec for every post including this one. When I sit down to write, the agent already knows my voice and structure, and it asks me for the story before filling in blanks. I don&apos;t have to explain any of that.&lt;/p&gt;
&lt;p&gt;Any domain where you work with an AI agent over time can use this. Research, consulting, writing a book, running a small business. Anywhere you&apos;d otherwise be explaining the same context over and over.&lt;/p&gt;
&lt;p&gt;I set this up for myself to stop repeating context every morning. But the real payoff showed up when someone else joined the work. They didn&apos;t have to ask me how anything was organized. They opened the repo, their agent read the file, and they were in the work. That&apos;s what happens when you write things down once. The file doesn&apos;t care who opens it, whether that&apos;s a human, an agent, or future-you who forgot.&lt;/p&gt;
&lt;p&gt;This is persistent memory, file-based. The &lt;code&gt;CLAUDE.md&lt;/code&gt; and the system specs change with the project. The task specs just pile up. Some of it stays current and some of it becomes historical context. It&apos;s memory that lives in the repo instead of inside the model.&lt;/p&gt;
&lt;p&gt;Some tools are starting to build this in natively. Claude has a memory feature in the app and in Claude Code. It remembers things about you across conversations. But from my experience it&apos;s still thin. It captures high-level facts about you and misses the depth of how you work on a specific project day to day.&lt;/p&gt;
&lt;p&gt;The spec structure fills that gap for project-level memory. But there&apos;s still a missing layer above it. The stuff about you that should follow you everywhere regardless of which repo you&apos;re in. How you like to work, how you communicate, your preferences and patterns that aren&apos;t tied to one codebase. That&apos;s personal memory and it&apos;s the piece that&apos;s still not solved well. I&apos;ll write about that next.&lt;/p&gt;
&lt;p&gt;For now, if you&apos;re still re-educating your agent every morning, write it down once and let the repo brief the next session for you.&lt;/p&gt;
</content:encoded><category>ai</category><category>spec-driven-dev</category><category>ai-agents</category><category>career</category></item><item><title>One Hour to Save the Data</title><link>https://waltergugenberger.com/blog/one-hour-to-save-the-data/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/one-hour-to-save-the-data/</guid><description>I needed cross-region disaster recovery for DynamoDB. Built a config-driven CDK solution with AI in about an hour. The org adopted it by noon.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I needed to build a disaster recovery solution. The goal was to get DynamoDB data backed up to a different region on a continuous basis. A one-off export wouldn&apos;t cut it. It had to be reliable and run on its own.&lt;/p&gt;
&lt;h2&gt;The approach&lt;/h2&gt;
&lt;p&gt;DDB has an export API that allows customers to move data to an S3 bucket which can be in a different region. While we could have run this manually we needed something that was reliable and continuous. At least as much as possible.&lt;/p&gt;
&lt;p&gt;I decided to deploy a lambda that ran at scheduled times. Exports the tables into an S3 bucket. The lambda had to accept a list of tables and a destination. Ideally this solution was repeatable for future applications (which we needed the next day). A config driven approach deployed via a pipeline seemed ideal.&lt;/p&gt;
&lt;h2&gt;Building it&lt;/h2&gt;
&lt;p&gt;I created a CDK project and told Kiro to start a spec. I needed a lambda, S3 bucket, IAM roles and a schedule. Some alarming and monitoring would be nice too, but nothing crazy. Oh yeah, and I needed the inputs (table names, buckets) to be created based on a config. That way the CDK stack can be deployed over and over with different parameters.&lt;/p&gt;
&lt;p&gt;Writing a spec with Kiro is an iterative approach. It starts out, gets things right and some wrong. You read the spec and make corrections. And when you&apos;re happy you tell it to go implement. Then you check the implementation and most of the time it&apos;s good. Sometimes you tweak in a few spots. The spec took a few minutes to write and so did the implementation. A deployment to preprod to make sure the whole thing worked, a review, and out to production. Total time about 1h, maybe 90 min.&lt;/p&gt;
&lt;h2&gt;Built for reuse&lt;/h2&gt;
&lt;p&gt;The config-driven setup meant that pointing it at a different set of tables and buckets took a config edit. That&apos;s why a second region came together the next day in minutes. Same stack, different parameters.&lt;/p&gt;
&lt;h2&gt;What I did vs. what the AI did&lt;/h2&gt;
&lt;p&gt;Kiro acted like a personal assistant. It took my thoughts and wrote them into a spec. Organized them (I can be all over the place sometimes), and when I was ready it implemented everything. It confirmed with a successful build.&lt;/p&gt;
&lt;p&gt;Kiro didn&apos;t know we needed cross region replication or which tables we needed to save, and it wouldn&apos;t have thought to make the whole thing reusable and configuration driven. All that came from the experience of the human operator. But a human could not have built something this complete this quickly, or at least this one couldn&apos;t have.&lt;/p&gt;
&lt;h2&gt;One hour&lt;/h2&gt;
&lt;p&gt;With the help of AI I was able to build something quickly and with minimal issues. Generally those two things are in tension. It was successful because of the help of the friendly ghost (Kiro) and the combined experience building applications and knowing the underlying system.&lt;/p&gt;
&lt;p&gt;AI is good at exactly that part, taking a clear brief from an experienced operator and turning it into working infrastructure. Knowing how to use it is the difference.&lt;/p&gt;
</content:encoded><category>ai</category><category>aws</category><category>spec-driven-dev</category><category>distributed-systems</category><category>career</category></item><item><title>Why This Blog</title><link>https://waltergugenberger.com/blog/why-this-blog/</link><guid isPermaLink="true">https://waltergugenberger.com/blog/why-this-blog/</guid><description>Twelve years of shipping software with nothing public to show for it. A record of what I built, what broke, and what AI changed about how I work.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve been a software engineer for 12 years. I just had my work anniversary in early March. I started at a startup, ran my own consulting company, then bootstrapped another one. I&apos;ve worked in large enterprises too. I&apos;ve built a lot of things and I have little to show for it, in terms of artifacts. I can give you a resume but I&apos;ve forgotten more than what&apos;s on that resume.&lt;/p&gt;
&lt;p&gt;I want to start writing this blog to keep a record of what I&apos;ve done and what I am thinking about at the time of writing. It&apos;s not going to be your millionth tutorial on how to set up Claude Code (ok, maybe a little for one specific thing I did). But I want to show what worked for me and what didn&apos;t. If it helps someone, great. If it doesn&apos;t, also great.&lt;/p&gt;
&lt;p&gt;Whether AI is going to change the world or take your job, I don&apos;t know. I&apos;ve been using it to ship real software, and some of it impressed me and some of it was garbage. Like any tool.&lt;/p&gt;
&lt;p&gt;For me it&apos;s practical. My wife founded The Lafayette Company in Alexandria in 2015 and has built it into a seven-person PR firm over the past eleven years. I built Marquis for them, a full production system with DynamoDB, Lambda, EventBridge, Slack integration, the whole stack. I built Gilbert, a Rust CLI that talks to that platform. I coded half of both of them from my phone.&lt;/p&gt;
&lt;h2&gt;The phone thing&lt;/h2&gt;
&lt;p&gt;I have a family. Young kids. Anyone with small children knows the math. If something requires pulling out a laptop, finding a quiet spot, and getting into a flow state for two hours, it&apos;s not getting done. Not on a weeknight. Probably not on a weekend either.&lt;/p&gt;
&lt;p&gt;But I can write a spec on my phone during a lunch break. I can refine it at night after the kids are down. And with spec-driven development, where the spec is the source of truth and the AI implements against it, that&apos;s enough. I write the what and the why. The AI handles the typing.&lt;/p&gt;
&lt;p&gt;I set up Claude Code running remotely on an AWS instance and controlled it from my phone. I&apos;d write a spec, send it over, review what came back, refine, iterate. Marquis and Gilbert got built in the cracks of my day. Ten minutes here, twenty minutes there.&lt;/p&gt;
&lt;h2&gt;What I think about AI, honestly&lt;/h2&gt;
&lt;p&gt;If AI takes my job someday, so be it. Me refusing to learn it won&apos;t slow it down. I&apos;d rather be at the front of this wave than scrambling to catch up when it&apos;s too late.&lt;/p&gt;
&lt;p&gt;That doesn&apos;t make me a true believer either. I&apos;ve seen AI write clean, correct infrastructure code in minutes, and I&apos;ve seen it confidently generate something that would have taken down a production service. Using the AI is the easy part. The work is knowing what to ask for and validating what comes back. The design decisions stay yours, because the AI can&apos;t make them for you.&lt;/p&gt;
&lt;p&gt;The developer is still the one in charge. You&apos;re the one who says &quot;make this config-driven so other teams can use it.&quot; The AI just writes the code.&lt;/p&gt;
&lt;h2&gt;What&apos;s coming&lt;/h2&gt;
&lt;p&gt;I&apos;m going to write about the things I&apos;ve actually built and operated. For now, I am committing to write about these three things (I claim to have expertise in):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI-assisted development in practice&lt;/li&gt;
&lt;li&gt;Distributed systems and cloud architecture&lt;/li&gt;
&lt;li&gt;Career engineering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I recently built a disaster recovery framework during an operational crisis. A full IaC solution for exporting DynamoDB data to safe regions, spec-driven, built in about an hour. By noon the same day the entire org had adopted it. That&apos;s a story I want to tell. There are more like it.&lt;/p&gt;
&lt;p&gt;There&apos;s one more reason I&apos;m writing this, and it has nothing to do with tech. I know very little about some of the people in my family who came before me. They&apos;re not here to tell their story anymore. I don&apos;t want that to happen to mine. Someday my kids/grand kids might want to know what their papa was building and thinking about during these years. This is that record too.&lt;/p&gt;
</content:encoded><category>ai</category><category>career</category></item></channel></rss>