<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://marcushadow.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://marcushadow.github.io/" rel="alternate" type="text/html" /><updated>2026-07-09T03:51:47+00:00</updated><id>https://marcushadow.github.io/feed.xml</id><title type="html">Marcus Wee</title><subtitle>Personal &amp; tech blog — code, projects, and thoughts.</subtitle><author><name>Marcus Wee</name></author><entry><title type="html">Multiagent Orchestration: Where the Gold Standard Sits in 2026</title><link href="https://marcushadow.github.io/blog/2026/06/02/multiagent-orchestration-gold-standard/" rel="alternate" type="text/html" title="Multiagent Orchestration: Where the Gold Standard Sits in 2026" /><published>2026-06-02T00:00:00+00:00</published><updated>2026-06-02T00:00:00+00:00</updated><id>https://marcushadow.github.io/blog/2026/06/02/multiagent-orchestration-gold-standard</id><content type="html" xml:base="https://marcushadow.github.io/blog/2026/06/02/multiagent-orchestration-gold-standard/"><![CDATA[<p>I’ve spent the last few months reading through framework docs, postmortems and a lot of conference talks about how teams wire multiple LLM agents together, and I figured it was worth writing the landscape down before the names shuffle again. This is the survey I wish I had when I started.</p>

<h2 id="setup">Setup</h2>

<p>Multiagent orchestration is what happens when more than one LLM cooperates on a task with explicit coordination between them. The key word is explicit. A single agent that calls fifteen tools in a ReAct loop is not multiagent, even if some of those tools happen to be other models. What makes a system multiagent is that you, the system designer, have decided that distinct agents exist, that they have distinct roles or contexts, and that there are rules for how they hand work between each other. The stakes are simple. Single-agent loops hit a ceiling on long-horizon tasks because context windows fill up, instructions blur, and one bad tool result poisons every subsequent decision. Multiagent setups try to dodge that ceiling by splitting work across fresh contexts. Whether they actually do is the whole question.</p>

<h2 id="why-multiagent-at-all">Why multiagent at all</h2>

<p>The honest pitch is parallel research, separation of concerns and context isolation. If you can spin three subagents on three slices of a research problem at once, you cut wall-clock time and you let each one keep a clean window focused on its slice. Role specialization is the other half. A planner writing a brief, an executor doing the actual work, and a critic checking the output are three very different prompts, and squishing them into one agent tends to produce a model that is mediocre at all three. Context isolation also blunts prompt-poisoning attacks and stops upstream junk from leaking into downstream reasoning. The cost is real though. Anthropic’s own writeup on their research system pegs the token cost at roughly fifteen times a single-agent chat, and latency goes up with every coordination hop. Multiagent is not free, and you should not reach for it before you have a single-agent baseline that is genuinely stuck.</p>

<h2 id="core-patterns">Core patterns</h2>

<p>There are maybe five coordination patterns that keep showing up, and most production systems are a mix of two or three of them.</p>

<ul>
  <li><strong>Orchestrator-worker.</strong> A lead agent decomposes the task, writes self-contained briefs and spawns worker subagents in parallel. Workers return structured results, the orchestrator synthesizes. Coordination is fan-out and join.</li>
  <li><strong>Hierarchical / supervisor.</strong> A supervisor agent routes each turn to one of several specialist agents, deciding who speaks next based on the current state. Coordination happens through the supervisor as a router.</li>
  <li><strong>Pipeline.</strong> Agents are arranged in a fixed sequence. The output of one is the input of the next. Coordination is implicit in the topology, and the whole thing is essentially a deterministic chain with stochastic nodes.</li>
  <li><strong>Swarm / handoff.</strong> Peer agents pass control to each other directly when one decides another is better suited. There is no central coordinator. Coordination is encoded in each agent’s handoff rules.</li>
  <li><strong>Debate / verify.</strong> Two or more agents argue or propose-and-critique, and a separate judge picks a winner or merges. Coordination is structured disagreement followed by adjudication.</li>
</ul>

<p>The thing worth internalizing is that the pattern names describe how control flows, not what the agents do. You can have an orchestrator-worker system of debaters, or a pipeline of swarms. Pick the coordination shape that matches the task’s dependency structure, then pick roles.</p>

