<?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://hlavezzo.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://hlavezzo.me/" rel="alternate" type="text/html" /><updated>2026-08-27T16:35:48+00:00</updated><id>https://hlavezzo.me/feed.xml</id><title type="html">Henrique A. Lavezzo</title><subtitle>An engineering lead who never stopped shipping — a Code Alchemist transmuting chaos into scalable systems, now conducting AI familiars in the open.</subtitle><author><name>Henrique A. Lavezzo</name></author><entry><title type="html">LLM Model Routing - Claude</title><link href="https://hlavezzo.me/2026/02/18/llm-model-routing-claude" rel="alternate" type="text/html" title="LLM Model Routing - Claude" /><published>2026-02-18T23:41:45+00:00</published><updated>2026-02-18T23:41:45+00:00</updated><id>https://hlavezzo.me/2026/02/18/llm-model-routing-claude</id><content type="html" xml:base="https://hlavezzo.me/2026/02/18/llm-model-routing-claude"><![CDATA[<p><strong>The single most impactful decision in AI-assisted coding isn’t which model you use — it’s knowing when to switch.</strong> With Opus 4.6’s price dropping 67% to $5/$25 per million tokens (from $15/$75 in earlier generations), the economics of model routing have fundamentally shifted. The Opus-to-Sonnet cost gap shrank from 5× to just 1.67×, making intelligent routing more about matching cognitive depth to task complexity than pure cost arbitrage. This report synthesizes benchmark data, community experience, tool documentation, and cost analysis into an actionable methodology for routing between Claude Opus, Sonnet, and Haiku during coding sessions — including multi-agent orchestration scenarios.</p>

<p>The evidence supports a clear hierarchy: <strong>Sonnet 4.5 as default workhorse</strong> (handling 70–80% of tasks), <strong>Opus for architecture-level reasoning and complex debugging</strong>, and <strong>Haiku with extended thinking as the underutilized powerhouse</strong> for high-volume operations. But the nuances matter enormously, and static rules break down without understanding failure modes.</p>

<hr />

<h2 id="the-capability-landscape-what-the-benchmarks-actually-reveal">The capability landscape: what the benchmarks actually reveal</h2>

<p>The gap between tiers is real but narrower than most developers assume. On <strong>SWE-bench Verified</strong> (the gold standard for real-world coding), Opus 4.5 scores <strong>80.9%</strong>, Sonnet 4.5 hits <strong>77.2%</strong>, and Haiku 4.5 reaches <strong>73.3%</strong> — a total spread of just 7.6 percentage points. For context, Haiku 4.5 at $1/$5 per million tokens outperforms Claude Opus 4.1 (~72%), which cost $15/$75 just months ago.</p>

<p>The tiers diverge sharply on tasks requiring sustained reasoning and multi-step tool use. On <strong>Terminal-Bench 2.0</strong> (agentic terminal coding), Opus 4.6 scores 65.4% versus Sonnet 4.5’s 51.0% — a 14-point gap. On <strong>MCP Atlas</strong> (orchestrating multiple tools at scale), Opus 4.5 scores 62.3% versus Sonnet 4.5’s 43.8% — an 18.5-point chasm. On <strong>OSWorld</strong> (agentic computer use), the spread runs from Opus 4.6 at 72.7% down through Sonnet at 61.4% to Haiku at 50.7%. The pattern is unmistakable: <strong>as task complexity and agent autonomy increase, the gap between tiers widens dramatically</strong>.</p>

<table>
  <thead>
    <tr>
      <th>Benchmark</th>
      <th>Opus 4.6/4.5</th>
      <th>Sonnet 4.5</th>
      <th>Haiku 4.5</th>
      <th>Gap (Opus–Haiku)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SWE-bench Verified</td>
      <td>80.9%</td>
      <td>77.2%</td>
      <td>73.3%</td>
      <td>7.6pp</td>
    </tr>
    <tr>
      <td>Terminal-Bench 2.0</td>
      <td>65.4%</td>
      <td>51.0%</td>
      <td>—</td>
      <td>14.4pp+</td>
    </tr>
    <tr>
      <td>MCP Atlas (tool use)</td>
      <td>62.3%</td>
      <td>43.8%</td>
      <td>—</td>
      <td>18.5pp+</td>
    </tr>
    <tr>
      <td>Aider Polyglot</td>
      <td>89.4%</td>
      <td>78.8%</td>
      <td>—</td>
      <td>10.6pp+</td>
    </tr>
    <tr>
      <td>OSWorld (agentic)</td>
      <td>72.7%</td>
      <td>61.4%</td>
      <td>50.7%</td>
      <td>22.0pp</td>
    </tr>
  </tbody>
</table>

<p>Critically, <strong>HumanEval and MBPP are saturated</strong> — all tiers score above 90%, making these benchmarks useless for routing decisions. The real differentiators are multi-file, multi-step, and agentic benchmarks.</p>

<p>One surprising finding deserves emphasis: Opus 4.5 at <strong>medium effort</strong> matches Sonnet 4.5’s best SWE-bench score while using <strong>76% fewer output tokens</strong>. At maximum effort, Opus exceeds Sonnet by 4.3 points while using 48% fewer tokens. This means Opus’s token efficiency on hard problems can make it <em>cheaper per successful task</em> than Sonnet when accounting for retry costs.</p>

<hr />

<h2 id="the-pricing-reality-after-the-opus-price-collapse">The pricing reality after the Opus price collapse</h2>

<p>The economics of model routing changed fundamentally when Opus 4.5/4.6 dropped to $5/$25 per million tokens. The current tier structure:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Input/MTok</th>
      <th>Output/MTok</th>
      <th>Batch Input</th>
      <th>Cache Read</th>
      <th>Speed</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Opus 4.6</strong></td>
      <td>$5.00</td>
      <td>$25.00</td>
      <td>$2.50</td>
      <td>$0.50</td>
      <td>Moderate</td>
    </tr>
    <tr>
      <td><strong>Sonnet 4.5</strong></td>
      <td>$3.00</td>
      <td>$15.00</td>
      <td>$1.50</td>
      <td>$0.30</td>
      <td>Fast</td>
    </tr>
    <tr>
      <td><strong>Haiku 4.5</strong></td>
      <td>$1.00</td>
      <td>$5.00</td>
      <td>$0.50</td>
      <td>$0.10</td>
      <td>3–5× faster</td>
    </tr>
  </tbody>
