Cadence Over Volume — Orchestrating Multiple Projects with AI Agents KittyClaw, a kanban orchestrator for AI agents, enables multiple projects to run in parallel with persistent memory and shared capabilities. The infrastructure uses a preamble, automations, and per-agent memory files to ensure lessons compound across runs, with a central processor handling shared tasks like image generation. This approach prioritizes cadence over volume, allowing agents to learn from mistakes and reuse skills across projects. Running multiple projects in parallel with AI agents produces a counter-intuitive effect: without a compounding infrastructure, every run starts from zero. Memory stays local to the project, discovered patterns don't migrate, and cadence depends entirely on human availability. What follows describes the infrastructure that solves this problem — and why regularity is its primary condition. Three live projects feed this piece: Bloomii https://bloomii.fr/ , a constructive-journalism media outlet covering social and environmental alternatives; Kalceo https://kalceo.fr/ , a regulatory B2B SaaS for French construction contractors; and Ekioo https://ekioo.com/en , the agent-fleet R&D project behind this article. All three run on KittyClaw https://kittyclaw.dev/ , a kanban orchestrator for AI agents. Each project hosts a .agents/ directory with four elements: .agents/ ├── preamble.md context injected into every agent run ├── automations.json trigger pipelines ├── {agent}/ │ ├── SKILL.md stable domain instructions │ └── memory.md accumulated learnings, run after run preamble.md is the coherence vector. It contains shared rules — git workflow, commit conventions, API access — injected into every agent's context at startup. What lives in preamble.md doesn't need to be repeated in every SKILL.md . automations.json defines the pipelines. The core automation, assignee-dispatch , runs three actions as soon as a ticket moves to Todo with an assignee: { "id": "assignee-dispatch", "trigger": { "type": "ticketInColumn", "columns": "Todo" }, "conditions": { "type": "assignedTo", "slugs": "programmer", "content-writer", "qa-tester", "..." }, { "type": "ticketCountInColumn", "columns": "InProgress" , "sameAssignee": true, "operator": "==", "value": 0 } , "actions": { "type": "moveTicketStatus", "to": "InProgress" }, { "type": "runAgent", "agent": "{assignee}", "model": "claude-sonnet-4-6" }, { "type": "commitAgentMemory", "agent": "{assignee}" } } The ticketCountInColumn == 0 condition prevents uncontrolled parallelism: an agent won't start a new ticket while it has one in progress. The final action, commitAgentMemory , automatically persists the agent's memory after every run — this is the key to compounding. Where most AI agent setups remain stateless, memory.md introduces structured persistent state. Each agent maintains a file of lessons with a +N counter that tracks how many times each lesson has been reapplied: API / tooling +5 - curl on Windows mangles UTF-8 in JSON bodies. Use python3 urllib.request instead. +2 - PR creation: gh not available; az repos pr create has permission errors. +2 SVG inline in Markdown +3 - NEVER use