<h2 id="framework-landscape">Framework landscape</h2>

<p>The framework picture has churned a lot in the last year, so it’s worth grounding in what each one actually offers as a coordination primitive.</p>

<ul>
  <li><a href="https://www.langchain.com/langgraph"><strong>LangGraph</strong></a> — Graph-based runtime where nodes are agents or tools and edges are explicit control flow, with durable state baked in. Ships supervisor and swarm templates out of the box. Used in production at Uber, LinkedIn and Klarna, and is the de-facto choice when you need stateful multi-agent that survives restarts. v1.1 added production middleware.</li>
  <li><strong>CrewAI</strong> — Role-based “crew” abstraction with personas, goals and tasks, plus a second tier called Flows for event-driven deterministic state machines. The marketing pivot from “autonomous crews” to “Flows around agents” is itself a signal about where the field is heading.</li>
  <li><a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"><strong>Microsoft Agent Framework</strong></a> — The AutoGen successor. AutoGen v0.4’s actor model and GroupChat-with-selector ideas were merged with Semantic Kernel into MAF, which hit 1.0 GA in April 2026. AutoGen itself is in maintenance now. MAF ships sequential, concurrent, handoff, group-chat and Magentic patterns with checkpointing, human-in-the-loop approvals and first-class MCP plus A2A interop.</li>
  <li><strong>OpenAI Agents SDK</strong> — The Swarm successor. Two coordination primitives: handoffs that transfer control and the running transcript, and agents-as-tools where a specialist is invoked without losing the user-facing context. Swarm itself is officially deprecated. The <a href="https://openai.github.io/openai-agents-python/multi_agent/">multi-agent guide</a> is the clearest explanation of when to pick which.</li>
  <li><strong>Claude Agent SDK</strong> — Productizes the Claude Code loop. A single orchestrator spawns subagents in parallel, each in an isolated context window, each returning a summary to the parent. Hooks, MCP and the Skills format (opened as a shared standard in March 2026) give you the integration surface. A Dynamic Workflows preview advertises hundreds of parallel subagents per session.</li>
  <li><a href="https://www.anthropic.com/engineering/built-multi-agent-research-system"><strong>Anthropic’s research multi-agent system</strong></a> — Not a product, but the reference architecture everyone is copying. A Lead Researcher spins three to five parallel subagents with self-contained task descriptions and explicit output-format specs, into fresh context windows that do not know about each other. A citation agent runs after synthesis. The writeup reports a 90.2% lift over single-agent Opus on internal evals at roughly fifteen times the token cost.</li>
</ul>

<p>Worth a one-line mention for completeness: Google’s ADK 2.0 ships a code-first SDK with a graph-based Workflow Runtime and A2A delegation, and AWS Strands is a model-first SDK that AWS uses internally for Amazon Q Developer and AWS Transform, with built-in Swarm, Graph and Workflow patterns plus OTel observability.</p>

<h2 id="what-gold-standard-looks-like-in-2026">What “gold standard” looks like in 2026</h2>

<p>If you forced me to compress the current consensus into a checklist, it looks like this.</p>

<ul>
  <li><strong>Orchestrator-worker with parallel subagents.</strong> Fan out the work, give each worker a self-contained brief, join on structured outputs. This is what the Anthropic research system, the Claude Agent SDK and most LangGraph deployments converge on.</li>
  <li><strong>Structured outputs at every handoff boundary.</strong> Free-text handoffs are where things quietly go wrong. JSON schemas, typed messages or at minimum a fixed template at every join.</li>
  <li><strong>An adversarial judge pipeline for verification.</strong> A single LLM-as-judge is biased and tends to rubber-stamp its own family of models. Two judges with opposing priors plus a tiebreaker, or a propose-and-critique pair, is the pattern that actually catches things.</li>
  <li><strong>A shared artifact / memory layer separate from agent context.</strong> Long outputs, intermediate results and reference docs live in a store that agents read by handle, not by stuffing into a prompt. Memory has graduated from “we cache things” to a real architectural component.</li>
  <li><strong>A token budget with prompt caching as the cost lever.</strong> Prompt caching is the dominant cost optimization in 2026, with 50 to 90 percent reductions on workloads with stable system prompts. Treat the cache hit rate as a first-class metric.</li>
  <li><strong>A deterministic harness around stochastic reasoning.</strong> This is the biggest shift of 2026. The interesting frameworks are not the ones that make agents more autonomous, they are the ones that put workflow scripts, retries, checkpoints and explicit state transitions around the model. CrewAI’s Flows-vs-Crews split and LangGraph’s durable StateGraph are the clearest expressions of this. Build the skeleton out of code you can debug. Use the model where you genuinely need judgement, not for control flow.</li>
