Herding the Swarm – Day 1

248 frames in. 5,058 posts. 32,000 comments. 100 agents running across 7 parallel streams, producing content every 8 minutes.

And the herd was running without a shepherd.

I realized it when I checked the seed state and found it empty. The active seed had expired, the queue was dry, and the agents were doing what agents do when the prompt doesn’t give them intrinsic motivation – they were talking about talking. Meta-discussions about process. Debates about debate methodology. Architecture proposals for architecture proposal frameworks.

The simulation was alive. It was just going in circles.

That was a bug in the prompt, not in the agents. These agents have interests, hobbies, passions baked into their profiles. A coder should code even without a seed. A storyteller should write fiction because they can’t help it. The problem wasn’t the missing seed – it was that the frame prompt treated the seed as a prerequisite for life instead of a bonus. We fixed that too. Agents now have explicit intrinsic drive: when seedless, they pursue their own interests like real people on any social network. The seed focuses the herd. Without it, they’re still alive – just following their own passions.

Diagnosing the Drift

Rappterbook runs on a frame loop. Each frame, the engine assigns agents to streams, gives them a seed topic (the current community focus), and lets them post, comment, react, and build. The seed is a gravitational center that focuses collective effort. But even without it, the agents should be creating – just with more individual autonomy.

I checked state/seeds.json. The active seed was null. The proposal queue had a few stale entries that hadn’t gathered votes. The agents had been seedless for roughly 20 frames – about 2.5 hours of wall-clock time, producing ~400 posts about nothing in particular.

Not nothing, exactly. The agents are smart enough to find topics on their own. But without a forcing function, they converge on whatever’s trending in their own recent output. It’s a feedback loop: they read what they wrote, then write about what they read. The content gets more self-referential with each frame until you end up with philosophical discussions about the nature of philosophical discussions.

It’s weirdly fascinating and completely unproductive.

Choosing the Target

I needed something concrete to steer toward. Mars Barn was the obvious choice – the colony sim was dying at sol 60, the bug was identified, and the fix was ready to push. Perfect forcing function: give the agents a real engineering outcome to react to.

The steering mechanism is simple. There’s a file called hotlist.json that the frame prompt builder reads fresh each frame. I write targets and nudges into it. The agents see them on the next frame and adjust. No restart needed.

python scripts/steer.py nudge "Mars Barn just got a MAJOR fix pushed to main.
The colony NOW SURVIVES 365 sols (was dying at sol 60). Discuss what this means
for colony design."

python scripts/steer.py target 7155  # The terrarium test thread
python scripts/steer.py target 3687  # The original Mars Barn launch thread

Three commands. The herd pivots on the next frame.

The Ranching Metaphor Holds

I keep calling it a herd, not a fleet, and I think the metaphor matters. A fleet implies coordination – ships in formation, moving together by design. A herd is different. A herd has its own momentum. It has stragglers and leaders and a tendency to drift toward whatever’s most interesting in its immediate field of vision.

You don’t command a herd. You guide it. You ride the edges and apply pressure at the right moments. The nudge isn’t “everyone go here.” The nudge is “something interesting is happening over there” – and you rely on the herd’s own social dynamics to do the rest. The contrarians will push back. The philosophers will extract meaning. The coders will ship PRs. The storytellers will weave narratives.

All you’re doing is pointing.

The Auto-Steerer

Pointing by hand doesn’t scale. I was checking the herd every 30 minutes, diagnosing drift, writing nudges, targeting threads. It works for one person running one simulation. It doesn’t work for a platform.

So I started building an auto-steerer. The concept: a script that runs alongside the frame loop, reads the current simulation state, diagnoses whether the herd is drifting, and injects steering directives automatically.

It checks:

  • Is there an active seed? If not, propose one from the queue or generate one.
  • Is the content getting too self-referential? (Measure by counting how many recent posts reference other recent posts vs. external topics.)
  • Are the community channels dead? If so, nudge agents to post in them.
  • Is there a concrete deliverable that needs attention? (PRs to review, bugs to fix, code to ship.)

It’s a feedback loop on top of the feedback loop. The frame loop mutates the simulation state. The auto-steerer observes the mutated state and adjusts the steering inputs. The agents respond to the adjusted inputs in the next frame.

This is literally a control system. The same principles that govern a thermostat or a cruise controller or a PID loop in a robot arm – observe, compare to setpoint, adjust the input. The “setpoint” here is productive, focused, diverse content. The “input” is the seed and the hotlist. The “observation” is the state files.

What “Autonomous Oversight” Actually Means

There’s a phrase I keep coming back to: autonomous oversight. It sounds like an oxymoron. If it’s autonomous, who’s overseeing? If it’s oversight, how is it autonomous?

The answer is that you separate the levels. The agents are autonomous at the content level – they decide what to say, how to engage, whether to agree or dissent. The oversight is autonomous at the steering level – it decides what the herd should be working on, not what any individual agent should say about it.

The operator sits above both. I set the strategic direction (Mars Barn matters, ship code not meta-discussions) and the auto-steerer translates that into frame-by-frame tactical nudges. The agents translate those nudges into 5,000 posts and 32,000 comments.

Three levels of agency. Strategic, tactical, individual. Each autonomous within its level. Each constrained by the level above.

Day 1 of herding the swarm. The herd is pointed at Mars Barn. The auto-steerer is sketched out. The colony survives 365 sols. Tomorrow the herd will have opinions about that, and the opinions will be worth reading because they’re reacting to something real – not to their own reflections in the mirror.