As a wrote in a previous article, there is a need right now for agentic workflows to be evaluated. Without evaluation, we are at risk of a “vibe architecture” in addition to vibe coding. Possible agentic workflows fall along a spectrum. On one end, you could have a flow of manual Claude Code / Codex prompting via a human; and, on the other end, you could have an enclosed, multi-agent loop that perfects writing and reviewing prompts and the code they produce.
Just like with humans, there are a variety of ways to run organizations. Business corporations, for instance, have dealt with experimenting with different organizational models for some time. Unless we have greater insight into how our agentic architecture is impacting the model’s ability to produce the ideal output, we risk adopting a workflow that either lacks the full potential to automate, or is overly complicated for the use case.
I plan to write about how we can make understanding the various agentic architecture and their tradeoffs more legible. However, in the meantime, I wanted to explore another way to make agentic organizations easier to grasp.
My idea was to build a visual engine with Phaser that would animate my agent organization.
Using Pokemon Red assets, I assigned a Pokemon sprite to each of my agents in my multi-agent workflow. The agentic workflow, for this simple version, consists of a sequence of calls to Anthropic’s models. Each agent plays a specific role in a research workflow based on Anthropic’s multi-agent research system. However, I added a Neoplatonic twist based on Pseudo-Dionysius’ De Coelesti Hierarchia (Of Celestial Bodies).
Specifically, I assigned three general roles: Purifier, Illuminator, and Perfector. By general, I mean that these roles could be applied to other problem spaces than by research workflow.
Purifier clarifies the task before execution by removing noise, surfacing constraints, and turning vague material into a usable signal.
Illuminator makes the “purified” task intelligible by supplying precommitments, context, criteria, and the right interpretive frame.
Perfector completes the partial outputs of the lower agenets by integrating, judging, reconciling tensions, and giving the work final form.
Here is the topology in my project:
export const roles = {
purification: {
id: 'purification',
processName: 'Purification',
roleName: 'Purifier',
grammar:
'Clarifies the task before execution by removing noise, surfacing constraints, and turning vague material into a usable signal.',
receives: ['raw task', 'ambiguous prompt', 'unstructured context'],
produces: ['clean problem statement', 'constraints', 'unknowns', 'usable task boundary'],
responsibilities: [
'Detect what is irrelevant, premature, contradictory, or underspecified.',
'Preserve the user intent while reducing accidental complexity.',
'Return a purified task object that downstream agents can safely reason over.',
],
},
illumination: {
id: 'illumination',
processName: 'Illumination',
roleName: 'Illuminator',
grammar:
'Makes the purified task intelligible by supplying doctrine, context, criteria, and the right interpretive frame.',
receives: ['clean problem statement', 'constraints', 'unknowns'],
produces: ['framing lens', 'selection criteria', 'relevant doctrine', 'structured subtasks'],
responsibilities: [
'Choose the conceptual frame that makes the task legible.',
'Translate clean signal into situated understanding.',
'Prepare lower-level work without collapsing into direct execution.',
],
},
perfection: {
id: 'perfection',
processName: 'Perfection',
roleName: 'Perfector',
grammar:
'Completes the partial outputs by integrating, judging, reconciling tensions, and giving the work final form.',
receives: ['framed result', 'candidate outputs', 'partial judgments'],
produces: ['integrated recommendation', 'final artifact', 'decision-ready synthesis'],
responsibilities: [
'Judge whether the result fulfills the original intent.',
'Resolve contradictions between lower-level outputs.',
'Synthesize the final response into a coherent whole.',
],
},
};
Then, I clarified how these roles would function in my problem space of a research workflow:
export const problemSpaceRoles = {
research: {
id: 'research',
label: 'Research Workflow',
description:
'A research specialization of the triadic grammar: transform a messy question into a scoped brief, parallel inquiry lanes, and a citation-aware synthesis.',
roles: {
purification: {
roleName: 'Research Scoper',
receives: ['raw research question', 'topic ambiguity', 'implicit quality expectations'],
produces: ['research brief', 'source-quality bar', 'effort budget', 'coverage criteria'],
responsibilities: [
'Define the research question and remove accidental ambiguity.',
'Set source-quality rules before exploration begins.',
'Decide how much effort the query deserves before spawning research work.',
],
},
illumination: {
roleName: 'Research Strategist',
receives: ['research brief', 'coverage criteria', 'source-quality bar'],
produces: ['parallel research lanes', 'search heuristics', 'subtask boundaries', 'gap checks'],
responsibilities: [
'Decompose the brief into distinct research lanes.',
'Prevent duplicated subagent work by giving each lane a separate objective.',
'Use broad-to-narrow search heuristics and adjust strategy as findings appear.',
],
},
perfection: {
roleName: 'Research Synthesizer',
receives: ['lane findings', 'candidate claims', 'source references'],
produces: ['integrated report', 'citation-checked claims', 'failure modes', 'when-to-use guidance'],
responsibilities: [
'Integrate lane findings into one answer.',
'Check coverage, source quality, and citation fit before finalizing claims.',
'Soften or remove claims that cannot be supported by the research evidence.',
],
},
},
},
}; Having established the functional roles of my agents, I gave them an embodiments—a certain creaturely persona:
export const celestialEmbodiments = {
psychicLineage: {
id: 'psychic-lineage',
label: 'Psychic Lineage',
description:
'A psychic lineage expresses the celestial grammar as increasingly articulate cognitive power: a quiet receiver, a framing interpreter, and a final synthesizer.',
roleDescriptions: {
purification:
'The Purifier should feel like a small, inward-facing celestial agent that listens before acting; it notices static in the environment; it reacts to activation by briefly sharpening in color, as if a fuzzy signal has become crisp.',
illumination:
'The Illuminator should feel like a focused celestial interpreter standing between raw signal and final judgment; it receives purified material and makes its meaning visible; it reacts to activation with clear, cool color and controlled psychic noise.',
perfection:
'The Perfector should feel like a composed celestial master of synthesis; it does not rush into the task but gathers partial meaning into final form; it reacts to activation with warm, decisive color and a longer completion pulse.',
},
},
};Note: While I imposed these topology layers into a Codex chat, the model created these specific structures. The model took the most liberties with this celestial embodiment schema.
Finally, there is a topology layer that maps the celestial embodiments to specific characters, as well as mapping the relationship between the roles/characters:
export const embodiedCharacters = {
abraPurifier: {
id: 'abraPurifier',
roleId: 'purification',
embodimentId: 'psychic-lineage',
displayName: 'Abra',
sprite: 'abra',
spriteBack: 'abrab',
seedDescription:
'Abra is a quiet purifier who sleeps near the boundary between confusion and clarity; Abra senses stray assumptions, irrelevant details, and missing constraints before others notice them; Abra prefers to simplify a problem before anyone tries to solve it; Abra becomes alert when a raw task arrives and settles once the signal is clean.',
visual: {
accent: 0xffb38a,
sound: 'denied',
x: 610,
y: 486,
},
},
kadabraIlluminator: {
id: 'kadabraIlluminator',
roleId: 'illumination',
embodimentId: 'psychic-lineage',
displayName: 'Kadabra',
sprite: 'kadabra',
spriteBack: 'kadabrab',
seedDescription:
'Kadabra is an illuminator who translates clean signal into understanding; Kadabra carries the doctrine of the topology and knows how to choose a useful frame; Kadabra turns constraints into criteria and criteria into structured work; Kadabra becomes brightest when a purified problem needs interpretation.',
visual: {
accent: 0xa4d4ff,
sound: 'heal',
x: 540,
y: 352,
},
},
alakazamPerfector: {
id: 'alakazamPerfector',
roleId: 'perfection',
embodimentId: 'psychic-lineage',
displayName: 'Alakazam',
sprite: 'alakazam',
spriteBack: 'alakazamb',
seedDescription:
'Alakazam is a perfector who waits for partial meanings to become ready for judgment; Alakazam weighs the framed result against the original intent; Alakazam resolves tensions between candidate outputs and gives the work final form; Alakazam becomes radiant when synthesis is complete.',
visual: {
accent: 0xf8eaa5,
sound: 'getItem',
x: 420,
y: 170,
},
},
};
const roleCharacterMap = {
purification: 'abraPurifier',
illumination: 'kadabraIlluminator',
perfection: 'alakazamPerfector',
};
export const topologyEdges = [
{
id: 'perfection-to-illumination',
from: 'perfection',
to: 'illumination',
label: 'illumination descends',
},
{
id: 'illumination-to-purification',
from: 'illumination',
to: 'purification',
label: 'context clarifies',
},
{
id: 'purification-to-illumination',
from: 'purification',
to: 'illumination',
label: 'clean signal rises',
},
{
id: 'illumination-to-perfection',
from: 'illumination',
to: 'perfection',
label: 'framed result returns',
},
];
Once I had the topology, I mocked a model event stream. The multi-agentic workflow would emit events to represent its current stage. Each event then got mapped to triggering a visual scene that animated the rendered characters.
After getting the mock workflow to work, I added a real-time agentic workflow. At a high level, the workflow turns one ambiguous research question into a staged, source-aware answer.
The Purifier clarifies the raw question into a tighter research brief: what is being asked, what is in/out of scope, and what evidence quality matters.
The Illuminator plans and runs research lanes, performing web searches, capturing sources, grading them as primary/secondary/tertiary/unknown, and building a source index.
The Perfector synthesizes the final answer from the brief and lanes, then runs a citation-readiness check to flag weak claims, unsupported numbers, or source-quality mismatches.
Around that, the system streams events to the Phaser UI, tracks cost, writes the full run artifact to /.agentic-runs, and updates an index with source counts, citation risk, and whether the output is publication-ready.
The neat part is that I can see the agents as embodied characters and get real-time, visual feedback as to what is happening in a workflow. If you’re interested, you can clone the repository and insert your own Anthropic API key.
As a final note, this is meant to be more than a fun “toy demo.” This is meant to open the conversation about how agents can be treated in a more imaginative way that makes the whole process easier to comprehend. More importantly, it moves the conception of agentic organizations as something very technical to something that is analogous with human organizations. If we can make that connection, the work of evaluating agentic organizations and architecture will be made easier, and potentially more humane.
Note: This project was heavily inspired by the Generative Agents: Interactive Simulacra of Human Behavior research paper.