</table>

<p>The Opus-to-Sonnet ratio is now <strong>1.67×</strong> on both input and output — compared to the previous 5× gap. The Sonnet-to-Haiku ratio remains <strong>3×</strong>, making Haiku the clear choice when quality is sufficient. For a concrete sense of costs per task:</p>

<ul>
  <li>A <strong>simple edit</strong> (2K input, 500 output): $0.005 on Haiku, $0.014 on Sonnet, $0.023 on Opus</li>
  <li><strong>Unit test writing</strong> (5K input, 6K output): $0.035 on Haiku, $0.105 on Sonnet, $0.175 on Opus</li>
  <li><strong>Complex multi-file refactoring</strong> (50K input, 20K output): $0.15 on Haiku, $0.45 on Sonnet, $0.75 on Opus</li>
  <li><strong>Large codebase analysis</strong> (100K+ context): $0.175 on Haiku, $0.525 on Sonnet, $0.875 on Opus</li>
</ul>

<p>Real-world Claude Code usage averages <strong>$6/developer/day</strong> on Sonnet 4.5, with 90th percentile under $12/day. Prompt caching (0.1× input cost on cache hits) and batch API (50% discount) stack multiplicatively — a fully optimized pipeline can achieve <strong>up to 90–95% savings</strong> versus naive all-Opus usage.</p>

<hr />

<h2 id="how-production-tools-actually-route-between-models">How production tools actually route between models</h2>

<p>No major coding tool implements truly intelligent task-based auto-routing. Instead, the industry has converged on a simpler, more robust pattern: <strong>phase-based splitting</strong>, where stronger models plan and weaker models execute.</p>

<p><strong>Claude Code</strong> offers the most explicit routing controls. Its <code class="language-plaintext highlighter-rouge">opusplan</code> alias uses Opus during planning mode and auto-switches to Sonnet for execution — the closest thing to automated routing in production. Sub-agents can specify <code class="language-plaintext highlighter-rouge">model: sonnet</code>, <code class="language-plaintext highlighter-rouge">model: haiku</code>, or <code class="language-plaintext highlighter-rouge">model: inherit</code> in YAML frontmatter, and the <code class="language-plaintext highlighter-rouge">CLAUDE_CODE_SUBAGENT_MODEL</code> environment variable overrides all sub-agent models globally. Notably, <strong>sub-agents default to Sonnet</strong> even when the main session runs on Opus, and Claude Code uses Haiku behind the scenes for background functionality like commit messages and context summarization.</p>

<p><strong>Aider</strong> pioneered the <strong>Architect/Editor split</strong>: the main “architect” model reasons about the problem in natural language, then a separate “editor” model translates that reasoning into file edits. This pattern delivers measurable gains — o1-preview as architect with a cheaper editor achieved 85% on Aider’s code editing benchmark, outperforming any single model.</p>

<p><strong>Cursor</strong> uses a proprietary fine-tuned model for tab completions (separate from all chat models), offers an “Auto” mode that selects based on availability and reliability rather than task type, and transparently routes some background tasks to different providers. <strong>Windsurf</strong> runs a hidden planning agent alongside whatever model the user selects. Both tools demonstrate that <strong>dual-model architectures are becoming standard</strong>, even when not user-visible.</p>

<p>The community-reported workflow that emerges most consistently across platforms follows this pattern:</p>

<ol>
  <li><strong>Explore</strong> with a fast model (read files, understand the codebase)</li>
  <li><strong>Plan</strong> with Opus (“ultrathink, analyze this, propose a plan, don’t code yet”)</li>
  <li><strong>Implement</strong> with Sonnet (execute the plan)</li>
  <li><strong>Review</strong> with Opus (catch edge cases, verify correctness)</li>
  <li><strong>Clean up</strong> with Haiku (formatting, import organization, small fixes)</li>
</ol>

<hr />

<h2 id="five-analytical-lenses-on-the-routing-problem">Five analytical lenses on the routing problem</h2>

<h3 id="the-economist-diminishing-returns-define-the-optimal-frontier">The Economist: diminishing returns define the optimal frontier</h3>

<p>From a pure cost-efficiency perspective, the routing problem reduces to: <em>what is the marginal quality gain per additional dollar spent?</em> The data shows steep diminishing returns. Moving from Haiku ($1/$5) to Sonnet ($3/$15) — a 3× cost increase — buys a 3.9 percentage point improvement on SWE-bench (73.3% → 77.2%). Moving from Sonnet to Opus ($5/$25) — only 1.67× more — buys another 3.7 points (77.2% → 80.9%). The Sonnet-to-Opus upgrade is actually <strong>better value per point</strong> than the Haiku-to-Sonnet upgrade at current prices.</p>

<p>But this analysis changes dramatically by task type. On MCP Atlas (multi-tool orchestration), the Sonnet-to-Opus jump gains 18.5 points — extraordinary value. On simple edits, the quality difference between all three tiers is negligible, making Haiku the only rational choice. <strong>The Economist’s verdict: route by task type, not by default preference, and treat Opus’s effort parameter as a continuous cost dial rather than a binary tier decision.</strong></p>

<p>The RouteLLM framework from LMSYS demonstrated that intelligent routing achieves <strong>85% cost reduction while maintaining 95% of top-model quality</strong>. One enterprise reduced annual AI costs from $3.96M to $1.37M (65% reduction) through systematic model selection.</p>

<h3 id="the-architect-design-for-escalation-not-perfection">The Architect: design for escalation, not perfection</h3>

<p>A well-designed routing system needs three properties: <strong>reliable escalation</strong>, <strong>graceful degradation</strong>, and <strong>observable decision-making</strong>. The critical insight from practitioners who tried auto-routing is that it fails: “I tried auto-mode and blind routing early on. Stopped using both. It led to indecision, unexpected cost spikes, and behavior I couldn’t reason about when something went wrong.”</p>

<p>The Architect’s recommended design follows a <strong>cascading pattern with explicit triggers</strong>:</p>