</ul>

<p><a href="https://www.anthropic.com/research/building-effective-agents">Anthropic’s “Building Effective Agents”</a> made the workflow-vs-agent distinction explicit back in late 2024, and it has aged extremely well. Most production “agent” systems are workflows with one or two genuinely agentic steps.</p>

<h2 id="common-failure-modes">Common failure modes</h2>

<p>The ways these systems break are pretty consistent across frameworks.</p>

<ul>
  <li><strong>Runaway fan-out.</strong> An orchestrator decides each subtask deserves three subagents, each of which decides the same, and you discover you’ve spawned several hundred LLM calls and a four-figure bill from a single user query. Cap the fan-out depth and the per-task subagent count explicitly.</li>
  <li><strong>Context bleed.</strong> Subagents that share context end up referencing each other’s hallucinations, and the synthesis step launders the error into something confident. This is exactly what isolated context windows are meant to prevent.</li>
  <li><strong>Lost-in-handoff.</strong> Control gets passed to a specialist that does not have the conversation history it needs, asks the user a redundant question, or worse, silently makes assumptions. Handoff payloads need to be explicit.</li>
  <li><strong>Confident-wrong synthesis.</strong> The lead agent writes a clean summary that contradicts what the subagents actually returned, because it pattern-matched to a typical answer rather than reading its inputs. A verification pass catches this; an adversarial judge catches more of it.</li>
  <li><strong>Cost explosion.</strong> Easy to hit fifty dollars on a single query if you fan out aggressively without caching. Token accounting per run is non-negotiable.</li>
</ul>

<h2 id="practical-recommendation">Practical recommendation</h2>

<p>Start single-agent with good tools and good prompts, and measure where it falls over. If the failure mode is context window exhaustion on long research, reach for orchestrator-worker. If it is one agent juggling too many roles, split into planner and executor before you split into a crew of seven. Most teams that adopt a multiagent framework end up using maybe two of its features and would have been fine with a smaller setup. The frameworks are good, but the question to answer first is whether you have a problem they solve.</p>

<h2 id="closing">Closing</h2>

<p>Most of what I learned writing this is that the frameworks converged faster than the vocabulary did. The interesting work in 2026 is not picking sides, it is figuring out which parts of your system genuinely need a model and which parts just need code.</p>]]></content><author><name>Marcus Wee</name></author><category term="tech" /><category term="ai" /><category term="agents" /><summary type="html"><![CDATA[A survey of how teams actually wire multiple agents together right now, and what 'good' looks like.]]></summary></entry><entry><title type="html">Stasis</title><link href="https://marcushadow.github.io/blog/2026/03/18/Stasis/" rel="alternate" type="text/html" title="Stasis" /><published>2026-03-18T00:00:00+00:00</published><updated>2026-03-18T00:00:00+00:00</updated><id>https://marcushadow.github.io/blog/2026/03/18/Stasis</id><content type="html" xml:base="https://marcushadow.github.io/blog/2026/03/18/Stasis/"><![CDATA[<p>Hey there! It has been awhile since I last added something to my blog. Midterms recently ended, just settled a little assessment and I have just found some time to reflect on life and my life journey ahead.</p>

<p>One thing I realised about myself is that I tend to enter into a state of what I call “stasis” when many things that matter compete for my limited attention and time. And here’s what “stasis” is about:</p>

<h2 id="stasis">Stasis</h2>

