167 lines
79 KiB
HTML
167 lines
79 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" dir="ltr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>Module 5: Production Patterns | Agentic Engineering the Hard Way</title>
|
||
<meta name="description" content="Build every component from scratch. 65 lessons, 13 labs, 20 skill kits. No black boxes.">
|
||
<meta name="generator" content="VitePress v1.6.4">
|
||
<link rel="preload stylesheet" href="/assets/style.C_FHED8r.css" as="style">
|
||
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.DsGbA1uz.js"></script>
|
||
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.4gyVl2PR.js">
|
||
<link rel="modulepreload" href="/assets/chunks/framework.BPKcPtvA.js">
|
||
<link rel="modulepreload" href="/assets/modules_m5-production.md.DTkLIrwQ.lean.js">
|
||
<link rel="icon" href="/favicon.svg">
|
||
<meta name="theme-color" content="#0f0f0f">
|
||
<meta property="og:title" content="Agentic Engineering the Hard Way">
|
||
<meta property="og:description" content="65 lessons, 13 labs, 20 skill kits. Build production-grade AI agent systems from scratch. No black boxes.">
|
||
<meta property="og:image" content="/og-image.svg">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
|
||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,700;9..40,800&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0,0" rel="stylesheet">
|
||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||
</head>
|
||
<body>
|
||
<div id="app"><div class="fdsa-app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!----><span data-v-9f43907a>FDSA</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/modules/m1-foundations" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Course</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/labs/l1-first-agent" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Labs</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/skills" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Skills</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/blog" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Blog</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bfe7971f><span class="text" data-v-bfe7971f><!----><span data-v-bfe7971f>More</span><span class="vpi-chevron-down text-icon" data-v-bfe7971f></span></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/modules/curriculum" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>Curriculum</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/modules/debate" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>Debate</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/troubleshooting" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>FAQ</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/certificate" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>Certificate</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-7eeeb2dc><a class="VPLink link" href="/buy" data-v-7eeeb2dc><!--[--><span data-v-7eeeb2dc>Buy</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="http://185.239.209.216:3001/artale/agentic-engineering-course" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="http://185.239.209.216:3001/artale/agentic-engineering-course" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 1: Foundations</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-11-what-makes-an-agent" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.1 What Makes an Agent?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-12-the-harness-vs-the-model" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.2 Harness vs The Model</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-13-decision-framework" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.3 Decision Framework</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-13a-the-repository-is-the-spec" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.4 Repository IS the Spec</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-14-the-agent-loop" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.5 The Agent Loop</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-15-tool-calling-deep-dive" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.6 Tool Calling</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-16-vibe-coding-vs-agentic-engineering" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.7 Vibe Coding vs Engineering</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m1-foundations#lesson-17-do-you-trust-your-agents" data-v-0009425e><!--[--><p class="text" data-v-0009425e>1.8 Do You Trust Your Agents?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l1-first-agent" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Lab 1.9: First Agent</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m2-architecture" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 2: Architecture</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m2-architecture#lesson-21-the-four-pillars" data-v-0009425e><!--[--><p class="text" data-v-0009425e>2.1-2.3 Core Architecture</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m2-architecture#lesson-23b-skills-system-deep-dive" data-v-0009425e><!--[--><p class="text" data-v-0009425e>2.4-2.6 Skills & Workspace</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m2-architecture#lesson-24-context-window-management" data-v-0009425e><!--[--><p class="text" data-v-0009425e>2.7-2.9 Advanced Patterns</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l2-multi-tool" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Labs 2.10-2.11</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m3-safety" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 3: Safety & Security</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m3-safety#lesson-31-why-bash-is-the-single-point-of-failure" data-v-0009425e><!--[--><p class="text" data-v-0009425e>3.1-3.2 Bash & Ladder</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m3-safety#lesson-33-the-l3-marque-break" data-v-0009425e><!--[--><p class="text" data-v-0009425e>3.3-3.5 Hooks & Control</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m3-safety#lesson-36-the-verifier-pattern" data-v-0009425e><!--[--><p class="text" data-v-0009425e>3.6-3.7 Verifier & Stacking</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l3-whitelist-hook" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Labs 3.8-3.9</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m4-orchestration" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 4: Orchestration</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m4-orchestration#lesson-41-why-one-agent-is-not-enough" data-v-0009425e><!--[--><p class="text" data-v-0009425e>4.1-4.4 Patterns</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m4-orchestration#lesson-43-depth-2-delegation" data-v-0009425e><!--[--><p class="text" data-v-0009425e>4.5-4.9 Teams & Comms</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m4-orchestration#lesson-410-the-ceo-board-system" data-v-0009425e><!--[--><p class="text" data-v-0009425e>4.10-4.11 Case Studies</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l4-agent-chain" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Labs 4.12-4.13</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m5-production" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 5: Production</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m5-production#lesson-51-what-production-means-for-agents" data-v-0009425e><!--[--><p class="text" data-v-0009425e>5.1-5.4 CI/CD & Stack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m5-production#lesson-53-shadow-deployments" data-v-0009425e><!--[--><p class="text" data-v-0009425e>5.5-5.8 Deploy & Monitor</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l5-observability" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Labs 5.9-5.10</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m6-economics" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 6: Economics</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m6-economics#lesson-60-the-compute-advantage-equation" data-v-0009425e><!--[--><p class="text" data-v-0009425e>6.0-6.2 Pricing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m6-economics#lesson-63-cost-per-session-math" data-v-0009425e><!--[--><p class="text" data-v-0009425e>6.3-6.5 Eval Metrics</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m6-economics#lesson-66-ab-testing-agents" data-v-0009425e><!--[--><p class="text" data-v-0009425e>6.6-6.7 Testing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l6-eval-harness" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Labs 6.8-6.9</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m7-advanced" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 7: Advanced</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m7-advanced#lesson-71-autoresearch" data-v-0009425e><!--[--><p class="text" data-v-0009425e>7.1-7.3 Autoresearch</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m7-advanced#lesson-73-meta-agents" data-v-0009425e><!--[--><p class="text" data-v-0009425e>7.4-7.6 Meta & Beyond</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/labs/l7-autoresearch" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Labs 7.7-7.8</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-51288d80 data-v-0009425e><div class="item" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m8-capstone" data-v-0009425e><!--[--><h2 class="text" data-v-0009425e>Module 8: Capstone</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m8-capstone#project-options" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Project Options</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m8-capstone#capstone-phases" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Phases</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/modules/m8-capstone#grading-rubric" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Rubric</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>On this page</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _modules_m5-production" data-v-e6f2a212><div><h1 id="module-5-production-patterns" tabindex="-1">Module 5: Production Patterns <a class="header-anchor" href="#module-5-production-patterns" aria-label="Permalink to "Module 5: Production Patterns""></a></h1><h2 id="lesson-5-1-what-production-means-for-agents" tabindex="-1">Lesson 5.1: What Production Means for Agents <a class="header-anchor" href="#lesson-5-1-what-production-means-for-agents" aria-label="Permalink to "Lesson 5.1: What Production Means for Agents""></a></h2><p>Production for agents is fundamentally different from traditional software:</p><table tabindex="0"><thead><tr><th>Traditional Software</th><th>Agent Systems</th></tr></thead><tbody><tr><td>Deterministic output</td><td>Non-deterministic behavior</td></tr><tr><td>Fixed cost per operation</td><td>Variable cost per session</td></tr><tr><td>Error = known exception</td><td>Error = unexpected behavior</td></tr><tr><td>Rollback = revert code</td><td>Rollback = revert prompt + pin model</td></tr><tr><td>Monitoring = latency + errors</td><td>Monitoring = token usage + loop depth</td></tr><tr><td>Testing = unit + integration</td><td>Testing = golden datasets + evals</td></tr></tbody></table><h3 id="production-readiness-checklist" tabindex="-1">Production Readiness Checklist <a class="header-anchor" href="#production-readiness-checklist" aria-label="Permalink to "Production Readiness Checklist""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>[ ] Version-locked prompts (hashed, diffed, reviewed)</span></span>
|
||
<span class="line"><span>[ ] Model pinning (not "latest", specific version)</span></span>
|
||
<span class="line"><span>[ ] Cost budgets per session/task/user</span></span>
|
||
<span class="line"><span>[ ] Iteration limits (max tool calls per session)</span></span>
|
||
<span class="line"><span>[ ] Observability (every tool call logged)</span></span>
|
||
<span class="line"><span>[ ] Shadow deployment capability</span></span>
|
||
<span class="line"><span>[ ] Rollback plan (prompt + model + env)</span></span>
|
||
<span class="line"><span>[ ] Security review (L3+ minimum)</span></span></code></pre></div><hr><h2 id="lesson-5-2-ci-cd-for-agents" tabindex="-1">Lesson 5.2: CI/CD for Agents <a class="header-anchor" href="#lesson-5-2-ci-cd-for-agents" aria-label="Permalink to "Lesson 5.2: CI/CD for Agents""></a></h2><h3 id="golden-dataset" tabindex="-1">Golden Dataset <a class="header-anchor" href="#golden-dataset" aria-label="Permalink to "Golden Dataset""></a></h3><p>A curated set of input/output/behavior pairs that define correct agent behavior:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "input"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Find all users created in the last 24 hours"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "expected_tools"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"query_database"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "expected_tool_params"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"query"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"SELECT * FROM users WHERE created_at > now() - interval '24 hours'"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "expected_output_contains"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"24 hours"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre></div><h3 id="pipeline" tabindex="-1">Pipeline <a class="header-anchor" href="#pipeline" aria-label="Permalink to "Pipeline""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>1. Agent runs against golden dataset</span></span>
|
||
<span class="line"><span>2. Compare: tool selections match expected?</span></span>
|
||
<span class="line"><span> params match expected?</span></span>
|
||
<span class="line"><span> output contains expected strings?</span></span>
|
||
<span class="line"><span>3. Calculate pass@k</span></span>
|
||
<span class="line"><span>4. If pass@k < threshold (e.g., 80%), FAIL build</span></span>
|
||
<span class="line"><span>5. If pass, deploy new prompt/config</span></span></code></pre></div><hr><h2 id="lesson-5-2b-case-study-—-the-5-tool-production-stack" tabindex="-1">Lesson 5.2b: Case Study — The 5-Tool Production Stack <a class="header-anchor" href="#lesson-5-2b-case-study-—-the-5-tool-production-stack" aria-label="Permalink to "Lesson 5.2b: Case Study — The 5-Tool Production Stack""></a></h2><p>A real production multi-agent deployment uses multiple agent tools together, each for its strength. See <code>TOOL-REFERENCE.md</code> for full command references.</p><h3 id="the-stack" tabindex="-1">The Stack <a class="header-anchor" href="#the-stack" aria-label="Permalink to "The Stack""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>agent-mux (Tauri UI) —— Meta-agent control plane</span></span>
|
||
<span class="line"><span> │ └── cc agent SDK, pi-coding-agent SDK, opencode SDK via sidecar</span></span>
|
||
<span class="line"><span> ▼</span></span>
|
||
<span class="line"><span>mprocs (process monitor) —— Launches all agents</span></span>
|
||
<span class="line"><span> │ mprocs -c ~/mprocs-teams.yaml</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── claude-lead (Claude Code)</span></span>
|
||
<span class="line"><span> │ └── psmux → tmux.exe → --teammate-mode → split panes</span></span>
|
||
<span class="line"><span> │ └── Each teammate = separate Claude session</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── pi-agent (Pi Coding Agent)</span></span>
|
||
<span class="line"><span> │ └── Extensions: damage-control, tilldone, coms</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── opencode (OpenCode CLI)</span></span>
|
||
<span class="line"><span> │ └── Model: opencode-go/deepseek-v4-flash (via proxy)</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── hermes (Hermes Agent)</span></span>
|
||
<span class="line"><span> │ └── TypeScript-native, MCP-first workflows</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── openclaw (OpenClaw daemon)</span></span>
|
||
<span class="line"><span> │ └── Always-on employee, heartbeat-driven</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── gemini (Gemini fallback)</span></span>
|
||
<span class="line"><span> │ └── Fast/cheap tasks, cascade routing</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ├── qwen (Qwen specialist)</span></span>
|
||
<span class="line"><span> │ └── Chinese + structured tasks</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> └── sidecar (agent-mux IPC proxy)</span></span>
|
||
<span class="line"><span> └── RPC bridge between Tauri UI and agent processes</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ▼</span></span>
|
||
<span class="line"><span> psmux (tmux session manager)</span></span>
|
||
<span class="line"><span> │ tmux.exe at ~/.cargo/bin/tmux</span></span>
|
||
<span class="line"><span> │ Requires: start agent-teams first, then dmux inside it</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ▼</span></span>
|
||
<span class="line"><span> dmux (git worktree isolation)</span></span>
|
||
<span class="line"><span> Each task gets an isolated worktree</span></span>
|
||
<span class="line"><span> Rollback = delete worktree</span></span></code></pre></div><h3 id="tool-roles-and-selection-logic" tabindex="-1">Tool Roles and Selection Logic <a class="header-anchor" href="#tool-roles-and-selection-logic" aria-label="Permalink to "Tool Roles and Selection Logic""></a></h3><table tabindex="0"><thead><tr><th>Tool</th><th>Role</th><th>When to Use</th><th>Stack Position</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td>Primary coding agent</td><td>Complex multi-step tasks, general development</td><td><code>claude-lead</code> in mprocs</td></tr><tr><td><strong>Pi Agent</strong></td><td>Customizable harness</td><td>Custom workflows, safety-critical ops, P2P</td><td>Side agent with extensions</td></tr><tr><td><strong>OpenCode</strong></td><td>OSS alternative</td><td>Budget tasks, CI/CD, when license matters</td><td>Backup in mprocs</td></tr><tr><td><strong>Hermes</strong></td><td>TypeScript pipelines</td><td>MCP-native workflows, structured output</td><td>Specialist in mprocs</td></tr><tr><td><strong>OpenClaw</strong></td><td>Always-on employee</td><td>Scheduled tasks, heartbeats, recurring</td><td>Daemon (always running)</td></tr><tr><td><strong>Gemini</strong></td><td>Fast/cheap fallback</td><td>High-volume simple tasks</td><td>Cascade routing tier 1</td></tr><tr><td><strong>Qwen</strong></td><td>Specialist model</td><td>Chinese content, structured generation</td><td>Cascade routing tier 2</td></tr></tbody></table><h3 id="how-they-work-together-real-session-flow" tabindex="-1">How They Work Together (Real Session Flow) <a class="header-anchor" href="#how-they-work-together-real-session-flow" aria-label="Permalink to "How They Work Together (Real Session Flow)""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>1. Human opens agent-mux Tauri UI</span></span>
|
||
<span class="line"><span>2. mprocs launches all agents from mprocs-teams.yaml</span></span>
|
||
<span class="line"><span>3. Claude Code (lead) runs in tmux via psmux</span></span>
|
||
<span class="line"><span> └── --teammate-mode creates split panes:</span></span>
|
||
<span class="line"><span> ├── pane 1: lead (primary coder)</span></span>
|
||
<span class="line"><span> ├── pane 2: worker (sub-tasks)</span></span>
|
||
<span class="line"><span> ├── pane 3: reviewer (code review)</span></span>
|
||
<span class="line"><span> └── pane 4: verifier (read-only checks)</span></span>
|
||
<span class="line"><span>4. OpenCode runs alongside as budget-aware backup</span></span>
|
||
<span class="line"><span>5. OpenClaw daemon handles scheduled background tasks</span></span>
|
||
<span class="line"><span>6. dmux isolates each task in its own git worktree</span></span>
|
||
<span class="line"><span>7. agent-mux sidecar collects status from all agents</span></span>
|
||
<span class="line"><span>8. Human monitors via Tauri UI, intervenes when needed</span></span></code></pre></div><h3 id="key-production-patterns" tabindex="-1">Key Production Patterns <a class="header-anchor" href="#key-production-patterns" aria-label="Permalink to "Key Production Patterns""></a></h3><ol><li><strong>Model heterogeneity</strong> — Different models for different roles. Cascade routing in practice (M6).</li><li><strong>Tool heterogeneity</strong> — Five CLIs, each with different strengths. No single point of failure.</li><li><strong>Process management</strong> — mprocs supervises. If one agent crashes, the stack keeps running.</li><li><strong>Session isolation</strong> — psmux (terminal sessions) + dmux (git worktrees) = two layers.</li><li><strong>Meta-control plane</strong> — agent-mux Tauri UI. Human watches and intervenes, not drives.</li><li><strong>Defense in depth</strong> — tool-level (damage-control), session-level (psmux), filesystem-level (dmux).</li></ol><hr><h2 id="lesson-5-2c-the-agent-manager-role" tabindex="-1">Lesson 5.2c: The Agent Manager Role <a class="header-anchor" href="#lesson-5-2c-the-agent-manager-role" aria-label="Permalink to "Lesson 5.2c: The Agent Manager Role""></a></h2><p>In enterprise deployments, someone owns the agent harness. This is the <strong>Agent Manager</strong> (or DevEx Lead for AI).</p><h3 id="responsibilities" tabindex="-1">Responsibilities <a class="header-anchor" href="#responsibilities" aria-label="Permalink to "Responsibilities""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Agent Manager</span></span>
|
||
<span class="line"><span>├── Harness design (CLAUDE.md, skills, hooks, MCPs)</span></span>
|
||
<span class="line"><span>├── Tool selection (which agent CLIs, which models)</span></span>
|
||
<span class="line"><span>├── Security policy (damage-control rules, access levels)</span></span>
|
||
<span class="line"><span>├── Cost management (budgets per agent/task, optimization)</span></span>
|
||
<span class="line"><span>├── Quality gates (golden datasets, regression testing)</span></span>
|
||
<span class="line"><span>├── Update cadence (prompt versioning, model pinning)</span></span>
|
||
<span class="line"><span>└── Incident response (tool loops, cost spikes, failures)</span></span></code></pre></div><h3 id="_90-day-setup-playbook" tabindex="-1">90-Day Setup Playbook <a class="header-anchor" href="#_90-day-setup-playbook" aria-label="Permalink to "90-Day Setup Playbook""></a></h3><p><strong>Month 1</strong>: Foundation</p><ul><li>Set up agent CLI (Claude Code, Pi, or OpenCode)</li><li>Create CLAUDE.md with project context</li><li>Install damage-control with 3 access levels</li><li>Set up basic observability (tool call logging)</li></ul><p><strong>Month 2</strong>: Scale</p><ul><li>Add multi-agent teams (lead + workers)</li><li>Create golden dataset (10+ test cases)</li><li>Implement CI/CD gate</li><li>Set up cost tracking and budgets</li></ul><p><strong>Month 3</strong>: Production</p><ul><li>Shadow deployment pipeline</li><li>Rollback procedures documented</li><li>Monitoring dashboard live</li><li>Team trained on agent interaction patterns</li></ul><hr><h2 id="lesson-5-3-shadow-deployments" tabindex="-1">Lesson 5.3: Shadow Deployments <a class="header-anchor" href="#lesson-5-3-shadow-deployments" aria-label="Permalink to "Lesson 5.3: Shadow Deployments""></a></h2><h3 id="how-it-works" tabindex="-1">How It Works <a class="header-anchor" href="#how-it-works" aria-label="Permalink to "How It Works""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Production agent: serves user traffic</span></span>
|
||
<span class="line"><span>Shadow agent: runs IDENTICAL inputs, but outputs are NOT served</span></span>
|
||
<span class="line"><span>Compare: did shadow make same decisions as production?</span></span>
|
||
<span class="line"><span> did shadow cost more/less?</span></span>
|
||
<span class="line"><span> did shadow hit any errors?</span></span>
|
||
<span class="line"><span>Decision: if shadow improves on all metrics, swap them</span></span></code></pre></div><h3 id="when-to-shadow-deploy" tabindex="-1">When to Shadow Deploy <a class="header-anchor" href="#when-to-shadow-deploy" aria-label="Permalink to "When to Shadow Deploy""></a></h3><ul><li>New prompt version</li><li>New model version</li><li>New tool addition</li><li>Agent architecture change</li></ul><hr><h2 id="lesson-5-4-rollback-strategies" tabindex="-1">Lesson 5.4: Rollback Strategies <a class="header-anchor" href="#lesson-5-4-rollback-strategies" aria-label="Permalink to "Lesson 5.4: Rollback Strategies""></a></h2><h3 id="what-rollback-means-for-agents" tabindex="-1">What Rollback Means for Agents <a class="header-anchor" href="#what-rollback-means-for-agents" aria-label="Permalink to "What Rollback Means for Agents""></a></h3><p>You can't just revert a Git commit. Agent behavior depends on:</p><ol><li><strong>Prompt</strong> — the text of the system prompt + tools</li><li><strong>Model</strong> — which model version</li><li><strong>Parameters</strong> — temperature, top_p, etc.</li><li><strong>Configuration</strong> — tool list, iteration limits, budget</li></ol><p>A proper rollback restores ALL four.</p><h3 id="implementation" tabindex="-1">Implementation <a class="header-anchor" href="#implementation" aria-label="Permalink to "Implementation""></a></h3><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># agent-config-v42.yaml</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">prompt_hash</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"a1b2c3d4"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">model</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"claude-sonnet-4-20260501"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # pinned, not "latest"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">temperature</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.0</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">max_iterations</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">25</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">tools</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"read"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"write"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"bash"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"search"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">budget_per_session</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.50</span></span></code></pre></div><p>Rollback = <code>cp agent-config-v41.yaml agent-config.yaml</code> + reload.</p><hr><h2 id="lesson-5-5-observability-monitoring" tabindex="-1">Lesson 5.5: Observability & Monitoring <a class="header-anchor" href="#lesson-5-5-observability-monitoring" aria-label="Permalink to "Lesson 5.5: Observability & Monitoring""></a></h2><h3 id="what-to-trace-every-single-turn" tabindex="-1">What to Trace (Every Single Turn) <a class="header-anchor" href="#what-to-trace-every-single-turn" aria-label="Permalink to "What to Trace (Every Single Turn)""></a></h3><ol><li><strong>Input prompt</strong> (full, including system prompt)</li><li><strong>LLM response</strong> (including tool call choices)</li><li><strong>Tool calls</strong> (name, params, timestamp)</li><li><strong>Tool results</strong> (output, error status, duration)</li><li><strong>Token counts</strong> (input, output, cached)</li><li><strong>Cost</strong> (per-call and running total)</li><li><strong>Loop depth</strong> (current turn number)</li></ol><h3 id="decision-tracing" tabindex="-1">Decision Tracing <a class="header-anchor" href="#decision-tracing" aria-label="Permalink to "Decision Tracing""></a></h3><p>Standard APM (Datadog, Grafana) captures latency and errors. Agents need <strong>decision tracing</strong> — the full chain of reasoning and actions:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "session_id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"sess_abc123"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "turn"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "input_tokens"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">12400</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "output_tokens"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">350</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "tool_calls"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"tool"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"search_web"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"params"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"query"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"latest pricing"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"duration_ms"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "decision"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Found pricing page, will extract"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h3 id="key-metrics" tabindex="-1">Key Metrics <a class="header-anchor" href="#key-metrics" aria-label="Permalink to "Key Metrics""></a></h3><table tabindex="0"><thead><tr><th>Metric</th><th>Warning</th><th>Critical</th></tr></thead><tbody><tr><td>Tool calls per session</td><td>>20</td><td>>50</td></tr><tr><td>Cost per session</td><td>>$0.50</td><td>>$2.00</td></tr><tr><td>Loop depth</td><td>>15</td><td>>30</td></tr><tr><td>Same tool >5x in row</td><td>Investigate loop</td><td>Kill session</td></tr><tr><td>Context utilization</td><td>>80%</td><td>>95%</td></tr></tbody></table><hr><h2 id="lesson-5-6-alerting-on-agent-specific-signals" tabindex="-1">Lesson 5.6: Alerting on Agent-Specific Signals <a class="header-anchor" href="#lesson-5-6-alerting-on-agent-specific-signals" aria-label="Permalink to "Lesson 5.6: Alerting on Agent-Specific Signals""></a></h2><h3 id="what-to-alert-on" tabindex="-1">What to Alert On <a class="header-anchor" href="#what-to-alert-on" aria-label="Permalink to "What to Alert On""></a></h3><ol><li><strong>Tool loop detected</strong> — same tool called 5+ times with same params</li><li><strong>Cost spike</strong> — session cost > 3x average</li><li><strong>Context overflow imminent</strong> — token count within 10% of limit</li><li><strong>Permission escalation</strong> — agent attempting blocked operations</li><li><strong>Error cascade</strong> — 3+ tool failures in a row</li><li><strong>Grinding detected</strong> — identical code rerun without changes</li></ol><h3 id="alert-routing" tabindex="-1">Alert Routing <a class="header-anchor" href="#alert-routing" aria-label="Permalink to "Alert Routing""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>P0 (immediate): Cost spike > $10, permission escalation, data exfil attempt</span></span>
|
||
<span class="line"><span>P1 (within 5 min): Tool loop, error cascade, grinding</span></span>
|
||
<span class="line"><span>P2 (within 1 hour): Context utilization high, cost trending up</span></span>
|
||
<span class="line"><span>P3 (daily report): Average session cost, success rate, failure modes</span></span></code></pre></div><h2 id="lesson-5-6b-cross-provider-session-search" tabindex="-1">Lesson 5.6b: Cross-Provider Session Search <a class="header-anchor" href="#lesson-5-6b-cross-provider-session-search" aria-label="Permalink to "Lesson 5.6b: Cross-Provider Session Search""></a></h2><p>When you run agents across 5+ tools (Claude Code, Pi, OpenCode, Gemini, OpenClaw), session history is scattered across different directories and formats.</p><h3 id="the-problem" tabindex="-1">The Problem <a class="header-anchor" href="#the-problem" aria-label="Permalink to "The Problem""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">~</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">/.claude/sessions/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.jsonl </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Claude Code format</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">~</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">/.pi/sessions/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.jsonl </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Pi format</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">~</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">/.opencode/sessions/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # OpenCode format</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">~</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">/.gemini/sessions/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.jsonl </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Gemini format</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">mprocs-logs/*.log</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # mprocs supervisor logs</span></span></code></pre></div><p>Searching across all of them is impossible without a unified index.</p><h3 id="the-solution" tabindex="-1">The Solution <a class="header-anchor" href="#the-solution" aria-label="Permalink to "The Solution""></a></h3><p><strong>Reference implementation</strong>: Jeff Emanuel's <code>coding_agent_session_search</code> (783★)</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Indexer:</span></span>
|
||
<span class="line"><span> ├── Watches all session directories</span></span>
|
||
<span class="line"><span> ├── Normalizes into canonical format</span></span>
|
||
<span class="line"><span> ├── Full-text indexes prompts, responses, tool calls</span></span>
|
||
<span class="line"><span> └── Stores in SQLite with FTS5</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>Search CLI:</span></span>
|
||
<span class="line"><span> ├── Search across ALL providers from one command</span></span>
|
||
<span class="line"><span> ├── Filter by: provider, date, model, tool, token count</span></span>
|
||
<span class="line"><span> ├── Replay any session from any provider</span></span>
|
||
<span class="line"><span> └── Export sessions as markdown or JSON</span></span></code></pre></div><h3 id="why-this-matters-for-production" tabindex="-1">Why This Matters for Production <a class="header-anchor" href="#why-this-matters-for-production" aria-label="Permalink to "Why This Matters for Production""></a></h3><ol><li><strong>Debugging</strong>: Find what went wrong across all agents in one search</li><li><strong>Audit</strong>: Full history of every agent action, unified format</li><li><strong>Learning</strong>: Search past solutions instead of re-solving problems</li><li><strong>Cost analysis</strong>: Aggregate costs across all providers</li></ol><h3 id="integration-with-our-stack" tabindex="-1">Integration with Our Stack <a class="header-anchor" href="#integration-with-our-stack" aria-label="Permalink to "Integration with Our Stack""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Add to mprocs-teams.yaml as a sidecar service</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">session-indexer:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> cmd:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"python"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"session-indexer.py",</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "--watch-dirs",</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> "~/.claude/sessions/"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "~/.pi/sessions/",</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> "~/.opencode/sessions/"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "logs/"]</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Search across everything</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">session-search</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "deployment error"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --providers</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> claude,pi,opencode</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Returns results from all providers in unified format</span></span></code></pre></div><hr><h2 id="lesson-5-7-deployment-modes" tabindex="-1">Lesson 5.7: Deployment Modes <a class="header-anchor" href="#lesson-5-7-deployment-modes" aria-label="Permalink to "Lesson 5.7: Deployment Modes""></a></h2><p>From Paperclip's deployment model:</p><table tabindex="0"><thead><tr><th>Mode</th><th>Auth</th><th>Exposure</th><th>Use Case</th></tr></thead><tbody><tr><td>Local trusted</td><td>None</td><td>localhost only</td><td>Single dev machine</td></tr><tr><td>Authenticated private</td><td>Login required</td><td>LAN/Tailscale/VPN</td><td>Team on private network</td></tr><tr><td>Authenticated public</td><td>Login required</td><td>Internet (behind reverse proxy)</td><td>Production cloud deployment</td></tr></tbody></table><h3 id="reachability" tabindex="-1">Reachability <a class="header-anchor" href="#reachability" aria-label="Permalink to "Reachability""></a></h3><table tabindex="0"><thead><tr><th>Bind</th><th>What It Means</th></tr></thead><tbody><tr><td><code>loopback</code></td><td>localhost only (default)</td></tr><tr><td><code>lan</code></td><td>All interfaces (0.0.0.0)</td></tr><tr><td><code>tailnet</code></td><td>Tailscale IP only</td></tr><tr><td><code>custom</code></td><td>Specific host/IP</td></tr></tbody></table><hr><h2 id="lesson-5-8-cost-control" tabindex="-1">Lesson 5.8: Cost Control <a class="header-anchor" href="#lesson-5-8-cost-control" aria-label="Permalink to "Lesson 5.8: Cost Control""></a></h2><h3 id="budget-architecture" tabindex="-1">Budget Architecture <a class="header-anchor" href="#budget-architecture" aria-label="Permalink to "Budget Architecture""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Company budget → Agent budgets → Session budgets → Per-call tracking</span></span></code></pre></div><h3 id="budget-policies" tabindex="-1">Budget Policies <a class="header-anchor" href="#budget-policies" aria-label="Permalink to "Budget Policies""></a></h3><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">budget_policies</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metric</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"monthly_cost_cents"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> scope</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"agent:backend-dev"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> amount</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">50000</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # $500/month</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> warn_at</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">80%</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # warn at $400</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> hard_stop</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # kill at $500</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metric</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"session_cost_cents"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> scope</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"global"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> amount</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">200</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # $2/session max</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> hard_stop</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span></code></pre></div><h3 id="warning-vs-hard-stop" tabindex="-1">Warning vs Hard Stop <a class="header-anchor" href="#warning-vs-hard-stop" aria-label="Permalink to "Warning vs Hard Stop""></a></h3><ul><li><strong>Warning</strong> (80%) — Notify operator, agent keeps running</li><li><strong>Hard Stop</strong> (100%) — Agent paused, new tasks queued, running task cancelled</li></ul><hr><h2 id="lab-5-9-set-up-agent-observability" tabindex="-1">Lab 5.9: Set Up Agent Observability <a class="header-anchor" href="#lab-5-9-set-up-agent-observability" aria-label="Permalink to "Lab 5.9: Set Up Agent Observability""></a></h2><p><strong>Objective</strong>: Trace every tool call + LLM completion to a local SQLite database.</p><p><strong>Starter</strong>: <code>course/labs/L5-observability/starter/</code></p><h2 id="lab-5-10-ci-cd-pipeline" tabindex="-1">Lab 5.10: CI/CD Pipeline <a class="header-anchor" href="#lab-5-10-ci-cd-pipeline" aria-label="Permalink to "Lab 5.10: CI/CD Pipeline""></a></h2><p><strong>Objective</strong>: Create a golden dataset and automated regression gate.</p><p><strong>Starter</strong>: <code>course/labs/L5-cicd/starter/</code></p></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><div class="edit-info" data-v-1bcd8184><!----><div class="last-updated" data-v-1bcd8184><p class="VPLastUpdated" data-v-1bcd8184 data-v-1bb0c8a8>Last updated: <time datetime="2026-06-03T12:04:06.000Z" data-v-1bb0c8a8></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/labs/l4-agent-chain" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Previous page</span><span class="title" data-v-1bcd8184>Labs 4.12-4.13</span><!--]--></a></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/labs/l5-observability" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Next page</span><span class="title" data-v-1bcd8184>Labs 5.9-5.10</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>FDSA Agency — Agentic Engineering Course. Part of the fdsa.ai orchestration platform.</p><p class="copyright" data-v-566314d4>Copyright 2026</p></div></footer><!--[--><!--]--></div></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"404.md\":\"BiCvjdaY\",\"api-keys.md\":\"D2Kyj8T3\",\"blog_index.md\":\"B5nL9faf\",\"blog_posts_cascade-routing.md\":\"DvBM3TSf\",\"blog_posts_choosing-security-level.md\":\"BYXRZEDN\",\"blog_posts_mental-models.md\":\"BRY80gtq\",\"blog_posts_repo-is-spec.md\":\"BxY1cXc_\",\"blog_posts_security-ladder.md\":\"DQaqn6Yt\",\"blog_posts_three-x-rule.md\":\"BHO6bhvz\",\"blog_posts_verifier-pattern.md\":\"Gha_L_u5\",\"blog_posts_vibe-vs-agentic.md\":\"7mduPfz1\",\"blog_posts_what-is-an-agent.md\":\"BU2wUq_Y\",\"blog_posts_why-multi-agent.md\":\"BVRIN2vH\",\"buy.md\":\"DHBA80yx\",\"certificate.md\":\"0V0n-TLl\",\"checkout.md\":\"BJaDuNmQ\",\"checkout_cancel.md\":\"CdJxBFk8\",\"checkout_success.md\":\"tbRwtAen\",\"free-preview.md\":\"C5BtRucn\",\"getting-started.md\":\"Boo_V9xC\",\"index.md\":\"BNS2TR1g\",\"labs_index.md\":\"sAzXzfkI\",\"labs_l1-first-agent.md\":\"BwU9yf-G\",\"labs_l2-context.md\":\"BexGm8_s\",\"labs_l2-multi-tool.md\":\"Bj3Mb-oj\",\"labs_l3-verifier.md\":\"xilrGGap\",\"labs_l3-whitelist-hook.md\":\"DJtbL66Y\",\"labs_l4-agent-chain.md\":\"D89P8dwJ\",\"labs_l4-multi-team.md\":\"DmSK8e2P\",\"labs_l5-cicd.md\":\"Dz1Jl78z\",\"labs_l5-observability.md\":\"BDpqVYjT\",\"labs_l6-cost-optimization.md\":\"CabFK4GB\",\"labs_l6-eval-harness.md\":\"CBwH6xOR\",\"labs_l7-autoresearch.md\":\"BYlzPLYo\",\"labs_l7-meta-agent.md\":\"iTswbOPg\",\"modules_competitive-analysis.md\":\"BHMHacei\",\"modules_curriculum.md\":\"D7UeKRfo\",\"modules_debate.md\":\"DWctKMlA\",\"modules_feynman.md\":\"DBw5sPBP\",\"modules_field-manual.md\":\"hmt_NLf1\",\"modules_m1-foundations.md\":\"DHFyTzWj\",\"modules_m2-architecture.md\":\"DVowtmf9\",\"modules_m3-safety.md\":\"RiQQ_HWX\",\"modules_m4-orchestration.md\":\"DFLcAKBv\",\"modules_m5-production.md\":\"DTkLIrwQ\",\"modules_m6-economics.md\":\"HihVEOPb\",\"modules_m7-advanced.md\":\"FtCudlFk\",\"modules_m8-capstone.md\":\"D1AXKCqv\",\"modules_non-technical.md\":\"BnvuUCRo\",\"modules_reference-stack.md\":\"D9FXitvn\",\"modules_software-factory.md\":\"C5Yf8Zwe\",\"modules_tool-reference.md\":\"B40mlgZJ\",\"public_certificate_template.md\":\"Cg1kPB1b\",\"resources.md\":\"DcUu1NrK\",\"skills.md\":\"BX3RBeCK\",\"troubleshooting.md\":\"B6difx2I\",\"verify.md\":\"Cl5ZMWNd\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Agentic Engineering the Hard Way\",\"description\":\"Build every component from scratch. 65 lessons, 13 labs, 20 skill kits. No black boxes.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":false,\"siteTitle\":\"FDSA\",\"nav\":[{\"text\":\"Course\",\"link\":\"/modules/m1-foundations\",\"activeMatch\":\"/modules/\"},{\"text\":\"Labs\",\"link\":\"/labs/l1-first-agent\",\"activeMatch\":\"/labs/\"},{\"text\":\"Skills\",\"link\":\"/skills\"},{\"text\":\"Blog\",\"link\":\"/blog\",\"activeMatch\":\"/blog/\"},{\"text\":\"More\",\"items\":[{\"text\":\"Curriculum\",\"link\":\"/modules/curriculum\"},{\"text\":\"Debate\",\"link\":\"/modules/debate\"},{\"text\":\"FAQ\",\"link\":\"/troubleshooting\"},{\"text\":\"Certificate\",\"link\":\"/certificate\"},{\"text\":\"Buy\",\"link\":\"/buy\"}]}],\"sidebar\":{\"/modules/\":[{\"text\":\"Module 1: Foundations\",\"link\":\"/modules/m1-foundations\",\"collapsed\":true,\"items\":[{\"text\":\"1.1 What Makes an Agent?\",\"link\":\"/modules/m1-foundations#lesson-11-what-makes-an-agent\"},{\"text\":\"1.2 Harness vs The Model\",\"link\":\"/modules/m1-foundations#lesson-12-the-harness-vs-the-model\"},{\"text\":\"1.3 Decision Framework\",\"link\":\"/modules/m1-foundations#lesson-13-decision-framework\"},{\"text\":\"1.4 Repository IS the Spec\",\"link\":\"/modules/m1-foundations#lesson-13a-the-repository-is-the-spec\"},{\"text\":\"1.5 The Agent Loop\",\"link\":\"/modules/m1-foundations#lesson-14-the-agent-loop\"},{\"text\":\"1.6 Tool Calling\",\"link\":\"/modules/m1-foundations#lesson-15-tool-calling-deep-dive\"},{\"text\":\"1.7 Vibe Coding vs Engineering\",\"link\":\"/modules/m1-foundations#lesson-16-vibe-coding-vs-agentic-engineering\"},{\"text\":\"1.8 Do You Trust Your Agents?\",\"link\":\"/modules/m1-foundations#lesson-17-do-you-trust-your-agents\"},{\"text\":\"Lab 1.9: First Agent\",\"link\":\"/labs/l1-first-agent\"}]},{\"text\":\"Module 2: Architecture\",\"link\":\"/modules/m2-architecture\",\"collapsed\":true,\"items\":[{\"text\":\"2.1-2.3 Core Architecture\",\"link\":\"/modules/m2-architecture#lesson-21-the-four-pillars\"},{\"text\":\"2.4-2.6 Skills & Workspace\",\"link\":\"/modules/m2-architecture#lesson-23b-skills-system-deep-dive\"},{\"text\":\"2.7-2.9 Advanced Patterns\",\"link\":\"/modules/m2-architecture#lesson-24-context-window-management\"},{\"text\":\"Labs 2.10-2.11\",\"link\":\"/labs/l2-multi-tool\"}]},{\"text\":\"Module 3: Safety & Security\",\"link\":\"/modules/m3-safety\",\"collapsed\":true,\"items\":[{\"text\":\"3.1-3.2 Bash & Ladder\",\"link\":\"/modules/m3-safety#lesson-31-why-bash-is-the-single-point-of-failure\"},{\"text\":\"3.3-3.5 Hooks & Control\",\"link\":\"/modules/m3-safety#lesson-33-the-l3-marque-break\"},{\"text\":\"3.6-3.7 Verifier & Stacking\",\"link\":\"/modules/m3-safety#lesson-36-the-verifier-pattern\"},{\"text\":\"Labs 3.8-3.9\",\"link\":\"/labs/l3-whitelist-hook\"}]},{\"text\":\"Module 4: Orchestration\",\"link\":\"/modules/m4-orchestration\",\"collapsed\":true,\"items\":[{\"text\":\"4.1-4.4 Patterns\",\"link\":\"/modules/m4-orchestration#lesson-41-why-one-agent-is-not-enough\"},{\"text\":\"4.5-4.9 Teams & Comms\",\"link\":\"/modules/m4-orchestration#lesson-43-depth-2-delegation\"},{\"text\":\"4.10-4.11 Case Studies\",\"link\":\"/modules/m4-orchestration#lesson-410-the-ceo-board-system\"},{\"text\":\"Labs 4.12-4.13\",\"link\":\"/labs/l4-agent-chain\"}]},{\"text\":\"Module 5: Production\",\"link\":\"/modules/m5-production\",\"collapsed\":true,\"items\":[{\"text\":\"5.1-5.4 CI/CD & Stack\",\"link\":\"/modules/m5-production#lesson-51-what-production-means-for-agents\"},{\"text\":\"5.5-5.8 Deploy & Monitor\",\"link\":\"/modules/m5-production#lesson-53-shadow-deployments\"},{\"text\":\"Labs 5.9-5.10\",\"link\":\"/labs/l5-observability\"}]},{\"text\":\"Module 6: Economics\",\"link\":\"/modules/m6-economics\",\"collapsed\":true,\"items\":[{\"text\":\"6.0-6.2 Pricing\",\"link\":\"/modules/m6-economics#lesson-60-the-compute-advantage-equation\"},{\"text\":\"6.3-6.5 Eval Metrics\",\"link\":\"/modules/m6-economics#lesson-63-cost-per-session-math\"},{\"text\":\"6.6-6.7 Testing\",\"link\":\"/modules/m6-economics#lesson-66-ab-testing-agents\"},{\"text\":\"Labs 6.8-6.9\",\"link\":\"/labs/l6-eval-harness\"}]},{\"text\":\"Module 7: Advanced\",\"link\":\"/modules/m7-advanced\",\"collapsed\":true,\"items\":[{\"text\":\"7.1-7.3 Autoresearch\",\"link\":\"/modules/m7-advanced#lesson-71-autoresearch\"},{\"text\":\"7.4-7.6 Meta & Beyond\",\"link\":\"/modules/m7-advanced#lesson-73-meta-agents\"},{\"text\":\"Labs 7.7-7.8\",\"link\":\"/labs/l7-autoresearch\"}]},{\"text\":\"Module 8: Capstone\",\"link\":\"/modules/m8-capstone\",\"collapsed\":true,\"items\":[{\"text\":\"Project Options\",\"link\":\"/modules/m8-capstone#project-options\"},{\"text\":\"Phases\",\"link\":\"/modules/m8-capstone#capstone-phases\"},{\"text\":\"Rubric\",\"link\":\"/modules/m8-capstone#grading-rubric\"}]}],\"/labs/\":[{\"text\":\"All Labs\",\"link\":\"/labs/l1-first-agent\"},{\"text\":\"L1: First Agent\",\"link\":\"/labs/l1-first-agent\"},{\"text\":\"L2a: Multi-Tool Agent\",\"link\":\"/labs/l2-multi-tool\"},{\"text\":\"L2b: Context-Aware Agent\",\"link\":\"/labs/l2-context\"},{\"text\":\"L3a: Whitelist Hook\",\"link\":\"/labs/l3-whitelist-hook\"},{\"text\":\"L3b: Verifier Agent\",\"link\":\"/labs/l3-verifier\"},{\"text\":\"L4a: Agent Chain\",\"link\":\"/labs/l4-agent-chain\"},{\"text\":\"L4b: Multi-Team Config\",\"link\":\"/labs/l4-multi-team\"},{\"text\":\"L5a: Observability\",\"link\":\"/labs/l5-observability\"},{\"text\":\"L5b: CI/CD Pipeline\",\"link\":\"/labs/l5-cicd\"},{\"text\":\"L6a: Eval Harness\",\"link\":\"/labs/l6-eval-harness\"},{\"text\":\"L6b: Cost Optimization\",\"link\":\"/labs/l6-cost-optimization\"},{\"text\":\"L7a: Autoresearch\",\"link\":\"/labs/l7-autoresearch\"},{\"text\":\"L7b: Meta-Agent\",\"link\":\"/labs/l7-meta-agent\"}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"http://185.239.209.216:3001/artale/agentic-engineering-course\"}],\"footer\":{\"message\":\"FDSA Agency — Agentic Engineering Course. Part of the fdsa.ai orchestration platform.\",\"copyright\":\"Copyright 2026\"},\"search\":{\"provider\":\"local\"},\"locales\":{\"root\":{\"label\":\"English\",\"lang\":\"en-US\",\"title\":\"Agentic Engineering the Hard Way\",\"description\":\"Build every component from scratch. 65 lessons, 13 labs, 20 skill kits. No black boxes, no magic SDKs.\"},\"es\":{\"label\":\"Español\",\"lang\":\"es-ES\",\"title\":\"Agentic Engineering the Hard Way\",\"description\":\"Construye cada componente desde cero. 65 lecciones, 13 laboratorios, 20 kits de habilidades.\",\"link\":\"/es/\"},\"pt\":{\"label\":\"Português\",\"lang\":\"pt-BR\",\"title\":\"Agentic Engineering the Hard Way\",\"description\":\"Construa cada componente do zero. 65 lições, 13 laboratórios, 20 kits de habilidades.\",\"link\":\"/pt/\"},\"it\":{\"label\":\"Italiano\",\"lang\":\"it-IT\",\"title\":\"Agentic Engineering the Hard Way\",\"description\":\"Costruisci ogni componente da zero. 65 lezioni, 13 laboratori, 20 kit di abilità.\",\"link\":\"/it/\"},\"ar\":{\"label\":\"العربية\",\"lang\":\"ar-SA\",\"title\":\"هندسة الوكلاء بالطريقة الصعبة\",\"description\":\"بناء كل مكون من الصفر. 65 درسًا، 13 مختبرًا، 20 مجموعة مهارات.\",\"link\":\"/ar/\",\"dir\":\"rtl\"}}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
||
|
||
</body>
|
||
</html> |