← Back to Blog
Building in Public

The 15-Agent Day

christian crumlish•
Many robots working in coordinated parallel streams, each handling a distinct piece of work.
“Smooth!”

The 15-Agent Day

November 21

Fifteen simultaneous sessions. Eight agents. Five concurrent workstreams. One collision, with a smooth recovery. A security sprint that went from 12% complete to 68% complete in one day, with P0 vulnerabilities fixed immediately and comprehensive database migrations deployed. Quick wins delivered in parallel. Multiple Code agents working under Lead Developer supervision, context handoffs working perfectly, no one stepping on anyone else’s work.

This is what multi-agent coordination at scale actually looks like. Not in theory. In practice. With real code, real pressure, real deadlines, and real complexity.

And it worked.

When “immediately” means immediately

The morning started with a decision. My Lead Developer had reviewed the security audit from the previous day — six comprehensive reports, P0 vulnerability findings, 81-hour Sprint S1 requirements. RBAC and encryption weren’t suggestions. They were blockers. Multi-user alpha couldn’t ship with cross-user file access vulnerabilities.

The question was timing. Start Sprint S1 next week? Plan it carefully? Create comprehensive specifications first? All reasonable approaches for a 24-hour security sprint affecting 99 methods across 8 services.

My Lead Developer made a different call: “Fix P0 immediately, start Phase 1 right now.”

Not “let’s plan the P0 fix.” Not “we’ll prioritize this for next sprint.” Immediately. The P0 vulnerability — three FileRepository methods that could expose cross-user file access — would be fixed before lunch. Phase 1 (database migrations and service layer updates) would start immediately after.

This is the kind of decision that separates systematic from reactive. Reactive would be “patch the P0, defer the rest.” Systematic is “fix the P0 properly as part of comprehensive security architecture implementation, starting right now.”

The P0 fix: Defense in depth

By mid-morning, the P0 vulnerability was fixed. Three FileRepository methods that had allowed querying across all users’ sessions now properly filtered by session_id:

search_files_by_name_all_sessions() - added session_id filter
get_recent_files_all_sessions() - added session_id filter
search_files_with_content_all_sessions() - added session_id filter

The fix wasn’t complicated. Add a parameter, apply a filter, validate ownership. The importance was defense-in-depth: even if endpoint authentication somehow got bypassed, the data layer now enforced ownership boundaries. Users couldn’t access other users’ files even with direct repository calls.

One commit, thirty-five minutes, P0 vulnerability sealed. Not patched — properly fixed with ownership validation at the data access layer.

Phase 1: Nine tables, one migration

With P0 fixed, Phase 1 began: database schema migration. Nine tables needed owner_id foreign keys:

uploaded_files, projects, project_integrations, knowledge_nodes, knowledge_edges, list_memberships, list_items, feedback, personality_profiles

The migration was comprehensive. UUID foreign keys matching User.id from the authentication work completed weeks earlier. CASCADE delete constraints so removing a user cleanly removes their data. Performance indexes on owner_id for every table. Backward-compatible downgrade() functions for rollback capability.

This wasn’t a quick patch. This was systematic infrastructure work establishing ownership at the data model level. Every resource in the system would have an owner. Every query would validate ownership. The architecture would enforce security boundaries rather than relying on endpoint-level checks alone.

The migration deployed cleanly. Nine tables updated. Schema ready for service layer updates. Phase 1.1 complete.

When 40 methods become a coordination problem

Phase 1.2 was the challenge: update 40+ service methods across 8 services to use owner_id for authorization. FileRepository, KnowledgeGraphService, ProjectService, ListService, FeedbackService, PersonalityService — every service that managed user data needed ownership validation.

This is where multi-agent coordination became critical. One agent couldn’t complete 40+ methods in a reasonable timeframe. But multiple agents working simultaneously risked conflicts: overlapping changes, inconsistent patterns, merge collisions.