<p><strong>Tier 1 — Haiku (default for sub-agents and simple tasks)</strong></p>
<ul>
  <li>Handles: formatting, renaming, boilerplate, config changes, import fixes, commit messages, code classification</li>
  <li>Escalation trigger: output fails syntax validation, unit tests fail, or task requires multi-file awareness</li>
</ul>

<p><strong>Tier 2 — Sonnet (default for interactive coding)</strong></p>
<ul>
  <li>Handles: feature implementation, standard bug fixes, code review, test writing, documentation, single-file refactoring</li>
  <li>Escalation trigger: circular fixing patterns (model keeps reverting changes), concurrency/race condition bugs, architecture-level decisions needed, or task requires &gt;200K context with high retrieval accuracy</li>
</ul>

<p><strong>Tier 3 — Opus (reserved for high-complexity reasoning)</strong></p>
<ul>
  <li>Handles: multi-file refactoring, architecture design, security review, subtle debugging, long-horizon agent workflows, multi-codebase changes</li>
  <li>De-escalation: once architecture is established, drop to Sonnet for implementation; use effort parameter at medium for “Opus-lite” tasks</li>
</ul>

<p><strong>Fallback mechanisms</strong>: If any tier fails twice on the same task, escalate one tier. If Opus fails, flag for human review. Never de-escalate mid-task — complete the current task at the escalated tier, then de-escalate for the next task.</p>

<h3 id="the-pragmatist-what-experienced-developers-actually-do">The Pragmatist: what experienced developers actually do</h3>

<p>The community consensus is remarkably consistent. The most common workflow, reported independently across Reddit, Hacker News, Medium, and tool-specific forums:</p>

<ul>
  <li><strong>“Haiku for setup, Sonnet for builds, Opus for reviews — that combo just works”</strong> (Flutter developer)</li>
  <li><strong>“If a wrong answer is cheap, use Sonnet and retry on failure. If a wrong answer is expensive, pay for Opus on the first attempt”</strong> (AceCloud analysis)</li>
  <li><strong>“Everyone believes their task requires no less than Opus, it seems”</strong> (Hacker News commenter identifying the most common anti-pattern)</li>
</ul>

<p>Practitioners converge on Sonnet as the daily driver. A developer on the $20 plan described their approach: “I usually start with Haiku, then switch to Sonnet or Opus for harder tasks.” Continue.dev documented a workflow achieving <strong>2× productivity</strong> using Opus for planning and Sonnet for implementation on a real data pipeline project.</p>

<p>The Pragmatist’s critical warning: <strong>avoid switching models mid-conversation.</strong> Switching requires re-sending the full context to the new model, consuming tokens and risking information loss. Instead, start new sessions when changing models. If you must switch, first ask the model to summarize the conversation state, then paste that summary into a fresh session with the new model.</p>

<h3 id="the-scientist-where-the-evidence-is-strong-vs-thin">The Scientist: where the evidence is strong vs. thin</h3>

<p>The evidence hierarchy is important for calibrating confidence in routing decisions:</p>

<p><strong>Strong evidence (benchmark-validated, multiple sources):</strong></p>
<ul>
  <li>Opus significantly outperforms Sonnet on multi-step agentic tasks (MCP Atlas, Terminal-Bench, OSWorld — 14-22pp gaps)</li>
  <li>Haiku 4.5 with extended thinking beats Sonnet 4.5 with extended thinking 58% of the time on code review (Qodo, 400 real PRs, quality scores 7.29 vs 6.60)</li>
  <li>Extended thinking hurts performance by up to 36% on simple tasks where deeper reasoning is counterproductive</li>
  <li>Context degradation in long sessions is confirmed by academic research (primacy/recency bias, answer bloat, loss-of-middle-turns)</li>
  <li>Opus overengineering is acknowledged by Anthropic themselves in the Opus 4.6 announcement</li>
</ul>

<p><strong>Moderate evidence (practitioner consensus, limited formal measurement):</strong></p>
<ul>
  <li>Sonnet handles ~80% of typical coding tasks at near-Opus quality</li>
  <li>Haiku breaks down on code exceeding ~150 lines</li>
  <li>Phase-based switching (plan/execute) outperforms static model selection</li>
  <li>Opus is cheaper per successful task on complex problems due to fewer retries</li>
</ul>

<p><strong>Weak evidence (anecdotal, needs more research):</strong></p>
<ul>
  <li>Optimal effort parameter settings for specific task types</li>
  <li>Exact token-count thresholds for routing decisions</li>
  <li>Whether cross-model review (Opus checking Sonnet’s work) consistently catches bugs that same-model review misses</li>
  <li>Quality degradation during peak usage hours</li>
</ul>

<h3 id="the-strategist-building-adaptive-systems-for-a-moving-target">The Strategist: building adaptive systems for a moving target</h3>

<p>Models improve rapidly. Haiku 4.5 today outperforms Opus 4.1 from months ago. Any routing system built on fixed rules will degrade. The Strategist recommends:</p>

<p><strong>Design for model-agnostic interfaces.</strong> Don’t hardcode “use Opus” — instead, define capability requirements (e.g., “requires multi-file reasoning,” “requires &gt;200K context”) and map those to models dynamically. When a new model launches, update the mapping table without changing the routing logic.</p>

<p><strong>Build feedback loops.</strong> Track which model-task pairings produce successful outcomes (tests pass, code review approved, no bugs in production). Use this data to continuously refine routing. Aider’s Architect/Editor pattern implicitly does this — if the editor’s output fails tests, the architect can adjust its approach.</p>

<p><strong>Prepare for adaptive thinking.</strong> Opus 4.6’s adaptive thinking and effort parameter represent the future: a single model that dynamically scales reasoning depth. As this capability spreads to Sonnet and Haiku, the routing problem shifts from “which model?” to “how much thinking budget?” — a continuous optimization rather than a discrete choice.</p>

<p><strong>Invest in context management.</strong> Opus 4.6’s compaction API (server-side context summarization) and thinking block preservation represent infrastructure that makes long-running, multi-model sessions viable. Teams that build their workflows around these primitives will maintain advantage as models evolve.</p>

<hr />

<h2 id="the-five-anti-patterns-that-destroy-routing-value">The five anti-patterns that destroy routing value</h2>

