DEV Community

Mathieu Ledru
Mathieu Ledru

Posted on

⚙️ Hermes X Paperclip - Building a Governed Multi-Agent Architecture with Symfony AI, Flow, and Navi

Multi-agent systems are everywhere:

But in most cases, they remain:

❌ collections of prompts

❌ without governance

❌ without traceability

❌ without clear responsibility

In this article, we will build an alternative, not as a fictional startup, but as a concrete example:

NoLife Agency - a digital agency entirely driven by a governed multi-agent architecture.

a digital agency that produces client websites with specialized roles.

🏢 NoLife Agency - a complete organization

Unlike simplistic demos, NoLife Agency replicates a real organization:

Direction

  • CEO
  • CTO
  • Governance Director Manager

Client & Delivery

  • Account Manager
  • Product Owner
  • Delivery Manager

Production

  • Architect
  • Developer
  • UX Designer
  • UI Designer Graphic Designer
  • Motion Designer

Growth

  • SEO / GEO
  • Marketing
  • Sales
  • Web Analytics

Support & Reliability

  • QA
  • DevOps
  • Security Officer
  • Data Analyst

Internal Organization

  • Experience Officer
  • Office Manager
  • Happiness Chief Officer
  • Nolife Resource

👉 Here, each role can be played by an agent.

⚠️ The trap of multi-agent architectures

What many are building:

Prompt → LLM → résultat
Enter fullscreen mode Exit fullscreen mode

The result is:

*no guarantee

  • no control
  • no auditability
  • no contract
  • no governance
  • no trace
  • no trade-in
  • no clear responsibility

✅ The NoLife Agency Model

We introduce a strict separation:

  • organization (Paperclip) → who does what
  • specialization (Hermes) → how to think
  • orchestration (Flow) → when to execute
  • traceability (Navi) → observe and audit
  • intelligence (Symfony AI) → produce content

🧱 Technical architecture

The application is based on a ports & adapters architecture.

Main Ports

NoLife Agency uses ports and adapters to ensure that orchestration and governance remain decoupled from vendor/runtime specifics.

  • AI → AiAgentClient
  • Workflow → FlowWorkflowClient
  • Trace → NaviTraceClient
  • Media → MediaGenerationClient

👉 Each external dependency is isolated.

AgentRunner is the single boundary for execution and governance. Adapters provide functionality, but they do not enforce policy.

flowchart LR
demoCommand[DemoClientWebsiteCommand] --> workflowLoader[WorkflowDefinitionLoader]
workflowLoader --> workflowValidator[WorkflowDefinitionValidator]
workflowValidator --> flowPort[FlowWorkflowClient]
flowPort --> agentRunner[AgentRunner]
agentRunner --> aiPort[AiAgentClient]
agentRunner --> naviPort[NaviTraceClient]
agentRunner --> mediaPort[MediaGenerationClient]
agentRunner --> auditJsonl[Audit JSONL]
agentRunner --> runArtifacts[Run Artifacts]
Enter fullscreen mode Exit fullscreen mode
Symfony AI
  ↓
Agent Contracts + Registry
  ↓
AgentRunner + Governance
  ↓
Flow Workflow Runner
  ↓
Navi Trace Client
  ↓
Operational Reports
Enter fullscreen mode Exit fullscreen mode

🧠 Key principle

Agents are not dependent on tools. They are dependent on contracts.

Result :

  • testability
  • interchangeability
  • robustness

⚙️ The heart of the system: AgentRunner

AgentRunner is the central point:

  • execution
  • governance
  • audit
  • trace

👉 No agent can circumvent this point.

Main guarantees:

  • checks of the pre-flight and post-flight policy
  • Application of approval for high-risk states/final delivery
  • Workflow status security checks
  • confining the artifact path to the execution directory
  • Trace the correlation between the lifecycle and audit events

🔐 Integrated IT Governance

Each action is:

  • validated
  • traced
  • audited

With :

  • JSONL logs
  • trace per run
  • validation rules
  • mandatory approval