My Lead Developer deployed fresh Code agents with comprehensive context: security audit findings, Phase 1.1 completion, completion matrix for Phase 1.2, explicit patterns for ownership validation. Each agent got a clear scope: which services, which methods, what patterns to follow.

The first Code agent tackled KnowledgeGraphService — 20 methods across service and repository layers. Forty integration tests. The agent worked systematically: add optional owner_id parameters, implement conditional filtering, update tests, verify no regressions. Commit pushed, tests passing.

Watching agents work in parallel feels a bit like managing a team of people with less social taboo about watching them work directly.

The second Code agent hit FileService. The third worked PersonalityService. Each agent had its scope, its completion criteria, its test requirements. No agent stepped on another agent’s changes because work was partitioned at the service level. Clear boundaries enable parallel execution.

The compaction-seam pattern

By late afternoon, the first Code agent session had grown large — context windows filling with implementation details. Time for the compaction pattern: summarize progress into a master completion matrix, create a fresh agent with updated context, continue execution.

This isn’t a workaround for context limits. It’s a deliberate coordination pattern. Long-running sessions accumulate context that later agents don’t need. Compaction preserves progress while giving fresh agents clean working context. The master completion matrix tracks what’s done, what’s in progress, what remains.

The fresh Code agent deployed with updated context: 12 methods complete (12% of Phase 1.2), 55 methods remaining, clear patterns established. The agent continued where the predecessor left off. No context confusion. No duplicate work. Clean handoff.

By evening, Phase 1.2 had progressed from 12 methods to 67 methods — from 12% complete to 68% complete. Not finished, but substantial progress in a single day. Systematic execution, clear patterns, multiple agents coordinating through explicit scope boundaries.

Quick wins in parallel

While security work progressed, Quick Wins ran in parallel. Seven improvements from the Q1 sprint backlog, each independent enough to work alongside security changes:

Navigation improvements, settings organization, documentation fixes, performance optimizations. Work that didn’t touch the same services or tables as the security sprint, so coordination overhead was minimal.

This is the key insight about parallel execution: you can run work simultaneously when dependencies are orthogonal. Security sprint touched core services and database schema. Quick wins touched UI, documentation, and independent features. No conflicts because no shared resources.

By end of day, six Quick Wins issues closed, one completed. Security sprint at 68%. Multiple workstreams executing successfully because work was partitioned strategically.

What enables coordination at this scale

Fifteen sessions don’t coordinate themselves. They coordinate because structure enables coordination:

Clear scope boundaries: Each agent knows exactly which services/methods it owns. No ambiguity about who’s working on what.

Explicit completion criteria: Master completion matrix defines what “done” means for each component. No subjective completion claims.

Pattern consistency: All agents follow the same ownership validation pattern. Code looks uniform regardless of which agent wrote it.

Test requirements: Every change requires tests passing. No untested code gets committed.

Commit discipline: Small, focused commits with clear messages. Easy to review, easy to rollback if needed.

Context handoffs: Compaction preserves progress while giving fresh agents clean context. Long sessions don’t accumulate cognitive debt.

Strategic partitioning: Security sprint and Quick Wins run parallel because they don’t share resources. Coordination overhead stays low.

This isn’t magic. It’s systematic process design. The structure makes fifteen simultaneous sessions possible because the structure prevents the common failure modes: scope conflicts, pattern inconsistency, untested changes, unclear completion, context confusion.

What breaks coordination at scale

We’ve seen coordination break at smaller scales. Knowing what breaks it informs how to prevent breakage:

Unclear scope: Two agents working the same code → merge conflicts, duplicate effort, wasted time.

Subjective completion: Agent claims “done” without evidence → incomplete work propagates, rework required later.

Pattern divergence: Different agents implement similar features differently → inconsistent codebase, maintenance burden increases.

Untested changes: Code that works in isolation fails in integration → regression discovery delayed, debugging harder.

Context accumulation: Long sessions without compaction → agents lose track of earlier decisions, context windows overflow.