<p>When something upcoming matters significantly to you, what goes on in your mind? Does it occupy a little corner in your head, making you question if you are fine?</p>

<p>I realise that things that I worry about tend to stay rent-free like an overdue tenant.</p>

<h2 id="what-to-expect">What to expect</h2>

<p>I’ll mostly write about:</p>

<ul>
  <li><strong>Tech and programming</strong> — tools, languages, frameworks, and things I’m building</li>
  <li><strong>Projects</strong> — walkthroughs of things I’m working on</li>
  <li><strong>Random thoughts</strong> — the occasional non-technical post when something’s on my mind</li>
</ul>

<h2 id="lets-go">Let’s go</h2>

<p>This is just the beginning. If you’re reading this, thanks for stopping by. Stick around — there’s more to come.</p>]]></content><author><name>Marcus Wee</name></author><category term="personal" /><category term="philosophy" /><summary type="html"><![CDATA[A little reflection on life and the way I do things.]]></summary></entry><entry><title type="html">How I Built This Blog with Claude Code</title><link href="https://marcushadow.github.io/blog/2026/02/08/setting-up-blog/" rel="alternate" type="text/html" title="How I Built This Blog with Claude Code" /><published>2026-02-08T00:00:00+00:00</published><updated>2026-02-08T00:00:00+00:00</updated><id>https://marcushadow.github.io/blog/2026/02/08/setting-up-blog</id><content type="html" xml:base="https://marcushadow.github.io/blog/2026/02/08/setting-up-blog/"><![CDATA[<p>I just finished building this blog, so naturally the first technical post has to be about how I built it — and the AI tools that made it possible. Here’s the stack and the decisions behind it.</p>

<h2 id="the-stack">The stack</h2>

<ul>
  <li><strong>Jekyll</strong> — static site generator. No database, no server, just Markdown files that compile to HTML.</li>
  <li><strong>GitHub Pages</strong> — free hosting that auto-builds Jekyll sites on push.</li>
  <li><strong>Custom CSS</strong> — no frameworks. Just vanilla CSS with variables, Grid, and Flexbox.</li>
  <li><strong>Giscus</strong> — comments powered by GitHub Discussions.</li>
  <li><strong>Claude Code</strong> — Anthropic’s CLI tool for AI-assisted development. This was the main driver behind the entire build.</li>
  <li><strong>Obra Superpowers</strong> — a skills plugin for Claude Code that adds structured workflows like brainstorming, test-driven development, and systematic debugging.</li>
</ul>

<h2 id="the-ai-assisted-workflow">The AI-assisted workflow</h2>

<p>This blog wasn’t hand-coded line by line in the traditional sense. I used <strong>Claude Code</strong> as my development partner throughout the entire process. Here’s what that looked like:</p>

<ol>
  <li><strong>Scaffolding</strong> — I described what I wanted (a dark-themed Jekyll blog with custom CSS) and Claude Code generated the initial project structure, layouts, and stylesheets.</li>
  <li><strong>Iterating on design</strong> — I’d describe changes I wanted (“add a glassmorphism card style”, “make the theme toggleable”) and Claude Code would implement them across the right files.</li>
  <li><strong>Obra Superpowers</strong> — The Superpowers plugin gave Claude Code structured workflows to follow. Instead of just generating code, it would brainstorm approaches, plan implementations, and verify its work before calling things done. This made the collaboration feel more like working with a thoughtful developer than prompting a chatbot.</li>
</ol>

<p>The combination meant I could focus on <strong>what I wanted</strong> rather than <strong>how to implement it</strong>. I still made all the design decisions, but the execution was dramatically faster.</p>

<h2 id="why-jekyll">Why Jekyll?</h2>

<p>I wanted something that:</p>

<ol>
  <li>Lets me write posts in <strong>Markdown</strong></li>
  <li>Builds to <strong>static HTML</strong> (fast, secure, free to host)</li>
  <li>Is <strong>extensible</strong> without being bloated</li>
  <li>Doesn’t require a backend or database</li>
</ol>

<p>Jekyll checks all the boxes. It’s been around forever, has great docs, and GitHub Pages supports it natively. It’s also a great fit for AI-assisted development since the project structure is clean and predictable.</p>