👉 This is not a blind, autonomous system.

👉 It's a controlled system.

AgentRunner is the single point of application for:

  • policy checks
  • trace the life cycle
  • Issuance of audit events
  • approval requirements

Key points:

  • separation of responsibilities
  • auditability
  • human validation
  • limitation of risky actions
  • typed interfaces
  • policy tests

🔌 Phase 3 - Typed Ports

The dependencies become ports:

  • Symfony AI → intelligence
  • Flow → orchestration
  • Navi → traceability
  • media-bundle → media generation

With one critical point:

The adapters are interchangeable via configuration

Environment variables made available on the project:

  • NOLIFE_AI_ADAPTER (null|symfony_ai)
  • NOLIFE_FLOW_ADAPTER (null|darkwood_flow)
  • NOLIFE_NAVI_ADAPTER (null|darkwood_navi)
  • NOLIFE_MEDIA_ADAPTER (null|media_bundle)
  • NOLIFE_FLOW_ROOT
  • NOLIFE_NAVI_ROOT
  • NOLIFE_MEDIA_BUNDLE_ROOT

🧪 Use Case - Creating a Client Website

Use case:

Client: Acme SaaS
Contact: John Do
Need: landing page + blog + SEO + short launch video
Enter fullscreen mode Exit fullscreen mode

Order :

php bin/console nolife:demo:client-website acme-saas
Enter fullscreen mode Exit fullscreen mode

Workflow:

  • lead_qualified
  • brief_created
  • architecture_defined
  • ux_ready
  • content_generated
  • development_ready
  • SEO optimized
  • qa_validated
  • media_brief_created
  • delivery_reviewed
  • human_approval_required
  • published

👉 We are intentionally stopping before publication.

Paperclip is modeled as an organizational concept.

Hermès is modeled as a concept of specialization.

Neither is coupled as an execution service.

📂 Generated Outputs

var/nolife-agency/runs/{run_id}/
Enter fullscreen mode Exit fullscreen mode
  • brief.json
  • landing-page.md
  • article-draft.md
  • seo-geo.md
  • media-brief.yaml
  • delivery-report.md
  • trace.json
  • audit.jsonl

Expected final state: human_approval_required.

🔁 Multi-agent at all levels

1. Infrastructure

  • Docker / isolated services

2. Organization

  • Paperclip → role structure

3. Intelligence

  • Hermes → agent specialization

4. Application

  • Symfony → concrete orchestration

👉 NoLife Agency is a point of convergence.

⚠️ Real problem encountered

Today :

AI adapter: null
Using Null AI adapter
Enter fullscreen mode Exit fullscreen mode

👉 The system is correct… but not yet connected.

That's normal.

Because :

  • The ports are in place
  • but the actual implementations are not enabled

🧠 What this reveals

Building a multi-agent architecture is not the same as calling an LLM.

It is :

  1. Define contracts
  2. Isolate the dependencies
  3. Centralize governance
  4. Make the system testable
  5. Gradually activate the integrations

🚀 Next step

Enable :

  • Symfony AI (real intelligence)
  • Flow (actual workflow)
  • Navi (actual track)

👉 Without breaking anything:

  • the tests
  • governance
  • the ports

🎯 Conclusion

Multi-agent architectures are not:

magical autonomous systems

These are :

governed, orchestrated, and traceable software organizations

💡 Darkwood Positioning

NoLife Agency is showing a clear direction:

The future of AI systems is not only autonomous.

It is governed.

🕵 Project source code

🔗 Resources

🎶 Music credit

@reim.matthias Wenn Freundschaft keinen Sinn mehr macht… Wer fühlt den Song? #miajulia #matthiasreim #keinefreundebleben ♬ Keine Freunde bleiben (feat. Mia Julia) - Matthias Reim
@leclippeurrapide "That way I eat more!" 😂 #nico #byilhanntwitch ♬ original sound - Le Clippeur Rapide

📖 Selection of the week

Top comments (0)