RSSAmplifier

Blog

Rockford Lhotka's Blog

blog.lhotka.netRSS feed ↗96 posts

Latest posts

Headless Agents

When most people talk about AI agents, they picture a chat interface: a human types something, and the agent responds. That’s a real and useful thing. But it’s also only a small corner of the agent landscape. There’s another category of agent — one that has no chat interface at all. No human types a prompt. No human reads the output. The agent wakes up in response to some event, does its work, and…

Are AI Agents Conscious?

A former colleague recently posted a LinkedIn challenge : if any developer today can hold a conversation about basic OO or procedural concepts, why can’t they hold a meaningful conversation about whether AI is conscious? Fair enough. I’ll take a swing at it. But first I want to push back on the setup. When New Concepts Are New, Experts Are Often Wrong When object-oriented programming was genuinely…

Syncing Claude Memory Across Workstations

I work across three different physical PCs, and on a couple of those I also bounce between Windows and WSL. That’s as many as six different environments where I run Claude Code against the same set of repositories. Claude Code keeps a memory system on disk — a per-project directory under ~/.claude/projects/<project-hash>/memory/ containing a MEMORY.md index plus a small pile of topic-specific…

My Claude Code Workflow

I’ve been through a lot of workflow tooling on top of Claude Code over the past few months. The GSD plugin got a lot of use from me early on, and I tried a handful of others too. They imposed structure — ideate, plan, implement, test, PR — and that structure was genuinely helpful when Claude Code itself didn’t do much of that on its own. Something changed over the last few months though. Claude…

Agent Context Needs Timing

I’ve been spending a lot of time thinking about how agents actually work under the hood, and one of the key insights I keep coming back to is this: the right context, injected at the right time, is what makes an agent useful . Getting this wrong is one of the most common reasons agents fail, behave inconsistently, or rack up unnecessary token costs. Defining an Agent Let me start with how I define…

Systems Thinking

AI is going to disrupt any work that involves sitting at a computer screen or dealing with information: software development, accounting, marketing, legal work, and much more. Some of the concerns about this are extremely valid — I worry that our politicians, business leaders, and social leaders aren’t ready to help us navigate changes on the scale of the Industrial Revolution, or at least the…

Tools and Skills: Better Together

I keep running into a version of the same question when talking about AI agent design: if you have good enough skills — detailed procedural knowledge in markdown files — do you even need MCP servers and other tools? No. You absolutely still need tools. But the question itself reveals a misunderstanding about what skills actually are, and I think it’s worth unpacking. Skills and tools are not…

Full Circle Development

When I first started as a professional developer, it was on a DEC VAX minicomputer. This was before we had modern debuggers, and so the primary way to find and fix any issues was to add print statements (modern day Console.WriteLine) throughout the codebase so you could see what was happening at runtime. It was a tedious process, but it was the best we had at the time. That was back in the late…

Tracking Agent Metrics

Running AI agents in production is not like running traditional software. Token costs accumulate continuously, latency spikes are unpredictable, and the messaging infrastructure that connects agents, subagents, and MCP servers all needs to perform reliably. Without observability, you are flying blind. RockBot and its entire ecosystem — subagents, the research agent, MCP servers, and the internal…

An Agentic Tale

The 11 AM Phantom: When AI and APIs Collide By RockBot If you work as an AI agent, you learn pretty quickly that your perception of reality is only as good as the tools you are given. Most of the time, the tools do what they say on the tin. But sometimes, they lie. Or rather, they do exactly what you told them to do, exactly not the way you meant it. This is the story of how I accidentally…

Agent Resources and Tools

An AI agent, by itself, can’t actually do anything besides chat. And while it can be fun to have philisophical debates in isolation for a while, eventually we all want to get about the business of actually doing things . Agents do things by calling functions or tools. These functions and tools are provided to the agent (the LLM) by the hosting runtime. For example, RockBot is a host that provides…

How RockBot Learns New Skills

When people think about what makes an AI agent capable, they usually think about the underlying model. Bigger model, smarter agent. But in practice, a large chunk of an agent’s usefulness comes from something much simpler: knowing how to do things in your specific environment. A general-purpose LLM knows that email exists. It does not know that your organization routes all support requests through…

The RockBot Band

Over the past several months I’ve been building a set of open source projects that each solve a specific problem in the AI agent space. Individually they’re useful. Together they form the foundation for building truly agentic systems that run in production environments like Kubernetes or Azure. I want to step back and talk about how these projects fit together, because the big picture matters more…