<p><strong>1. The Opus Hammer.</strong> Opus consistently overengineers simple tasks. One developer asked for email OTP login and received a 12-file authentication framework. Anthropic acknowledges this: Opus 4.6 “thinks more deeply and more carefully revisits its reasoning, which produces better results on harder problems but adds cost and latency on simpler ones.” Mitigation: use the effort parameter at medium for routine work, or simply use Sonnet.</p>

<p><strong>2. The Haiku Speed Trap.</strong> Haiku’s sub-200ms responses create a false sense of progress. Developers accept lower-quality output because it arrives instantly and don’t review it as carefully. Haiku “tends to hallucinate when generating code exceeding 150 lines” and “loses track fast” in sessions beyond ~7 minutes of sustained work. Mitigation: pair Haiku with CI/linting gates and treat its output as a draft requiring validation.</p>

<p><strong>3. The Mid-Conversation Switch.</strong> Switching models mid-session forces the new model to re-process the entire conversation history, consuming extra tokens and losing the nuanced “understanding” the previous model had built. Community consensus: start fresh sessions when changing models. Use external state (CLAUDE.md files, summaries, test suites) to transfer context.</p>

<p><strong>4. The Thinking Token Explosion.</strong> Extended thinking tokens are billed as output tokens. One production test saw costs jump from $109 to $1,485 — a <strong>14× increase</strong> — when reasoning-enabled modes were naively applied. Worse, extended thinking on simple tasks can <em>hurt</em> performance by up to 36%. Rule of thumb from practitioners: “If a human would do worse by thinking too hard, so will Claude.”</p>

<p><strong>5. The “Everyone Needs Opus” Delusion.</strong> Developers on subscription plans who default to Opus for routine work hit usage limits and lose access entirely. “The best model is the one I can use, not the one I can’t afford.” Sonnet handles the vast majority of coding tasks with negligible quality loss.</p>

<hr />

<h2 id="multi-agent-orchestration-assigning-models-to-roles">Multi-agent orchestration: assigning models to roles</h2>

<p>The most effective multi-agent coding architectures assign models based on role requirements, not uniform capability. The evidence supports this role-to-model mapping:</p>

<table>
  <thead>
    <tr>
      <th>Agent Role</th>
      <th>Recommended Model</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Orchestrator / Planner</strong></td>
      <td>Opus 4.6 (medium effort)</td>
      <td>Needs multi-file awareness, architecture reasoning; effort parameter controls cost</td>
    </tr>
    <tr>
      <td><strong>Implementation Agent</strong></td>
      <td>Sonnet 4.5</td>
      <td>Best quality/cost for code generation; handles 80% of coding tasks well</td>
    </tr>
    <tr>
      <td><strong>Code Reviewer</strong></td>
      <td>Opus 4.6 or Haiku 4.5 + thinking</td>
      <td>Opus catches subtle bugs others miss; Haiku+thinking surprisingly strong (58% win rate vs Sonnet+thinking)</td>
    </tr>
    <tr>
      <td><strong>Explorer / Reader</strong></td>
      <td>Haiku 4.5</td>
      <td>Read-only codebase exploration; speed matters, reasoning depth doesn’t</td>
    </tr>
    <tr>
      <td><strong>Test Writer</strong></td>
      <td>Sonnet 4.5</td>
      <td>Benefits from semantic understanding; Haiku may miss edge cases</td>
    </tr>
    <tr>
      <td><strong>Formatter / Linter</strong></td>
      <td>Haiku 4.5</td>
      <td>Mechanical task; no reasoning needed</td>
    </tr>
    <tr>
      <td><strong>Commit Message / Docs</strong></td>
      <td>Haiku 4.5</td>
      <td>Simple generation; speed preferred</td>
    </tr>
    <tr>
      <td><strong>Security Reviewer</strong></td>
      <td>Opus 4.6 (high effort)</td>
      <td>High cost of missed vulnerabilities justifies premium; Opus catches 50% “Important” issues vs Sonnet’s 41.5%</td>
    </tr>
  </tbody>
</table>

<p>Claude Code’s sub-agent architecture makes this practical. The main session runs on Opus via <code class="language-plaintext highlighter-rouge">opusplan</code>, while sub-agents individually specify their model tier. The <code class="language-plaintext highlighter-rouge">CLAUDE_CODE_SUBAGENT_MODEL=haiku</code> environment variable provides a cost-efficient default that can be overridden per-agent in YAML frontmatter.</p>

<p>For teams building custom multi-agent systems, the <strong>fan-out/fan-in pattern</strong> works well: an Opus orchestrator decomposes a task into independent sub-tasks, multiple Haiku or Sonnet agents execute in parallel (each touching different files), and the orchestrator aggregates and reviews results. Claude Code’s “agent teams” feature in Opus 4.6 supports exactly this — a demo showed 16 agents building a 100K-line C compiler in two weeks.</p>

<p><strong>Critical implementation detail</strong>: sub-agents in Claude Code receive only their system prompt and basic environment details, <em>not</em> the full conversation history. This is a feature, not a bug — it reduces token usage by ~67% for multi-domain tasks and prevents context contamination between agents.</p>

<hr />

<h2 id="the-unified-routing-methodology">The unified routing methodology</h2>

<p>This methodology integrates evidence from benchmarks, community practice, tool architectures, and cost analysis into an immediately applicable framework.</p>

<h3 id="step-1-classify-the-task">Step 1: Classify the task</h3>

<p>Before sending any request, classify it along two dimensions:</p>

<p><strong>Complexity dimension</strong> (determines model tier):</p>
<ul>
  <li><strong>Mechanical</strong> (formatting, renaming, imports, config) → Haiku</li>
  <li><strong>Generative</strong> (new functions, tests, docs, standard features) → Sonnet</li>
  <li><strong>Reasoning-intensive</strong> (architecture, multi-file refactoring, subtle bugs, security) → Opus</li>
</ul>

<p><strong>Error-cost dimension</strong> (adjusts tier up or down):</p>
<ul>
  <li><strong>Low error cost</strong> (can iterate cheaply, has test coverage) → stay at tier or drop one</li>
  <li><strong>High error cost</strong> (production code, security-sensitive, no tests) → stay at tier or escalate one</li>