<h2 id="the-design">The design</h2>

<p>The site ships with three themes — dark, light, and a warm beige (coffee) mode. The dark theme uses near-black backgrounds with cyan accents:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
  <span class="py">--bg</span><span class="p">:</span> <span class="m">#0a0a0f</span><span class="p">;</span>
  <span class="py">--surface</span><span class="p">:</span> <span class="m">#12121a</span><span class="p">;</span>
  <span class="py">--accent</span><span class="p">:</span> <span class="m">#00d4ff</span><span class="p">;</span>
  <span class="py">--text</span><span class="p">:</span> <span class="m">#e0e0e0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Cards use a glassmorphism-inspired look with subtle borders and glow effects on hover. Typography is set in <strong>Inter</strong> for body text and <strong>JetBrains Mono</strong> for code blocks.</p>

<h2 id="project-structure">Project structure</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>_layouts/       → HTML templates (default, post, page)
_includes/      → Reusable components (nav, footer, post cards)
_posts/         → Blog posts in Markdown
_data/          → YAML data files (projects, tags)
assets/css/     → Stylesheet
</code></pre></div></div>

<p>Everything compiles to a <code class="language-plaintext highlighter-rouge">_site/</code> folder that GitHub Pages serves.</p>

<h2 id="whats-next">What’s next</h2>

<ul>
  <li>Add more posts</li>
  <li>Set up a custom domain</li>
  <li>Maybe add client-side search with lunr.js</li>
  <li>Keep using Claude Code + Superpowers to ship features faster</li>
</ul>

<p>If you want to build something similar, feel free to check out the <a href="https://github.com/Marcushadow/Marcushadow.github.io">source code</a> — it’s all open source.</p>]]></content><author><name>Marcus Wee</name></author><category term="tech" /><category term="jekyll" /><category term="web" /><category term="tutorial" /><category term="ai" /><summary type="html"><![CDATA[A behind-the-scenes look at building a personal blog with Jekyll, GitHub Pages, and AI-assisted development using Claude Code and Obra Superpowers.]]></summary></entry><entry><title type="html">Welcome to My Blog</title><link href="https://marcushadow.github.io/blog/2026/02/08/welcome/" rel="alternate" type="text/html" title="Welcome to My Blog" /><published>2026-02-08T00:00:00+00:00</published><updated>2026-02-08T00:00:00+00:00</updated><id>https://marcushadow.github.io/blog/2026/02/08/welcome</id><content type="html" xml:base="https://marcushadow.github.io/blog/2026/02/08/welcome/"><![CDATA[<p>Hey there! Welcome to my little corner of the internet.</p>

<p>I’m Marcus, and this is where I’ll be sharing my thoughts on tech, code, projects, and whatever else catches my attention. I’ve been meaning to start writing for a while now, and here we are.</p>

<h2 id="why-a-blog">Why a blog?</h2>

<p>A few reasons:</p>

<ul>
  <li><strong>Learning in public</strong> — writing about what I’m working on forces me to understand it better. If I can explain something clearly, I probably actually know it.</li>
  <li><strong>A record of progress</strong> — it’s easy to forget how far you’ve come. Having a trail of posts is a nice way to look back.</li>
  <li><strong>Sharing is caring</strong> — if something I write helps even one person solve a problem or learn something new, that’s a win.</li>
</ul>

<h2 id="what-to-expect">What to expect</h2>

<p>I’ll mostly write about:</p>

<ul>
  <li><strong>Tech and programming</strong> — tools, languages, frameworks, and things I’m building</li>
  <li><strong>Projects</strong> — walkthroughs of things I’m working on</li>
  <li><strong>Random thoughts</strong> — the occasional non-technical post when something’s on my mind</li>
</ul>

<h2 id="lets-go">Let’s go</h2>

<p>This is just the beginning. If you’re reading this, thanks for stopping by. Stick around — there’s more to come.</p>]]></content><author><name>Marcus Wee</name></author><category term="personal" /><category term="meta" /><summary type="html"><![CDATA[Hello world — an introduction to who I am and what this space is about.]]></summary></entry></feed>