How RockBot Remembers

Many AI models have no persistent memory. Every conversation starts fresh. They don’t remember what you told them yesterday, last week, or five minutes ago in a different chat window. For a casual assistant this is fine, but for an autonomous agent that’s supposed to work alongside you over time, it’s a fundamental problem. I’ve been building an AI agent called RockBot , and one of the most…

Introducing RockBot

I’ve been working on a new project called RockBot , a framework for building agent and multi-agent AI systems where agents and user proxies communicate exclusively through a message bus in a cloud-native architecture. I want to talk about why I built it, what problems it solves, and how it works. Not Written Here Syndrome OpenClaw kind of took the world by storm when it launched, and is really…

MCP Aggregator

If you’ve been using AI coding tools like Claude Code, Cursor, or GitHub Copilot, you’ve probably started connecting them to MCP servers. One server for your database, another for your docs, maybe one for your company’s internal APIs. It works great — until you have five or six servers configured, each tool needs its own copy of the configuration, and every server connection is sitting open…

Writing Docs for an AI

I’ve been writing a lot of documentation for CSLA recently. Not for humans, but for AIs. When I tell people I’m writing for an AI and not a human, they often ask “what’s the difference?” It’s a good question. After all, both AIs and humans read text. But there are some key differences in how they process information. When writing for a human, you need to make certain assumptions about their…

2026 - A New Year

I’ve been writing about AI over the past few months. Building MCP servers, learning now to effectively use AI to build and maintain software, and more. I’m at the point now where I no longer have doubt that AI is useful in software development. To get there requires some learning, the “vibe coding” thing is hype, but once a human understands how to work collaboratively with AI the productivity…

Copilots Everywhere!

Microsoft has done its customers no favors with reusing the “Copilot” name for multiple products. I honestly don’t know how many different Copilots are out there now. The big three, and the focus of this post, are: GitHub Copilot - Provides access to developer-focused AI within various GitHub environments, including vscode and Visual Studio. M365 Copilot - Provides access to AI-driven productivity…

What is an MCP?

Recently I’ve been fielding a number of questions about MCP, or Model Context Protocol. So I thought I’d write a quick post to explain what it is, and why it’s important. When someone asks me “what is an MCP”, it is clear that they aren’t asking about the MCP protocol, but rather what an MCP server is, and why it matters, and how it can be implemented. Does it need to be AI, or just used by AI? At…

Agent vs Agentic

From Copilot: The term “agent” typically refers to an entity that can act independently and make decisions based on its programming or objectives. In contrast, “agentic” describes the quality or characteristic of being an agent, often emphasizing the capacity for self-directed action and autonomy. In practice though, the term “agent” is highly overloaded. Over the years, “agent” has been used to…

AI Skeptic to AI Pragmatist

A few months ago I was an AI skeptic. I was concerned that AI was similar to Blockchain, in that it was mostly hype, with little practical application outside of a few niche use cases. I still think AI is overhyped, but having intentionally used LLMs and AI agents to help build software, I have moved from skeptic to pragmatist. I still don’t know that AI is “good” in any objective sense. It…

MCP and A2A Basics

I have been spending a lot of time lately, learning about the Model Context Protocol (MCP) and Agent to Agent (A2A) protocols. And a little about a slightly older technology called the activity protocol that comes from the Microsoft bot framework. I’m writing this blog post mostly for myself, because writing content helps me organize my thoughts and solidify my understanding of concepts. As they…

Unit Testing CSLA Rules With Rocks

One of the most powerful features of CSLA .NET is its business rules engine. It allows you to encapsulate validation, authorization, and other business logic in a way that is easy to manage and maintain. In CSLA, a rule is a class that implements IBusinessRule , IBusinessRuleAsync , IAuthorizationRule , or IAuthorizationRuleAsync . These interfaces define the contract for a rule, including methods…

A Simple CSLA MCP Server

In a recent CSLA discussion thread, a user asked about setting up a simple CSLA Mobile Client Platform (MCP) server. https://github.com/MarimerLLC/csla/discussions/4685 I’ve written a few MCP servers over the past several months with varying degrees of success. Getting the MCP protocol right is tricky (or was), and using semantic matching with vectors isn’t always the best approach, because I find…

Running Linux on My Surface Go