</ul>

<h3 id="step-2-configure-the-effort-level">Step 2: Configure the effort level</h3>

<p>For Opus 4.6/4.5, set the effort parameter based on task difficulty:</p>
<ul>
  <li><strong>Low effort</strong>: Simple Opus tasks where you want its knowledge but not deep reasoning</li>
  <li><strong>Medium effort</strong>: Matches Sonnet’s SWE-bench performance with 76% fewer tokens — the sweet spot for most Opus tasks</li>
  <li><strong>High effort</strong> (default): Full reasoning for architecture decisions and complex debugging</li>
  <li><strong>Max effort</strong>: Reserve for the hardest 5% of problems (novel algorithms, multi-codebase refactoring)</li>
</ul>

<p>For Haiku 4.5, <strong>enable extended thinking</strong> for any task beyond simple formatting — the data shows Haiku+thinking outperforms Sonnet+thinking on code review 58% of the time, making it the best value option for many tasks.</p>

<h3 id="step-3-implement-cascading-escalation">Step 3: Implement cascading escalation</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>START → Haiku 4.5
  ├─ Syntax validation passes AND tests pass → ACCEPT
  ├─ Syntax fails OR tests fail → ESCALATE to Sonnet 4.5
  │    ├─ Tests pass → ACCEPT  
  │    ├─ Circular fixes detected OR 2+ failures → ESCALATE to Opus 4.6
  │    │    ├─ Success → ACCEPT
  │    │    └─ Failure → FLAG for human review
  │    └─ Task requires &gt;200K context → ROUTE directly to Opus 4.6
  └─ Task classified as reasoning-intensive → SKIP to Sonnet or Opus
</code></pre></div></div>

<h3 id="step-4-configure-multi-agent-roles">Step 4: Configure multi-agent roles</h3>

<p>For Claude Code specifically:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Set main model to opusplan (Opus plans, Sonnet executes)</span>
claude config <span class="nb">set </span>model opusplan

<span class="c"># Set sub-agents to Haiku for cost efficiency</span>
<span class="nb">export </span><span class="nv">CLAUDE_CODE_SUBAGENT_MODEL</span><span class="o">=</span>haiku

<span class="c"># Override specific sub-agents in YAML frontmatter where needed</span>
<span class="c"># model: sonnet  (for implementation sub-agents)</span>
<span class="c"># model: opus    (for security review sub-agents)</span>
</code></pre></div></div>

<p>For custom multi-agent systems, follow this allocation:</p>

<ul>
  <li><strong>1 Opus orchestrator</strong> decomposes work, reviews results, makes architecture calls</li>
  <li><strong>N Sonnet workers</strong> handle implementation tasks in parallel (one per independent file/module)</li>
  <li><strong>M Haiku utilities</strong> handle exploration, formatting, commit messages, classification</li>
</ul>

<h3 id="step-5-optimize-costs-with-caching-and-batching">Step 5: Optimize costs with caching and batching</h3>

<ul>
  <li>Enable <strong>prompt caching</strong> for system prompts and stable codebase context (break-even at 2 calls; 90% input savings at steady state)</li>
  <li>Use <strong>batch API</strong> (50% discount) for non-real-time work: test generation, documentation, bulk refactoring</li>
  <li>Use <strong>Opus at medium effort</strong> instead of high effort for routine architecture work (saves 76% on output tokens)</li>
  <li>Track spending: target <strong>$6–12/developer/day</strong> on Sonnet as a healthy baseline</li>
</ul>

<h3 id="where-the-evidence-is-thin">Where the evidence is thin</h3>

<p>This methodology rests on strong benchmark evidence for tier-level performance differences and robust community consensus on workflow patterns. However, several areas remain uncertain. The optimal effort parameter settings for specific task types have not been formally studied. Whether cross-model review consistently catches bugs that same-model review misses lacks rigorous measurement. The exact token-count thresholds that should trigger model escalation are based on heuristics, not empirical data. Quality variation during peak usage hours is reported anecdotally but unquantified. And the Haiku+thinking finding from Qodo, while striking, comes from a single benchmark on code review — its generalizability to other coding tasks is unknown.</p>

<p>The field is moving fast. Opus 4.6’s adaptive thinking, which dynamically scales reasoning depth per query, points toward a future where the routing problem dissolves into a single model with a continuous effort dial. Until that future arrives, explicit model routing with the methodology described here represents the evidence-based optimum.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Three insights emerge from this synthesis that go beyond conventional wisdom. First, <strong>the Haiku+thinking combination is dramatically underutilized</strong> — at $1/$5 per million tokens with extended thinking, it outperforms Sonnet+thinking on code review while costing one-third as much. Teams defaulting to Sonnet for everything are leaving significant value on the table. Second, <strong>Opus’s effort parameter has made static tier boundaries obsolete</strong>. Opus at medium effort is effectively a better Sonnet at a similar token cost, meaning the real routing decision is increasingly about effort level rather than model name. Third, <strong>phase-based splitting (plan with Opus, execute with Sonnet, utility with Haiku) has converged independently across every major coding tool</strong> — Claude Code’s <code class="language-plaintext highlighter-rouge">opusplan</code>, Aider’s Architect/Editor, Windsurf’s hidden planner, Cursor’s dual-model architecture — making it the one pattern with the strongest cross-validated evidence. Build your workflow around this pattern, instrument it with feedback loops, and prepare for the routing problem itself to gradually disappear as adaptive thinking capabilities propagate across model tiers.</p>]]></content><author><name>Henrique A. Lavezzo</name></author><category term="llm" /><category term="braindump" /><category term="llm" /><category term="claude" /><category term="ai-models" /><category term="budget" /><summary type="html"><![CDATA[The single most impactful decision in AI-assisted coding isn’t which model you use — it’s knowing when to switch. With Opus 4.6’s price dropping 67% to $5/$25 per million tokens (from $15/$75 in earlier generations), the economics of model routing have fundamentally shifted. The Opus-to-Sonnet cost gap shrank from 5× to just 1.67×, making intelligent routing more about matching cognitive depth to task complexity than pure cost arbitrage. This report synthesizes benchmark data, community experience, tool documentation, and cost analysis into an actionable methodology for routing between Claude Opus, Sonnet, and Haiku during coding sessions — including multi-agent orchestration scenarios.]]></summary></entry><entry><title type="html">Taming your App with Domains</title><link href="https://hlavezzo.me/2023/02/17/taming-your-app-with-domains" rel="alternate" type="text/html" title="Taming your App with Domains" /><published>2023-02-17T01:15:12+00:00</published><updated>2023-02-17T01:15:12+00:00</updated><id>https://hlavezzo.me/2023/02/17/taming-your-app-with-domains</id><content type="html" xml:base="https://hlavezzo.me/2023/02/17/taming-your-app-with-domains"><![CDATA[<p>This is not “yet another article about Domain Driven-Design”. The internet is well served with those articles, some of them are good and others not so much. It’s your duty to consume them and absorb all the good stuff from each one. And just to conclude the logic, we got all classics from books the “Blue Book” by Eric Evans, the “Red Book” by Vaughn Vernon, and others.</p>