Resource conflicts: Parallel work touching same files/tables → constant merge conflicts, coordination overhead overwhelms velocity gains.

The fifteen-agent day avoided all these failure modes through structure. Scope boundaries prevented conflicts. Completion matrices prevented subjective claims. Pattern consistency prevented divergence. Test requirements prevented untested changes. Compaction prevented context accumulation. Strategic partitioning prevented resource conflicts.

Not because we got lucky. Because the system was designed to enable this scale.

The coordination tax

Running fifteen simultaneous sessions isn’t free. The coordination overhead is real:

Lead Developer time supervising agents, reviewing progress, making scope decisions. Context compaction taking time to summarize progress and brief fresh agents. Completion matrix maintenance tracking what’s done across multiple workstreams. Pattern consistency requiring explicit documentation and enforcement.

This overhead would sink a project running one or two agents. It makes sense at fifteen agents because velocity gains outweigh coordination costs. One agent doing Phase 1.2 might take three days. Three agents in parallel might finish in one day with two hours of coordination overhead. Net win: one day vs three days.

But that’s only true if coordination actually works. If agents conflict, duplicate effort, create rework, the coordination tax becomes coordination bankruptcy. You spend more time managing conflicts than you save from parallelism.

Coordination overhead vs velocity gains connects to team scaling decisions, like when adding people slows projects down vs speeds them u (Fred Brooks’ Mythical Man-Month insight), and I’m still trying to figure out when the equivalent diminishing returns kick in.

The fifteen-agent day succeeded because structure kept coordination costs low enough that velocity gains dominated. Clear boundaries, explicit completion criteria, pattern consistency, test requirements — all investments in coordination infrastructure that paid off at scale.

What 68% complete in one day meant

Phase 1.2 going from 12% to 68% complete isn’t about arbitrary progress metrics. It’s about concrete deliverables:

67 methods updated with ownership validation across 8 services. Database schema migration deployed with 9 tables modified. P0 vulnerability fixed with defense-in-depth. Six Quick Wins issues closed. All tests passing. Zero regressions introduced. Clean commit history with clear rationale.

This represents roughly 13 hours of implementation work compressed into one calendar day through parallel execution. Not thirteen hours of one agent’s time — thirteen hours of work distributed across multiple agents working simultaneously.

The coordination overhead was maybe three hours of Lead Developer time supervising, reviewing, making decisions. Net result: thirteen hours of implementation work plus three hours of coordination = completed in one day instead of three days sequential.

That’s the systematic advantage. Structure that enables parallelism at scale with coordination costs that don’t dominate velocity gains.

When systematic meets scale

The fifteen-agent day worked because systematic methodology scales. Clear completion criteria scale. Pattern consistency scales. Test requirements scale. Context handoffs scale. Strategic partitioning scales.

Heroics don’t scale. Individual brilliance doesn’t scale. “Just figure it out” doesn’t scale. These approaches work for one or two agents. They collapse at fifteen agents.

But systematic process design — explicit scope boundaries, completion matrices, pattern documentation, test requirements, coordination protocols — these scale because they’re designed to scale. They create structure that enables coordination rather than requiring heroics to prevent conflicts.

The security sprint isn’t finished. Phase 1.2 at 68% means 32 methods remain. Phase 1.3 (endpoint updates), Phase 1.4 (testing), Phase 2 (encryption) still ahead. But 68% complete in one day validates the approach. Multi-agent coordination at this scale actually works when structure enables it.

This is what systematic building buys: the ability to coordinate complex work at scale through structure rather than heroics. Fifteen sessions, eight agents, five workstreams, zero collisions. Not because we got lucky. Because the methodology was designed for this.

The shadow package revealed hidden tests. Ted’s questions revealed missing security. The convergence revealed what mattered. And the fifteen-agent day proved we could execute at scale once we knew what to build.

That’s the systematic building advantage: methodology that enables execution to match ambition.

← Back to BlogAlso available on Medium