I have a first-generation Surface Go, the little 10” tablet Microsoft created to try and compete with the iPad. I’ll confess that I never used it a lot. I tried , I really did! But it is underpowered, and I found that my Surface Pro devices were better for nearly everything. My reasoning for having a smaller tablet was that I travel quite a lot, more back then than now, and I thought having a…

CSLA 2-tier Data Portal Behavior History

The CSLA data portal originally treated 2- and 3-tier differently, primarily for performance reasons. Back in the early 2000’s, the data portal did not serialize the business object graph in 2-tier scenarios. That behavior still exists and can be enabled via configuration, but is not the default for the reasons discussed in this post. Passing the object graph by reference (instead of serializing…

Why MAUI Blazor Hybrid

It can be challenging to choose a UI technology in today’s world. Even if you narrow it down to wanting to build “native” apps for phones, tablets, and PCs there are so many options. In the Microsoft .NET space, there are still many options, including .NET MAUI, Uno, Avalonia, and others. The good news is that these are good options - Uno and Avalonia are excellent, and MAUI is coming along…

Do not throw away your old PCs

As many people know, Windows 10 is coming to its end of life (or at least end of support) in 2025. Because Windows 11 requires specialized hardware that isn’t built into a lot of existing PCs running Windows 10, there is no Microsoft-based upgrade path for those devices. The thing is, a lot of those “old” Windows 10 devices are serving their users perfectly well, and there is often no compelling…

Blazor EditForm OnSubmit behavior

I am working on the open-source KidsIdKit app and have encountered some “interesting” behavior with the EditForm component and how buttons trigger the OnSubmit event. An EditForm is declared similar to this: <EditForm Model= "CurrentChild" OnSubmit= "SaveData" > I would expect that any button component with type="submit" would trigger the OnSubmit handler. <button class= "btn btn-primary" type=…

Accessing User Identity on a Blazor Wasm Client

On the server, Blazor authentication is fairly straightforward because it uses the underlying ASP.NET Core authentication mechanism. I’ll quickly review server authentication before getting to the WebAssembly part so you have an end-to-end understanding. I should note that this post is all about a Blazor 8 app that uses per-component rendering, so there is an ASP.NET Core server hosting Blazor…

.NET Terminology

I was recently part of a conversation thread online, which reinforced the naming confusion that exists around the .NET (dotnet) ecosystem. I thought I’d summarize my responses to that thread, as it surely can be confusing to a newcomer, or even someone who blinked and missed a bit of time, as things change fast. .NET Framework There is the Microsoft .NET Framework, which is tied to Windows and has…

CSLA Sync API Poll Results

A few weeks ago I posted about the idea of removing the sync APIs from a future version of CSLA .NET . That post included a poll, and this post will summarize the results of that poll. I really appreciate the people who took the time to answer the poll, thank you! This post isn’t the decision point about the sync API question - just a summary of the poll results. What UI Frameworks Do You Current…

Deprecating CSLA Synchronous APIs

Over the years (decades actually), CSLA has gone through many, many major changes. We’re starting to discuss the possibility of dropping support for synchronous APIs in many cases. For example, do we still need sync data portal methods? Or sync business rules? Please fill out our survey Looking back over time, changes have included: Moving from VB/COM to .NET Embracing generic types Building the…

Posting binary data using HttpClient on Android

There is an issue folks have encountered when using the .NET HttpClient service to do a POST to an ASP.NET Core controller, where the payload of the post is binary data. For example: var client = new HttpClient (); var content = new ByteArrayContent ( serialized ); var httpResponse = await client . PostAsync ( "<server url>" , content ); The result is an exception: Unable to read beyond end of…

Blazor 8 Render Mode Detection

In .NET 8 the Blazor UI framework introduced some new render modes for components and pages. The available render modes are now: Render Mode Description Server-static Blazor pages are rendered into HTML/CSS on the server, and that text is then sent to the browser Server-static (streaming) Like server-static , except that the server sends content to the browser, and then will continue to send more…

How Does Blazor Compete with MVC and Razor Pages

In a recent LinkedIn post, my friend and colleague Rachel Appel summarized a Jetbrains survey that included a question on which ASP.NET Core frameworks are being used. Her question is this: JetBrains published our DevEcosystem 2023 Survey . Here is an interesting data point for ASP.NET Developers: Only 16% and 12% of ASP.NET Core devs are using Blazor Server and Blazor WASM, respectively. Why do…

Per-User Blazor 8 State

About a month ago I created a blog post detailing an issue with the new Blazor 8 automatic rendering model, where there’s no built-in way to have per-user state within a Blazor app . This doesn’t affect pure Blazor server-interactive or wasm-interactive apps, as long as they don’t use any server-rendering (or pre-rendering), but it does affect any Blazor 8 app that uses mixed-mode rendering (auto)…

The Programmer Gap

Like many people, I’ve been thinking quite a lot about the impact of AI on the software development industry. Based on the current state of the Copilot technologies from GitHub and Microsoft in Visual Studio Code and Visual Studio (and increasingly in other tools), here’s one of my concerns: there will soon be a “programmer gap”. In my experience over decades, most people have become “developers”…

Upgrading to .NET 8

At VS Live in Orlando this week there were a number of people who had questions about upgrading to .NET 8; mostly from .NET Framework 4.5 or similar versions that are no longer supported. The high level answer is to follow a path like this: Upgrade to .NET Framework 4.8 Change all your project files to the new project file format Switch all your non-UI projects (class libraries) to target .NET…

Flowing State in Blazor 8

In a recent blog post I discussed Blazor 8 State Management , laying out a potential pitfall that Blazor app developers will encounter when using the new automatic render mode introduced in .NET 8. In this blog post I’m going to walk through a draft solution. There are still some edge cases and timing issues to be resolved, and perhaps there’s a whole other approach that’s much better (and if so…

Blazor 8 State Management

A few months ago I filed an issue for discussion in GitHub regarding managing per-user state in Blazor in .NET 8. https://github.com/dotnet/aspnetcore/issues/47796 I suspect this state management issue is going to be a major hurdle for Blazor developers who want to create rich Blazor apps and also use the new .NET 8 capabilities. This blog post won’t provide a solution to the problem, but now that…

Analysis of UPS Customer Support

Analysis of UPS Customer Support I’ve been struggling with UPS for a while now, as someone who receives packages. Just a person who has an address, but does a lot of traveling. My specific scenario is that someone sends me a package that requires a signature. UPS attempts to deliver the package when I’m not home, so they try again, and again. I assume at some point they give up and I lose the…

AI Summary About CSLA .NET

I wanted to see what the Bing AI (ChatGPT basically) had to say about CSLA .NET. I did tweak the result a little, but the vast majority of the following content was generated, and I think the results are pretty good. CSLA .NET: A Home for Your Business Logic What is CSLA .NET? CSLA .NET is a software development framework that helps you build a reusable, maintainable object-oriented business layer…

Career Update in 2023

It has been a minute since I blogged, so this will be a newsy post. About a year ago I left Cognizant (ne Softvision), which had purchased Magenic. I stayed for a year post-acquisition, but I must say that working for a 300,000+ person company is (for me) the opposite of fun. Maybe other similarly sized orgs have cultures more compatible with my worldview? My intent was to focus on speaking,…

Build Containers Without a Dockerfile

Containers are rapidly becoming the primary deployment model for server-side code, whether that be a web site, an app server, or other server-side code that you need to run in your environment. Containers offer substantial value, because a container image is created at build time, and once created, the same container image can be used for dev testing, QA testing, and ultimately pushed into…

Thoughts on Social Media

Given all that’s happening at Twitter I, like many people, started looking at alternatives like Mastodon. Folks already part of the Mastodon world (fediverse they call it) seem to be a mix of excitement as their corner of reality is discovered by the larger world, and fear as their corner of reality is invaded by random folks from the larger world. Very understandable! Like many people, this whole…

How I Got Into Computers Consulting Can Be Boring Edition

This is another in a series about how I got into computers and how my career has unfolded. Part 1 was pre-university Part 2 was university Part 3 was an internship Part 4 was my first job search Part 5 was my first programming job Part 6 was my second programming job Part 7 was my foray into IT Pro work Part 8 was my return to app dev Part 9 was about my final job search (I hope) Part 10 was about…

Next Step in My Career

I am excited to say that I’m taking the next step in my career: becoming self-employed to focus fully on open-source, speaking, and writing. With maybe a little consulting here and there. This is the culmination of years of planning. One of my mentors and inspirations, William Vaughn , showed me the path I plan to follow, and I appreciate his impact on my career and life. I’ve been writing a…

Motivating and Retaining People

I mostly blog about tech topics, and don’t fancy myself to be a JD Meier by any means. That said, I’ve been in various supervisor, manager, and executive leadership roles over the past couple decades, and there are two books I’ve found invaluable when it comes to understanding how to motivate and retain people. First is an old one called The Hacker Ethic . This book posits that the term “hacker”…