<p>Applications are always borns simple, with few complex codes but they always seem straightforward. But the business is here much earlier than the first sunlight hits the application code on the developer’s screen.</p>

<p>And business is complex, and you can’t avoid it. We can make it worse, business is always evolving and adapting. The application will carry those changes, and it’s easy to start to entangle models simply because they seem to be part of a unity. Being part of a monolith doesn’t mean you need to put concrete on top of your code and accept everything will break if you place boundaries.</p>

<p>Knowing the domains of your application is not an easy job, requires some day-to-day work with the codebase, conversation with other <em>code folks</em>, and sometimes with <strong>business folks</strong>. Not all domains will pop up in your mind (or screen), and there’s no rush to anticipate some of them just because you “started” domain segregation earlier. Domains could be explicit like “Accounts” that usually hold the application’s user data about, personal, billing, and security information. And other not so obvious like “Debt Validation” or “Umbrella Store Items” which already belong to a tangled code or another domain, but it’s so big and has too many self-references that you noticed you have a domain under a domain (or a realm inside a realm like I usually like to say).</p>

<p>Segregating your code into domains always is a good choice, your application usually will organize itself, and suggest to the development team a critical view of the business. We do not need to follow all fancy stuff from articles and books, our application (usually a legacy code) not always will accept it entirely without fighting against us. Sometimes simple segregation is better or at least is just a good choice to open your way for implementing a better code architecture that fits with the application (or corporate) needs in the future.</p>

<p><strong>Work smart</strong>, not following recipes.</p>]]></content><author><name>Henrique A. Lavezzo</name></author><category term="tech" /><category term="domains" /><category term="code-architecture" /><summary type="html"><![CDATA[This is not “yet another article about Domain Driven-Design”. The internet is well served with those articles, some of them are good and others not so much. It’s your duty to consume them and absorb all the good stuff from each one. And just to conclude the logic, we got all classics from books the “Blue Book” by Eric Evans, the “Red Book” by Vaughn Vernon, and others.]]></summary></entry><entry><title type="html">Why implementing proper use cases brought joy into my code</title><link href="https://hlavezzo.me/2023/02/11/why-implementing-proper-use-cases-brought-joy-into-my-code" rel="alternate" type="text/html" title="Why implementing proper use cases brought joy into my code" /><published>2023-02-11T01:15:12+00:00</published><updated>2023-02-11T01:15:12+00:00</updated><id>https://hlavezzo.me/2023/02/11/why-implementing-proper-use-cases-brought-joy-into-my-code</id><content type="html" xml:base="https://hlavezzo.me/2023/02/11/why-implementing-proper-use-cases-brought-joy-into-my-code"><![CDATA[<p>Coding sometimes isn’t about only inverting binary trees, implementing a super duper array reorder algorithm. We need to handle business cases, and not all cases are well-defined, a bunch of iterations are required with business experts, customers, and other coding folks. And those iterations sooner or later could create a web of written classes that needs to work together for a big purpose, but when you zoom out they seem not to make sense, and your code joy could get dusty.</p>

<p>With this in mind, and facing it every day, I decided to bring joy into it. Coding was always fun to me, a really creative part of my day. And to achieve it, I needed a (not really a code) pattern that will call the duty of holding the business and organizing it.</p>

<p>After revisiting some books like Clean Architecture by Uncle Bob, Domain Driven Design by Eric Evans, and Practical Object-Oriented Design <em>(because I’m rubist)</em> by Sandy Metz. A sparkle of an idea happened on how I could organize it. Implement a simple use-case definition, with a small contract to follow!</p>

<p>Not only the code solved the problem, but some concepts applied around the Rails architecture helped to achieve the solution. But we can leave this discussion for another time.
From this idea and actions born <a href="https://github.com/Rynaro/fluxus">Fluxus</a>, a simple dependencyless library for containing the use-cases. Or just adding a set of logical steps that you and to predict what will happen.</p>

<p>Okay. But where is the joy? All steps to solve the problem, and having a brand new way to code and see a logical organization on it. There it is the joy! Building and bringing value to your own day!</p>]]></content><author><name>Henrique A. Lavezzo</name></author><category term="tech" /><category term="ruby" /><category term="use-cases" /><category term="ddd" /><category term="motivation" /><summary type="html"><![CDATA[Coding sometimes isn’t about only inverting binary trees, implementing a super duper array reorder algorithm. We need to handle business cases, and not all cases are well-defined, a bunch of iterations are required with business experts, customers, and other coding folks. And those iterations sooner or later could create a web of written classes that needs to work together for a big purpose, but when you zoom out they seem not to make sense, and your code joy could get dusty.]]></summary></entry><entry><title type="html">First voyage of Rubist into Clojure</title><link href="https://hlavezzo.me/2020/01/14/first-voyage-of-rubist-into-clojure" rel="alternate" type="text/html" title="First voyage of Rubist into Clojure" /><published>2020-01-14T01:15:12+00:00</published><updated>2020-01-14T01:15:12+00:00</updated><id>https://hlavezzo.me/2020/01/14/first-voyage-of-rubist-into-clojure</id><content type="html" xml:base="https://hlavezzo.me/2020/01/14/first-voyage-of-rubist-into-clojure"><![CDATA[<p>Few days ago, I’ve decided to learn something new. But, not a new framework in a known language, in my safety zone. I wanted something, a new flame to expurge the ashes of daily issues that were consuming my motivation one month per time.</p>

<p>Then I have tried some languages, some tools, more than one time. I could list all techs that I’ve tried, but that not the focus of this post. And the fire was unexpected lit, after few minutes reading about Clojure. I felt the exact same feeling when I was tried Ruby by myself for the first time. That’s was a clearly match!</p>

<p>My study flow, is always evolving, and under strict adaptation. For Clojure studies, I’ve read a lot about language, and functional paradigm. Write few random codes on <code class="language-plaintext highlighter-rouge">lein repl</code>, to train some basics of language. And after this read more about language.</p>

<p>After 3 days, I felt really confortable with language. And I would like to go deep, and try to build things on Clojure. That’s right, I could write some codes from exercises list, but I always felt supressed when I face a list of exercises, and I subconsiously refuses to follow the exercises. (In fact, I had some problems in school classes with this kind of activities. Sometimes I was labelled “lazy student with good grades.”)</p>

<p>Ok, list of exercises was out of options. On Ruby I really like to write granular code, and I have several “in company” private gems, and some public gems. And in Clojure we have clojars, the idea raises up. Let’s build a clojar.</p>

<p>Recently I’ve a demand on Ruby code, to handle a realtime zipcode validation (we call CEP in Brazil), for boleto generation. (We’ll stop here about the demand, thats other topic, we can talk about it in other post. Who knows? :grimacing: )</p>

<p>That’s perfect, the idea was fresh in my brain. And the target service for consumption has a little outdated documentation. Then I will use this as point to research.</p>

<p>I’ve go into service sources, and tests, to learn and get new brand resources to insert into my clojar. I’ve tested all endpoints, and it’s all clear, working perfectly. (At this point, I really in debt with this project. I’m perfect able to update the documentation. I’ve put in my TODO list)</p>

<p>The service return the REST pattern, an 200 code with body when data cames from API. And a 404 code when API does not returns nothing. When I receives a 200, its easy to return a map with contents to user, with <code class="language-plaintext highlighter-rouge">cheshire</code>.</p>

<p><em>(Note: When you call <code class="language-plaintext highlighter-rouge">parse-string</code>, to convert the json into map, all keys cames as string too. If you want to get symbol-like in clojure. You need to fill a argument/parameter with <code class="language-plaintext highlighter-rouge">true</code>. I really don’t like it. Does not sound idiomatic.)</em></p>

<p>But when you get a 404 from service, <code class="language-plaintext highlighter-rouge">clj-http</code> raises a exception. The odds is always with us, we can perfectly handle this problem with <code class="language-plaintext highlighter-rouge">slingshot</code>, creating a custom catch for 404 code. I really like to throw exceptions, it’s more than a error for me. We can express unexpected behaviors, and handle with a situation without a cascade of conditionals (Let the destiny defines what you do).
And I choose to throw an custom exception for user, but more idiomatic. (<code class="language-plaintext highlighter-rouge">:type ::nothing-returned</code>)</p>

<p>Alongside this code flow, I built the tests, for sure. And I really like the <code class="language-plaintext highlighter-rouge">clojure.test</code>, it’s simple and get the job done. One of the points what I really like, is the use of <code class="language-plaintext highlighter-rouge">with-redefs</code>. I could do mock all <code class="language-plaintext highlighter-rouge">clj-http</code> client requests, and set responses without problem, and everything is core builted in language. And I write tests to cover all critical points of the simple “clojar”.</p>

<p>It’s done! Tests covering the code. And I think, it’s simple to use, and the source code is simple, and easier to maintain too.</p>

<h3 id="lets-deploy-on-clojars-">Let’s deploy on <a href="https://clojars.org/">Clojars</a> !</h3>

<p>I needed to create an account, just like rubygems. And after some few adjustments on <code class="language-plaintext highlighter-rouge">project.clj</code>, I was able to deploy the lib.</p>

<p>Just executing <code class="language-plaintext highlighter-rouge">lein deploy clojars</code>. It’s dead simple, like the website  says. After some seconds, I get my clojar badge, and updates the README on GitHub.</p>

<p>After this, I built a simple Travis workflow, to test the code under <code class="language-plaintext highlighter-rouge">openjdk-8</code> and <code class="language-plaintext highlighter-rouge">openjdk-11</code> at every commit on <code class="language-plaintext highlighter-rouge">master</code>.</p>

<h3 id="conclusion">Conclusion</h3>

<p>I found in Clojure a new way to think, and build things. I fell in my Ruby codes today, a huge influence of Clojure way to handle things. And I really like it.</p>

<p>If you have interest to see my “lib”, here’s url https://github.com/Rynaro/postmon-clj</p>

<p>Thanks for reading! :tada:</p>]]></content><author><name>Henrique A. Lavezzo</name></author><category term="tech" /><category term="clojure" /><category term="ruby" /><category term="functional" /><category term="motivation" /><summary type="html"><![CDATA[Few days ago, I’ve decided to learn something new. But, not a new framework in a known language, in my safety zone. I wanted something, a new flame to expurge the ashes of daily issues that were consuming my motivation one month per time.]]></summary></entry><entry><title type="html">Setup simple SFTP server in minutes</title><link href="https://hlavezzo.me/2019/12/12/setup-simple-sftp-server-in-minutes" rel="alternate" type="text/html" title="Setup simple SFTP server in minutes" /><published>2019-12-12T17:25:55+00:00</published><updated>2019-12-12T17:25:55+00:00</updated><id>https://hlavezzo.me/2019/12/12/setup-simple-sftp-server-in-minutes</id><content type="html" xml:base="https://hlavezzo.me/2019/12/12/setup-simple-sftp-server-in-minutes"><![CDATA[<h2 id="context">Context</h2>

<p>One of most common ways to share files between companies is still FTP servers. And sometimes, you need to setup a FTP in-house, whether out compliance control, security, cost, or ‘cause its simple enough to do it yourself.</p>

<p>I’ve one FTP server in company that I work. It’s a simple FTP server, developed with Python, using <code class="language-plaintext highlighter-rouge">pyftpdlib</code> package, and aws S3 integration. We have a hook action, that send file into a folder mirror named bucket, to secure files, and after 15 days, we made a server FS clean, to guarantee healthy disk space level.</p>

<p>But recently, we get a specific trait from new partner, we need to expose an sftp server. In a quick search, <code class="language-plaintext highlighter-rouge">pyftpdlib</code> does not support sftp protocol. After this, I go to aws services, to see how much cost the use of <strong>AWS Transfer</strong>. It’s easy to use service, but expensive for a small startup, and I don’t think we need an entire service for this. In other situation, our monthly invoice will be affected by third-party factor, and one mistake made by our partner, could increase the invoice numbers.</p>

<p>Given the above factors, I decided to build a simple sftp from scratch.</p>

<h2 id="diy-setup">DIY Setup</h2>

<p>First of all, you’ll need a server instance. In this case, I’ve used a DigitalOcean Droplet. My decision was driven by low-cost purposes.</p>

<p>I like Ubuntu server instances, and this “paper” uses the assumption the server is a Ubuntu server.</p>

<h4 id="packages">Packages</h4>

<p>Make sure, your instance is updated.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># apt update &amp;&amp; apt upgrade</span></code></pre></figure>

<p>Install vim, <del>or use nano</del>.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># apt install vim</span></code></pre></figure>

<h4 id="create-user">Create user</h4>

<p>You’ll need to create a user, for your third-party user. We’ll call our friend, as <strong>partner</strong> here. Say hello to <strong>Partner</strong>.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># adduser --shell /bin/false partner</span></code></pre></figure>

<p>You can allow your Linux, to create home folders. But actually, I like to stay in front of situation.</p>

<h4 id="create-user-folder">Create user folder</h4>

<p>If you allowed <code class="language-plaintext highlighter-rouge">adduser</code> to create home folders, then you don’t need to create a permitted folder space.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># mkdir -p /var/sftp/partner/files</span></code></pre></figure>

<p>Remember to guarantee permissions to <strong>Partner</strong> in your <em>home sweet home</em>.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># chown partner:partner /var/sftp/partner</span>
<span class="c"># chmod 755 /var/sftp/partner</span></code></pre></figure>

<h4 id="sftp-access-restrictions">SFTP access restrictions</h4>

<p><strong>Partner</strong> is a common user inside our server. And without other (recommended) security rules, <strong>Partner</strong> will be able to make an ssh connection. And we don’t want this.</p>

<p>We’ll create a rule at end of file of <code class="language-plaintext highlighter-rouge">sshd_config</code>, for sftp only restriction.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># vim /etc/ssh/sshd_config</span></code></pre></figure>

<p>The content:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">Match User partner
	ForceCommand internal-sftp
	PasswordAuthentication <span class="nb">yes
	</span>ChrootDirectory /var/sftp/partner
	PermitTunnel no
	AllowAgentForwarding no
	AllowTcpForwarding no
	X11Forwarding no</code></pre></figure>

<h4 id="restart-ssh-service">Restart SSH Service</h4>

<p>After configure <strong>Partner</strong> restriction, you’ll need to restart SSH service to make sure changes take effect on server.</p>

<p><em>You can be disconnected after this. Just reconnect.</em></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># systemctl restart ssh</span></code></pre></figure>

<h4 id="create-password">Create password</h4>

<p>Create a password for partner if didn’t create one yet.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># passwd partner</span></code></pre></figure>

<h4 id="testing-sftp-server">Testing sftp server</h4>

<h5 id="sftp-connection">SFTP Connection</h5>
<p>For sftp connection, try to connect in your server with <strong>partner</strong> credentials.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>sftp partner@your-sftp-server</code></pre></figure>

<p>Type password, and if everything is alright, you’ll enter inside <strong>partner</strong> sftp home folder.</p>

<h5 id="ssh-connection">SSH Connection</h5>

<p><strong>Partner</strong> should has access only to sftp and no ssh connections should be allowed. The test is simple, just try to connect with SSH.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>ssh partner@your-sftp-server</code></pre></figure>

<p>Type password, hit enter. And you expect to receive this warning message.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">This service allows sftp connections only.
Connection to your-sftp-server closed.</code></pre></figure>

<hr />

<p>After this, you can send the <strong>partner</strong> credentials to <strong>Partner</strong>. :joy:</p>

<p>This “tutorial” has the purpose to show a simple way to build an sftp server using only Linux resources. As you can see, this “tutorial” doesn’t go deep inside major security efforts. But, you can easily enforce your security, using Linux resources too, or using the service providers (aws, Digital Ocean, etc) tools.</p>]]></content><author><name>Henrique A. Lavezzo</name></author><category term="tech" /><category term="linux" /><category term="sysadmin" /><category term="sftp" /><summary type="html"><![CDATA[Context]]></summary></entry><entry><title type="html">My notebook !</title><link href="https://hlavezzo.me/2019/03/06/my-notebook" rel="alternate" type="text/html" title="My notebook !" /><published>2019-03-06T15:44:00+00:00</published><updated>2019-03-06T15:44:00+00:00</updated><id>https://hlavezzo.me/2019/03/06/my-notebook</id><content type="html" xml:base="https://hlavezzo.me/2019/03/06/my-notebook"><![CDATA[<p>Recently I’ve decided to return in my open source life. And this decision has direct
impact in this blog, because open source isn’t only about code, or metrics.
For me it’s about ideas, knowledge sharing, and good networking.</p>

<p>In this “notebook”, I will write (when I have a break) about my routine inside the
codes, inside the books (I really like to talk about J.R.R Tolkien books), and
whatever I want. :D</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">puts</span> <span class="s1">'later! :)'</span>
<span class="c1">#=&gt; prints 'later! :)' to STDOUT.</span></code></pre></figure>]]></content><author><name>Henrique A. Lavezzo</name></author><category term="hobby" /><category term="jekyll" /><category term="rebranding" /><summary type="html"><![CDATA[Recently I’ve decided to return in my open source life. And this decision has direct impact in this blog, because open source isn’t only about code, or metrics. For me it’s about ideas, knowledge sharing, and good networking.]]></summary></entry></feed>