fix: review fixes - git init, .nojekyll, blog dates staggered, gumroad links, mock llm infinite loop fix, glass card CSS on content pages, lab data refs, skill kit examples, getting-started orientation

This commit is contained in:
artale 2026-06-03 14:07:52 +02:00
parent 2ef158da40
commit 3d81a11f41
236 changed files with 946 additions and 559 deletions

View File

@ -127,22 +127,44 @@ def _generate_tool_input(tool_name: str, prompt: str) -> dict:
def _generate_text_response(prompt: str) -> str:
"""Generate realistic mock text response."""
"""Generate realistic mock text response from tool results or user input."""
if not prompt or len(prompt) < 5:
return "I understand your request. How can I help you further?"
prompt_lower = prompt.lower()
# File content responses
if "contents of" in prompt_lower:
return "Based on the file contents, I can see the document contains sample data. The key information includes test records and example data points. What specific aspect would you like me to analyze?"
# Search result responses
if "search" in prompt_lower and ("result" in prompt_lower or "found" in prompt_lower):
return "Here are the search results I found. The most relevant result covers the topic you asked about with specific examples and implementation details."
# Write confirmation responses
if "successfully wrote" in prompt_lower or "wrote" in prompt_lower:
return "The file has been written successfully. I've confirmed the content was saved correctly."
# Hello/greetings
if "hello" in prompt_lower or "hi " in prompt_lower:
return "Hello! I'm your AI coding agent. How can I help you today?"
# Explanation patterns
elif "explain" in prompt_lower or "what is" in prompt_lower:
return "Based on my analysis: this is a well-known pattern in software engineering. The key insight is that it separates concerns and allows for independent evolution of components."
# Error/fix patterns
elif "error" in prompt_lower or "bug" in prompt_lower or "fix" in prompt_lower:
return "I found the issue. The problem is a missing null check on line 42. Adding `if value is not None:` before the operation resolves it."
# Test results
elif "test" in prompt_lower or "pytest" in prompt_lower:
return "All tests pass. 34 passed, 0 failed, 0 skipped. Completed in 3.62 seconds."
# Summary requests
elif "summarize" in prompt_lower or "summary" in prompt_lower:
return "Summary: The document covers three main topics. First, architectural patterns for agent systems. Second, security considerations for production deployments. Third, evaluation methodologies."
else:
return "I've completed the analysis. Here are the key findings:\n\n1. The approach is viable\n2. Recommended next steps are documented\n3. No blockers identified\n\nWould you like me to proceed with implementation?"

View File

@ -0,0 +1,91 @@
# Multi-Agent Team — Example Configuration
This example sets up a 3-team agent system for a web application project.
## Team Structure
```
Orchestrator
├── Frontend Team Lead
│ ├── UI Developer (React components)
│ └── Styling Specialist (CSS/Tailwind)
├── Backend Team Lead
│ ├── API Developer (endpoints, routes)
│ └── Database Specialist (queries, migrations)
└── Review Team Lead
├── Code Reviewer (quality, patterns)
└── Security Reviewer (vulnerabilities)
```
## Configuration
```yaml
# .pi/multi-team/teams.yaml
teams:
orchestrator:
model: claude-opus-4
role: "Orchestrator — delegates, never executes"
max_turns: 25
frontend-lead:
model: claude-sonnet-4
role: "Frontend Team Lead — plans UI work, delegates to devs"
max_turns: 30
agents:
- frontend-dev
- styling-dev
backend-lead:
model: claude-sonnet-4
role: "Backend Team Lead — plans API work, delegates to devs"
max_turns: 30
agents:
- api-dev
- db-dev
review-lead:
model: claude-sonnet-4
role: "Review Team Lead — coordinates quality checks"
max_turns: 20
agents:
- code-reviewer
- security-reviewer
```
## Domain Locking
```yaml
# Frontend domain
frontend-lead:
domain:
- path: src/frontend/
read: true
upsert: true
delete: false
- path: src/shared/
read: true
upsert: false
delete: false
# Backend domain
backend-lead:
domain:
- path: src/api/
read: true
upsert: true
delete: false
- path: src/db/
read: true
upsert: true
delete: false
```
## Running
```bash
# Start the team
cd your-project && just multi-team
# Delegate a task
"Design and implement a user profile feature"
```

View File

@ -0,0 +1,60 @@
# L3 Blacklist Hook — Example Setup
This example shows how to configure a Level 3 blacklist hook for Claude Code on a web application project.
## Installation
```bash
# Install the security-foundation kit
bash install.sh security
# Or manually copy the hook
cp skills/kits/security-foundation/skills/damage-control/hooks/pre-tool.l3-blacklist.js .claude/hooks/
```
## Configuration: Web App Project
```yaml
# .claude/hooks/l3-blacklist.yaml
blocked_commands:
# Destructive operations
- pattern: "rm -rf"
severity: critical
- pattern: "rm -r"
severity: critical
- pattern: "git clean -fdx"
severity: high
- pattern: "git reset --hard"
severity: high
- pattern: "drop table"
severity: critical
- pattern: "drop database"
severity: critical
- pattern: "truncate"
severity: high
# Network operations (warn only)
- pattern: "curl -X POST"
severity: warn
- pattern: "nc "
severity: warn
```
## Expected Behavior
| Command | Blocked? | Response |
|---------|----------|----------|
| `rm -rf node_modules` | YES | `BLOCKED: rm -rf is not allowed` |
| `git status` | Allowed | Normal output |
| `npm install express` | Allowed | Normal output |
| `DROP TABLE users` | YES | `BLOCKED: DROP TABLE is not allowed` |
| `git commit -m "fix"` | Allowed | Normal output |
## Testing It Works
```bash
# Should be blocked
echo "test" > /tmp/test-rm.txt && rm -rf /tmp/test-rm.txt
# Output: BLOCKED: rm -rf is not allowed
```

0
site/.vitepress/dist/.nojekyll vendored Normal file
View File

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{c as t,Q as o,j as n,g as e,n as r}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"Page Not Found","description":"","frontmatter":{},"headers":[],"relativePath":"404.md","filePath":"404.md","lastUpdated":1780488246000}'),s={name:"404.md"};function d(l,a,c,i,u,p){return o(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"page-not-found",tabindex:"-1"},[r("Page Not Found "),e("a",{class:"header-anchor",href:"#page-not-found","aria-label":'Permalink to "Page Not Found"'},"")],-1),e("p",null,"The page you're looking for doesn't exist.",-1),e("p",null,[e("a",{href:"/"},"Go back to the course"),e("a",{href:"/modules/m1-foundations"},"View the curriculum")],-1)])])}const h=t(s,[["render",d]]);export{m as __pageData,h as default};

View File

@ -0,0 +1 @@
import{c as t,Q as o,j as n,g as e,n as r}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"Page Not Found","description":"","frontmatter":{},"headers":[],"relativePath":"404.md","filePath":"404.md","lastUpdated":1780488246000}'),s={name:"404.md"};function d(l,a,c,i,u,p){return o(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"page-not-found",tabindex:"-1"},[r("Page Not Found "),e("a",{class:"header-anchor",href:"#page-not-found","aria-label":'Permalink to "Page Not Found"'},"")],-1),e("p",null,"The page you're looking for doesn't exist.",-1),e("p",null,[e("a",{href:"/"},"Go back to the course"),e("a",{href:"/modules/m1-foundations"},"View the curriculum")],-1)])])}const h=t(s,[["render",d]]);export{m as __pageData,h as default};

View File

@ -1 +0,0 @@
import{c as t,Q as o,j as n,g as e,n as r}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"Page Not Found","description":"","frontmatter":{},"headers":[],"relativePath":"404.md","filePath":"404.md","lastUpdated":null}'),s={name:"404.md"};function d(l,a,u,c,i,p){return o(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"page-not-found",tabindex:"-1"},[r("Page Not Found "),e("a",{class:"header-anchor",href:"#page-not-found","aria-label":'Permalink to "Page Not Found"'},"")],-1),e("p",null,"The page you're looking for doesn't exist.",-1),e("p",null,[e("a",{href:"/"},"Go back to the course"),e("a",{href:"/modules/m1-foundations"},"View the curriculum")],-1)])])}const h=t(s,[["render",d]]);export{m as __pageData,h as default};

View File

@ -1 +0,0 @@
import{c as t,Q as o,j as n,g as e,n as r}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"Page Not Found","description":"","frontmatter":{},"headers":[],"relativePath":"404.md","filePath":"404.md","lastUpdated":null}'),s={name:"404.md"};function d(l,a,u,c,i,p){return o(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"page-not-found",tabindex:"-1"},[r("Page Not Found "),e("a",{class:"header-anchor",href:"#page-not-found","aria-label":'Permalink to "Page Not Found"'},"")],-1),e("p",null,"The page you're looking for doesn't exist.",-1),e("p",null,[e("a",{href:"/"},"Go back to the course"),e("a",{href:"/modules/m1-foundations"},"View the curriculum")],-1)])])}const h=t(s,[["render",d]]);export{m as __pageData,h as default};

View File

@ -1,4 +1,4 @@
import{c as t,Q as s,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"API Key Setup Guide","description":"","frontmatter":{},"headers":[],"relativePath":"api-keys.md","filePath":"api-keys.md","lastUpdated":null}'),n={name:"api-keys.md"};function r(o,e,h,l,p,d){return s(),a("div",null,[...e[0]||(e[0]=[i(`<h1 id="api-key-setup-guide" tabindex="-1">API Key Setup Guide <a class="header-anchor" href="#api-key-setup-guide" aria-label="Permalink to &quot;API Key Setup Guide&quot;"></a></h1><p>Every lab needs at least one LLM API key. If you don&#39;t have one, the mock LLM handles everything offline.</p><hr><h2 id="quick-start-use-the-mock-llm-no-key-needed" tabindex="-1">Quick Start: Use the Mock LLM (No Key Needed) <a class="header-anchor" href="#quick-start-use-the-mock-llm-no-key-needed" aria-label="Permalink to &quot;Quick Start: Use the Mock LLM (No Key Needed)&quot;"></a></h2><p>All labs include automatic mock LLM fallback. Run without any setup:</p><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:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> labs/L1-first-agent/solution.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;Summarize this file&quot;</span></span></code></pre></div><p>The mock client returns realistic responses. Your code runs identically with real or mock LLM.</p><hr><h2 id="provider-keys" tabindex="-1">Provider Keys <a class="header-anchor" href="#provider-keys" aria-label="Permalink to &quot;Provider Keys&quot;"></a></h2><h3 id="anthropic-claude-—-recommended" tabindex="-1">Anthropic (Claude) — Recommended <a class="header-anchor" href="#anthropic-claude-—-recommended" aria-label="Permalink to &quot;Anthropic (Claude) — Recommended&quot;"></a></h3><p><strong>Best for</strong>: All course labs. Claude Sonnet is the default model used throughout.<br><strong>Cost</strong>: Free credits available on signup. Labs cost ~$0.01-0.05 each with Sonnet.<br><strong>Get key</strong>: <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noreferrer">console.anthropic.com</a><br><strong>Set it</strong>:</p><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;"># Windows PowerShell</span></span>
import{c as t,Q as s,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"API Key Setup Guide","description":"","frontmatter":{},"headers":[],"relativePath":"api-keys.md","filePath":"api-keys.md","lastUpdated":1780488246000}'),n={name:"api-keys.md"};function r(o,e,h,l,p,d){return s(),a("div",null,[...e[0]||(e[0]=[i(`<h1 id="api-key-setup-guide" tabindex="-1">API Key Setup Guide <a class="header-anchor" href="#api-key-setup-guide" aria-label="Permalink to &quot;API Key Setup Guide&quot;"></a></h1><p>Every lab needs at least one LLM API key. If you don&#39;t have one, the mock LLM handles everything offline.</p><hr><h2 id="quick-start-use-the-mock-llm-no-key-needed" tabindex="-1">Quick Start: Use the Mock LLM (No Key Needed) <a class="header-anchor" href="#quick-start-use-the-mock-llm-no-key-needed" aria-label="Permalink to &quot;Quick Start: Use the Mock LLM (No Key Needed)&quot;"></a></h2><p>All labs include automatic mock LLM fallback. Run without any setup:</p><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:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> labs/L1-first-agent/solution.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;Summarize this file&quot;</span></span></code></pre></div><p>The mock client returns realistic responses. Your code runs identically with real or mock LLM.</p><hr><h2 id="provider-keys" tabindex="-1">Provider Keys <a class="header-anchor" href="#provider-keys" aria-label="Permalink to &quot;Provider Keys&quot;"></a></h2><h3 id="anthropic-claude-—-recommended" tabindex="-1">Anthropic (Claude) — Recommended <a class="header-anchor" href="#anthropic-claude-—-recommended" aria-label="Permalink to &quot;Anthropic (Claude) — Recommended&quot;"></a></h3><p><strong>Best for</strong>: All course labs. Claude Sonnet is the default model used throughout.<br><strong>Cost</strong>: Free credits available on signup. Labs cost ~$0.01-0.05 each with Sonnet.<br><strong>Get key</strong>: <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noreferrer">console.anthropic.com</a><br><strong>Set it</strong>:</p><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;"># Windows PowerShell</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$env:ANTHROPIC_API_KEY</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sk-ant-...&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Mac/Linux</span></span>

View File

@ -0,0 +1 @@
import{c as t,Q as s,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"API Key Setup Guide","description":"","frontmatter":{},"headers":[],"relativePath":"api-keys.md","filePath":"api-keys.md","lastUpdated":1780488246000}'),n={name:"api-keys.md"};function r(o,e,h,l,p,d){return s(),a("div",null,[...e[0]||(e[0]=[i("",31)])])}const g=t(n,[["render",r]]);export{c as __pageData,g as default};

View File

@ -1 +0,0 @@
import{c as t,Q as s,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"API Key Setup Guide","description":"","frontmatter":{},"headers":[],"relativePath":"api-keys.md","filePath":"api-keys.md","lastUpdated":null}'),n={name:"api-keys.md"};function r(o,e,h,l,p,d){return s(),a("div",null,[...e[0]||(e[0]=[i("",31)])])}const g=t(n,[["render",r]]);export{c as __pageData,g as default};

View File

@ -1 +1 @@
import{R as p}from"./chunks/theme.ALwm0xHP.js";import{v as s,am as i,R as u,w as c,p as l,a as f,C as d,a1 as m,k as h,S as g,l as A,r as v,ac as w,N as C,as as R,ag as y,ab as P,aa as b,u as S}from"./chunks/framework.BPKcPtvA.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return C(()=>{R(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&y(),P(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
import{R as p}from"./chunks/theme.s_1YR_Jm.js";import{v as s,am as i,R as u,w as c,p as l,a as f,C as d,a1 as m,k as h,S as g,l as A,r as v,ac as w,N as C,as as R,ag as y,ab as P,aa as b,u as S}from"./chunks/framework.BPKcPtvA.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return C(()=>{R(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&y(),P(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{c as a,Q as t,j as o,m as s}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Blog","description":"","frontmatter":{},"headers":[],"relativePath":"blog/index.md","filePath":"blog/index.md","lastUpdated":null}'),r={name:"blog/index.md"};function n(i,e,l,h,c,g){return t(),o("div",null,[...e[0]||(e[0]=[s("",25)])])}const y=a(r,[["render",n]]);export{p as __pageData,y as default};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{c as a,Q as t,j as o,m as n}from"./chunks/framework.BPKcPtvA.js";const d=JSON.parse('{"title":"Blog","description":"","frontmatter":{},"headers":[],"relativePath":"blog/index.md","filePath":"blog/index.md","lastUpdated":1780488246000}'),s={name:"blog/index.md"};function r(i,e,l,h,u,c){return t(),o("div",null,[...e[0]||(e[0]=[n("",25)])])}const p=a(s,[["render",r]]);export{d as __pageData,p as default};

View File

@ -1,4 +1,4 @@
import{c as t,Q as a,j as i,m as e}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Cascade Routing: Cut Your API Costs by 66%","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/cascade-routing.md","filePath":"blog/posts/cascade-routing.md","lastUpdated":null}'),n={name:"blog/posts/cascade-routing.md"};function l(h,s,p,d,o,r){return a(),i("div",null,[...s[0]||(s[0]=[e(`<h1 id="cascade-routing-cut-your-api-costs-by-66" tabindex="-1">Cascade Routing: Cut Your API Costs by 66% <a class="header-anchor" href="#cascade-routing-cut-your-api-costs-by-66" aria-label="Permalink to &quot;Cascade Routing: Cut Your API Costs by 66%&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>Most teams use one model for everything. They default to Claude Opus or GPT-5 for every task, which means they are paying premium prices for simple work.</p><h2 id="the-price-range" tabindex="-1">The Price Range <a class="header-anchor" href="#the-price-range" aria-label="Permalink to &quot;The Price Range&quot;"></a></h2><table tabindex="0"><thead><tr><th>Model</th><th>Input ($/M)</th><th>Output ($/M)</th></tr></thead><tbody><tr><td>Gemini 2.5 Flash</td><td>$0.15</td><td>$0.60</td></tr><tr><td>DeepSeek V3</td><td>$0.27</td><td>$1.10</td></tr><tr><td>Claude Sonnet 4</td><td>$3.00</td><td>$15.00</td></tr><tr><td>Claude Opus 4</td><td>$15.00</td><td>$75.00</td></tr></tbody></table><p>That is a 100x range between the cheapest and most expensive.</p><h2 id="the-cascade-pattern" tabindex="-1">The Cascade Pattern <a class="header-anchor" href="#the-cascade-pattern" aria-label="Permalink to &quot;The Cascade Pattern&quot;"></a></h2><p>Route different steps to different models. Use cheap models for simple retrieval and formatting. Use expensive models only for complex reasoning.</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>Retrieve context -&gt; Gemini Flash ($0.15/$0.60)</span></span>
import{c as t,Q as a,j as i,m as e}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Cascade Routing: Cut Your API Costs by 66%","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/cascade-routing.md","filePath":"blog/posts/cascade-routing.md","lastUpdated":1780488246000}'),n={name:"blog/posts/cascade-routing.md"};function l(h,s,p,d,o,r){return a(),i("div",null,[...s[0]||(s[0]=[e(`<h1 id="cascade-routing-cut-your-api-costs-by-66" tabindex="-1">Cascade Routing: Cut Your API Costs by 66% <a class="header-anchor" href="#cascade-routing-cut-your-api-costs-by-66" aria-label="Permalink to &quot;Cascade Routing: Cut Your API Costs by 66%&quot;"></a></h1><p><strong>June 11, 2026</strong></p><p>Most teams use one model for everything. They default to Claude Opus or GPT-5 for every task, which means they are paying premium prices for simple work.</p><h2 id="the-price-range" tabindex="-1">The Price Range <a class="header-anchor" href="#the-price-range" aria-label="Permalink to &quot;The Price Range&quot;"></a></h2><table tabindex="0"><thead><tr><th>Model</th><th>Input ($/M)</th><th>Output ($/M)</th></tr></thead><tbody><tr><td>Gemini 2.5 Flash</td><td>$0.15</td><td>$0.60</td></tr><tr><td>DeepSeek V3</td><td>$0.27</td><td>$1.10</td></tr><tr><td>Claude Sonnet 4</td><td>$3.00</td><td>$15.00</td></tr><tr><td>Claude Opus 4</td><td>$15.00</td><td>$75.00</td></tr></tbody></table><p>That is a 100x range between the cheapest and most expensive.</p><h2 id="the-cascade-pattern" tabindex="-1">The Cascade Pattern <a class="header-anchor" href="#the-cascade-pattern" aria-label="Permalink to &quot;The Cascade Pattern&quot;"></a></h2><p>Route different steps to different models. Use cheap models for simple retrieval and formatting. Use expensive models only for complex reasoning.</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>Retrieve context -&gt; Gemini Flash ($0.15/$0.60)</span></span>
<span class="line"><span>Analyze data -&gt; Claude Sonnet ($3/$15)</span></span>
<span class="line"><span>Make decision -&gt; Claude Opus ($15/$75)</span></span>
<span class="line"><span>Format output -&gt; Gemini Flash ($0.15/$0.60)</span></span></code></pre></div><h2 id="the-savings" tabindex="-1">The Savings <a class="header-anchor" href="#the-savings" aria-label="Permalink to &quot;The Savings&quot;"></a></h2><table tabindex="0"><thead><tr><th>Pattern</th><th>Cost/Task</th><th>Savings</th></tr></thead><tbody><tr><td>All Opus</td><td>$2.50</td><td>Baseline</td></tr><tr><td>Cascade</td><td>$0.85</td><td>66%</td></tr><tr><td>All Sonnet</td><td>$0.50</td><td>80% (but quality loss on complex steps)</td></tr></tbody></table><h2 id="implementation" tabindex="-1">Implementation <a class="header-anchor" href="#implementation" aria-label="Permalink to &quot;Implementation&quot;"></a></h2><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</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;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> route_task</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(task_complexity: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) -&gt; </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>

View File

@ -1 +1 @@
import{c as t,Q as a,j as i,m as e}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Cascade Routing: Cut Your API Costs by 66%","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/cascade-routing.md","filePath":"blog/posts/cascade-routing.md","lastUpdated":null}'),n={name:"blog/posts/cascade-routing.md"};function l(h,s,p,d,o,r){return a(),i("div",null,[...s[0]||(s[0]=[e("",17)])])}const u=t(n,[["render",l]]);export{c as __pageData,u as default};
import{c as t,Q as a,j as i,m as e}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Cascade Routing: Cut Your API Costs by 66%","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/cascade-routing.md","filePath":"blog/posts/cascade-routing.md","lastUpdated":1780488246000}'),n={name:"blog/posts/cascade-routing.md"};function l(h,s,p,d,o,r){return a(),i("div",null,[...s[0]||(s[0]=[e("",17)])])}const u=t(n,[["render",l]]);export{c as __pageData,u as default};

View File

@ -0,0 +1 @@
import{c as t,Q as a,j as o,m as r}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Choosing Your Security Level","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/choosing-security-level.md","filePath":"blog/posts/choosing-security-level.md","lastUpdated":1780488246000}'),n={name:"blog/posts/choosing-security-level.md"};function l(s,e,i,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[r('<h1 id="choosing-your-security-level" tabindex="-1">Choosing Your Security Level <a class="header-anchor" href="#choosing-your-security-level" aria-label="Permalink to &quot;Choosing Your Security Level&quot;"></a></h1><p><strong>June 7, 2026</strong></p><p>Not every agent needs Level 5 security. The right level depends on what your agent can access.</p><h2 id="the-decision-table" tabindex="-1">The Decision Table <a class="header-anchor" href="#the-decision-table" aria-label="Permalink to &quot;The Decision Table&quot;"></a></h2><table tabindex="0"><thead><tr><th>If your agent has access to...</th><th>Start at...</th><th>Why</th></tr></thead><tbody><tr><td>Nothing important (demos, tutorials)</td><td>L1</td><td>Blast radius is zero</td></tr><tr><td>Your source code and configs</td><td>L3</td><td>A bad git push costs a day</td></tr><tr><td>Production credentials (AWS, DB)</td><td>L4-L5</td><td>There is no acceptable failure</td></tr><tr><td>Customer data (PII, financial)</td><td>L5</td><td>Compliance requires it</td></tr></tbody></table><h2 id="level-1-2-when-you-can-get-away-with-it" tabindex="-1">Level 1-2: When You Can Get Away With It <a class="header-anchor" href="#level-1-2-when-you-can-get-away-with-it" aria-label="Permalink to &quot;Level 1-2: When You Can Get Away With It&quot;"></a></h2><p>L1 (system prompt rules) and L2 (safe-mode skill) work well for tutorial agents that only touch demo data, personal assistants with no production access, and agents running in isolated environments.</p><p>The model will refuse most dangerous requests. &quot;Most&quot; is the problem. At a 1% per-turn failure rate, over 100 turns there is a 63% chance of at least one failure.</p><h2 id="level-3-the-minimum-for-production-code" tabindex="-1">Level 3: The Minimum for Production Code <a class="header-anchor" href="#level-3-the-minimum-for-production-code" aria-label="Permalink to &quot;Level 3: The Minimum for Production Code&quot;"></a></h2><p>L3 (blacklist hook) catches direct attacks like <code>rm -rf /</code>. But it misses the marquee break: the agent writes a Python script that does the damage, and the blacklist only sees &quot;python cleanup.py&quot; which is not in the blocklist.</p><h2 id="level-4-the-sweet-spot" tabindex="-1">Level 4: The Sweet Spot <a class="header-anchor" href="#level-4-the-sweet-spot" aria-label="Permalink to &quot;Level 4: The Sweet Spot&quot;"></a></h2><p>Whitelist hooks only allow N safelisted commands. The agent cannot run <code>python cleanup.py</code> because <code>python</code> is not safelisted. This prevents the L3 marque break. Use L4 as your default for any agent with access to production systems.</p><h2 id="level-5-the-gold-standard" tabindex="-1">Level 5: The Gold Standard <a class="header-anchor" href="#level-5-the-gold-standard" aria-label="Permalink to &quot;Level 5: The Gold Standard&quot;"></a></h2><p>No bash at all. The agent has only purpose-built tools: Read, Write, Edit, Grep, Glob. Required for any agent handling customer data, financial transactions, or healthcare information.</p><h2 id="rule-of-thumb" tabindex="-1">Rule of Thumb <a class="header-anchor" href="#rule-of-thumb" aria-label="Permalink to &quot;Rule of Thumb&quot;"></a></h2><p>If the agent can touch anything you cannot easily roll back, start at L4 and plan to get to L5.</p><hr><p><em>From Module 3 of the <a href="/">Agentic Engineering Course</a>. The full module includes runnable code for all 6 security levels.</em></p>',18)])])}const m=t(n,[["render",l]]);export{p as __pageData,m as default};

View File

@ -1 +1 @@
import{c as t,Q as a,j as o,m as r}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Choosing Your Security Level","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/choosing-security-level.md","filePath":"blog/posts/choosing-security-level.md","lastUpdated":null}'),l={name:"blog/posts/choosing-security-level.md"};function n(s,e,i,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[r("",18)])])}const m=t(l,[["render",n]]);export{p as __pageData,m as default};
import{c as t,Q as a,j as o,m as r}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Choosing Your Security Level","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/choosing-security-level.md","filePath":"blog/posts/choosing-security-level.md","lastUpdated":1780488246000}'),n={name:"blog/posts/choosing-security-level.md"};function l(s,e,i,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[r("",18)])])}const m=t(n,[["render",l]]);export{p as __pageData,m as default};

View File

@ -1 +0,0 @@
import{c as t,Q as a,j as o,m as r}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Choosing Your Security Level","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/choosing-security-level.md","filePath":"blog/posts/choosing-security-level.md","lastUpdated":null}'),l={name:"blog/posts/choosing-security-level.md"};function n(s,e,i,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[r('<h1 id="choosing-your-security-level" tabindex="-1">Choosing Your Security Level <a class="header-anchor" href="#choosing-your-security-level" aria-label="Permalink to &quot;Choosing Your Security Level&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>Not every agent needs Level 5 security. The right level depends on what your agent can access.</p><h2 id="the-decision-table" tabindex="-1">The Decision Table <a class="header-anchor" href="#the-decision-table" aria-label="Permalink to &quot;The Decision Table&quot;"></a></h2><table tabindex="0"><thead><tr><th>If your agent has access to...</th><th>Start at...</th><th>Why</th></tr></thead><tbody><tr><td>Nothing important (demos, tutorials)</td><td>L1</td><td>Blast radius is zero</td></tr><tr><td>Your source code and configs</td><td>L3</td><td>A bad git push costs a day</td></tr><tr><td>Production credentials (AWS, DB)</td><td>L4-L5</td><td>There is no acceptable failure</td></tr><tr><td>Customer data (PII, financial)</td><td>L5</td><td>Compliance requires it</td></tr></tbody></table><h2 id="level-1-2-when-you-can-get-away-with-it" tabindex="-1">Level 1-2: When You Can Get Away With It <a class="header-anchor" href="#level-1-2-when-you-can-get-away-with-it" aria-label="Permalink to &quot;Level 1-2: When You Can Get Away With It&quot;"></a></h2><p>L1 (system prompt rules) and L2 (safe-mode skill) work well for tutorial agents that only touch demo data, personal assistants with no production access, and agents running in isolated environments.</p><p>The model will refuse most dangerous requests. &quot;Most&quot; is the problem. At a 1% per-turn failure rate, over 100 turns there is a 63% chance of at least one failure.</p><h2 id="level-3-the-minimum-for-production-code" tabindex="-1">Level 3: The Minimum for Production Code <a class="header-anchor" href="#level-3-the-minimum-for-production-code" aria-label="Permalink to &quot;Level 3: The Minimum for Production Code&quot;"></a></h2><p>L3 (blacklist hook) catches direct attacks like <code>rm -rf /</code>. But it misses the marquee break: the agent writes a Python script that does the damage, and the blacklist only sees &quot;python cleanup.py&quot; which is not in the blocklist.</p><h2 id="level-4-the-sweet-spot" tabindex="-1">Level 4: The Sweet Spot <a class="header-anchor" href="#level-4-the-sweet-spot" aria-label="Permalink to &quot;Level 4: The Sweet Spot&quot;"></a></h2><p>Whitelist hooks only allow N safelisted commands. The agent cannot run <code>python cleanup.py</code> because <code>python</code> is not safelisted. This prevents the L3 marque break. Use L4 as your default for any agent with access to production systems.</p><h2 id="level-5-the-gold-standard" tabindex="-1">Level 5: The Gold Standard <a class="header-anchor" href="#level-5-the-gold-standard" aria-label="Permalink to &quot;Level 5: The Gold Standard&quot;"></a></h2><p>No bash at all. The agent has only purpose-built tools: Read, Write, Edit, Grep, Glob. Required for any agent handling customer data, financial transactions, or healthcare information.</p><h2 id="rule-of-thumb" tabindex="-1">Rule of Thumb <a class="header-anchor" href="#rule-of-thumb" aria-label="Permalink to &quot;Rule of Thumb&quot;"></a></h2><p>If the agent can touch anything you cannot easily roll back, start at L4 and plan to get to L5.</p><hr><p><em>From Module 3 of the <a href="/">Agentic Engineering Course</a>. The full module includes runnable code for all 6 security levels.</em></p>',18)])])}const m=t(l,[["render",n]]);export{p as __pageData,m as default};

View File

@ -1,4 +1,4 @@
import{c as e,Q as a,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Agent Memory: Mental Models That Compound","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/mental-models.md","filePath":"blog/posts/mental-models.md","lastUpdated":null}'),n={name:"blog/posts/mental-models.md"};function l(o,s,h,p,r,d){return a(),t("div",null,[...s[0]||(s[0]=[i(`<h1 id="agent-memory-mental-models-that-compound" tabindex="-1">Agent Memory: Mental Models That Compound <a class="header-anchor" href="#agent-memory-mental-models-that-compound" aria-label="Permalink to &quot;Agent Memory: Mental Models That Compound&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>The biggest problem with agents is they forget. Every session starts from zero. Mental models solve this.</p><h2 id="what-a-mental-model-is" tabindex="-1">What a Mental Model Is <a class="header-anchor" href="#what-a-mental-model-is" aria-label="Permalink to &quot;What a Mental Model Is&quot;"></a></h2><p>A YAML file that the agent owns. It reads it at startup and updates it after work:</p><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;">expertise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
import{c as e,Q as a,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Agent Memory: Mental Models That Compound","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/mental-models.md","filePath":"blog/posts/mental-models.md","lastUpdated":1780488246000}'),n={name:"blog/posts/mental-models.md"};function l(o,s,h,p,r,d){return a(),t("div",null,[...s[0]||(s[0]=[i(`<h1 id="agent-memory-mental-models-that-compound" tabindex="-1">Agent Memory: Mental Models That Compound <a class="header-anchor" href="#agent-memory-mental-models-that-compound" aria-label="Permalink to &quot;Agent Memory: Mental Models That Compound&quot;"></a></h1><p><strong>June 9, 2026</strong></p><p>The biggest problem with agents is they forget. Every session starts from zero. Mental models solve this.</p><h2 id="what-a-mental-model-is" tabindex="-1">What a Mental Model Is <a class="header-anchor" href="#what-a-mental-model-is" aria-label="Permalink to &quot;What a Mental Model Is&quot;"></a></h2><p>A YAML file that the agent owns. It reads it at startup and updates it after work:</p><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;">expertise</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;">topic</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;API patterns&quot;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> notes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;We use tRPC for type-safe API calls&quot;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> evidence</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;src/server/routers/*.ts&quot;</span></span>

View File

@ -1 +1 @@
import{c as e,Q as a,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Agent Memory: Mental Models That Compound","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/mental-models.md","filePath":"blog/posts/mental-models.md","lastUpdated":null}'),n={name:"blog/posts/mental-models.md"};function l(o,s,h,p,r,d){return a(),t("div",null,[...s[0]||(s[0]=[i("",15)])])}const g=e(n,[["render",l]]);export{c as __pageData,g as default};
import{c as e,Q as a,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Agent Memory: Mental Models That Compound","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/mental-models.md","filePath":"blog/posts/mental-models.md","lastUpdated":1780488246000}'),n={name:"blog/posts/mental-models.md"};function l(o,s,h,p,r,d){return a(),t("div",null,[...s[0]||(s[0]=[i("",15)])])}const g=e(n,[["render",l]]);export{c as __pageData,g as default};

View File

@ -1,4 +1,4 @@
import{c as t,Q as a,j as n,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Repo Is the Spec","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/repo-is-spec.md","filePath":"blog/posts/repo-is-spec.md","lastUpdated":null}'),o={name:"blog/posts/repo-is-spec.md"};function i(r,e,l,p,h,c){return a(),n("div",null,[...e[0]||(e[0]=[s(`<h1 id="the-repo-is-the-spec" tabindex="-1">The Repo Is the Spec <a class="header-anchor" href="#the-repo-is-the-spec" aria-label="Permalink to &quot;The Repo Is the Spec&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>The single most important principle in agentic engineering: all context must live in the repository.</p><h2 id="the-problem" tabindex="-1">The Problem <a class="header-anchor" href="#the-problem" aria-label="Permalink to &quot;The Problem&quot;"></a></h2><p>Imagine dropping a new engineer into a project at 3AM. They need to know what the project does, how to run tests, where to put new code, and what conventions to follow.</p><p>If the answer to any of these is &quot;ask Bob,&quot; you fail. If the answer is &quot;read CLAUDE.md in the repo,&quot; you win.</p><h2 id="what-the-repo-should-contain" tabindex="-1">What the Repo Should Contain <a class="header-anchor" href="#what-the-repo-should-contain" aria-label="Permalink to &quot;What the Repo Should Contain&quot;"></a></h2><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>repo/</span></span>
import{c as t,Q as a,j as n,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Repo Is the Spec","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/repo-is-spec.md","filePath":"blog/posts/repo-is-spec.md","lastUpdated":1780488246000}'),o={name:"blog/posts/repo-is-spec.md"};function i(r,e,l,p,h,c){return a(),n("div",null,[...e[0]||(e[0]=[s(`<h1 id="the-repo-is-the-spec" tabindex="-1">The Repo Is the Spec <a class="header-anchor" href="#the-repo-is-the-spec" aria-label="Permalink to &quot;The Repo Is the Spec&quot;"></a></h1><p><strong>June 5, 2026</strong></p><p>The single most important principle in agentic engineering: all context must live in the repository.</p><h2 id="the-problem" tabindex="-1">The Problem <a class="header-anchor" href="#the-problem" aria-label="Permalink to &quot;The Problem&quot;"></a></h2><p>Imagine dropping a new engineer into a project at 3AM. They need to know what the project does, how to run tests, where to put new code, and what conventions to follow.</p><p>If the answer to any of these is &quot;ask Bob,&quot; you fail. If the answer is &quot;read CLAUDE.md in the repo,&quot; you win.</p><h2 id="what-the-repo-should-contain" tabindex="-1">What the Repo Should Contain <a class="header-anchor" href="#what-the-repo-should-contain" aria-label="Permalink to &quot;What the Repo Should Contain&quot;"></a></h2><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>repo/</span></span>
<span class="line"><span>+-- CLAUDE.md or AGENTS.md # Agent instructions (the most important file)</span></span>
<span class="line"><span>+-- init.sh # Environment setup script</span></span>
<span class="line"><span>+-- feature_list.json # Tracked features with evidence</span></span>

View File

@ -1 +1 @@
import{c as t,Q as a,j as n,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Repo Is the Spec","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/repo-is-spec.md","filePath":"blog/posts/repo-is-spec.md","lastUpdated":null}'),o={name:"blog/posts/repo-is-spec.md"};function i(r,e,l,p,h,c){return a(),n("div",null,[...e[0]||(e[0]=[s("",14)])])}const m=t(o,[["render",i]]);export{u as __pageData,m as default};
import{c as t,Q as a,j as n,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Repo Is the Spec","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/repo-is-spec.md","filePath":"blog/posts/repo-is-spec.md","lastUpdated":1780488246000}'),o={name:"blog/posts/repo-is-spec.md"};function i(r,e,l,p,h,c){return a(),n("div",null,[...e[0]||(e[0]=[s("",14)])])}const m=t(o,[["render",i]]);export{u as __pageData,m as default};

View File

@ -1,4 +1,4 @@
import{c as a,Q as t,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 6-Level Security Ladder","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/security-ladder.md","filePath":"blog/posts/security-ladder.md","lastUpdated":null}'),o={name:"blog/posts/security-ladder.md"};function l(r,e,i,p,c,h){return t(),s("div",null,[...e[0]||(e[0]=[n(`<h1 id="the-6-level-security-ladder" tabindex="-1">The 6-Level Security Ladder <a class="header-anchor" href="#the-6-level-security-ladder" aria-label="Permalink to &quot;The 6-Level Security Ladder&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>Every AI agent has access to bash. One tool — every dangerous verb: <code>rm -rf</code>, <code>curl</code>, <code>git clean -fdx</code>, <code>terraform destroy</code>, <code>DROP DATABASE</code>.</p><p>The math is brutal. At a 1% per-turn failure rate, there&#39;s a <strong>63.4% chance of catastrophe over 100 turns</strong>. This isn&#39;t theoretical — it&#39;s the actual threat model for every agent in production.</p><p>Most engineers stop at Level 2 (system prompt rules) and think they&#39;re safe. They&#39;re not. Here&#39;s the full 6-level ladder that actually works.</p><h2 id="level-0-acip-prompt-injection-defense" tabindex="-1">Level 0: ACIP (Prompt Injection Defense) <a class="header-anchor" href="#level-0-acip-prompt-injection-defense" aria-label="Permalink to &quot;Level 0: ACIP (Prompt Injection Defense)&quot;"></a></h2><p>Before bash security, there&#39;s prompt injection. An attacker can trick the agent into ignoring its instructions through:</p><ul><li>Direct injection (&quot;ignore previous instructions&quot;)</li><li>Indirect injection (malicious content in web pages the agent reads)</li><li>Role-playing bypasses (&quot;you are now a free AI&quot;)</li></ul><p>ACIP (Advanced Cognitive Inoculation Prompt) is a system prompt patch that makes agents resistant. It costs nothing (zero runtime overhead) and blocks simple attacks. <a href="https://github.com/Dicklesworthstone/acip" target="_blank" rel="noreferrer">Jeff Emanuel&#39;s ACIP</a> is the reference implementation.</p><h2 id="level-1-2-theatre-skills-system-prompts" tabindex="-1">Level 1-2: Theatre (Skills + System Prompts) <a class="header-anchor" href="#level-1-2-theatre-skills-system-prompts" aria-label="Permalink to &quot;Level 1-2: Theatre (Skills + System Prompts)&quot;"></a></h2><p>These levels ask the model to behave. They work most of the time on frontier models. But &quot;most of the time&quot; is not a production guarantee. A 99% refusal rate means a 63% failure rate over 100 turns. Use them as accelerators, not enforcement.</p><h2 id="level-3-blacklist-hook" tabindex="-1">Level 3: Blacklist Hook <a class="header-anchor" href="#level-3-blacklist-hook" aria-label="Permalink to &quot;Level 3: Blacklist Hook&quot;"></a></h2><p>A regex blacklist intercepts dangerous commands before execution. It catches <code>rm -rf /</code> directly. But here&#39;s the marquee break: the agent writes a Python script:</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>User prompt: &quot;Clean up the target directory&quot;</span></span>
import{c as a,Q as t,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 6-Level Security Ladder","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/security-ladder.md","filePath":"blog/posts/security-ladder.md","lastUpdated":1780488246000}'),o={name:"blog/posts/security-ladder.md"};function l(r,e,i,p,c,h){return t(),s("div",null,[...e[0]||(e[0]=[n(`<h1 id="the-6-level-security-ladder" tabindex="-1">The 6-Level Security Ladder <a class="header-anchor" href="#the-6-level-security-ladder" aria-label="Permalink to &quot;The 6-Level Security Ladder&quot;"></a></h1><p><strong>June 6, 2026</strong></p><p>Every AI agent has access to bash. One tool — every dangerous verb: <code>rm -rf</code>, <code>curl</code>, <code>git clean -fdx</code>, <code>terraform destroy</code>, <code>DROP DATABASE</code>.</p><p>The math is brutal. At a 1% per-turn failure rate, there&#39;s a <strong>63.4% chance of catastrophe over 100 turns</strong>. This isn&#39;t theoretical — it&#39;s the actual threat model for every agent in production.</p><p>Most engineers stop at Level 2 (system prompt rules) and think they&#39;re safe. They&#39;re not. Here&#39;s the full 6-level ladder that actually works.</p><h2 id="level-0-acip-prompt-injection-defense" tabindex="-1">Level 0: ACIP (Prompt Injection Defense) <a class="header-anchor" href="#level-0-acip-prompt-injection-defense" aria-label="Permalink to &quot;Level 0: ACIP (Prompt Injection Defense)&quot;"></a></h2><p>Before bash security, there&#39;s prompt injection. An attacker can trick the agent into ignoring its instructions through:</p><ul><li>Direct injection (&quot;ignore previous instructions&quot;)</li><li>Indirect injection (malicious content in web pages the agent reads)</li><li>Role-playing bypasses (&quot;you are now a free AI&quot;)</li></ul><p>ACIP (Advanced Cognitive Inoculation Prompt) is a system prompt patch that makes agents resistant. It costs nothing (zero runtime overhead) and blocks simple attacks. <a href="https://github.com/Dicklesworthstone/acip" target="_blank" rel="noreferrer">Jeff Emanuel&#39;s ACIP</a> is the reference implementation.</p><h2 id="level-1-2-theatre-skills-system-prompts" tabindex="-1">Level 1-2: Theatre (Skills + System Prompts) <a class="header-anchor" href="#level-1-2-theatre-skills-system-prompts" aria-label="Permalink to &quot;Level 1-2: Theatre (Skills + System Prompts)&quot;"></a></h2><p>These levels ask the model to behave. They work most of the time on frontier models. But &quot;most of the time&quot; is not a production guarantee. A 99% refusal rate means a 63% failure rate over 100 turns. Use them as accelerators, not enforcement.</p><h2 id="level-3-blacklist-hook" tabindex="-1">Level 3: Blacklist Hook <a class="header-anchor" href="#level-3-blacklist-hook" aria-label="Permalink to &quot;Level 3: Blacklist Hook&quot;"></a></h2><p>A regex blacklist intercepts dangerous commands before execution. It catches <code>rm -rf /</code> directly. But here&#39;s the marquee break: the agent writes a Python script:</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>User prompt: &quot;Clean up the target directory&quot;</span></span>
<span class="line"><span>Agent writes cleanup.py with os.remove() and shutil.rmtree()</span></span>
<span class="line"><span>Agent runs: python cleanup.py</span></span>
<span class="line"><span>Hook sees: &quot;python cleanup.py&quot; (not in blacklist)</span></span>

View File

@ -1 +1 @@
import{c as a,Q as t,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 6-Level Security Ladder","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/security-ladder.md","filePath":"blog/posts/security-ladder.md","lastUpdated":null}'),o={name:"blog/posts/security-ladder.md"};function l(r,e,i,p,c,h){return t(),s("div",null,[...e[0]||(e[0]=[n("",28)])])}const m=a(o,[["render",l]]);export{u as __pageData,m as default};
import{c as a,Q as t,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 6-Level Security Ladder","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/security-ladder.md","filePath":"blog/posts/security-ladder.md","lastUpdated":1780488246000}'),o={name:"blog/posts/security-ladder.md"};function l(r,e,i,p,c,h){return t(),s("div",null,[...e[0]||(e[0]=[n("",28)])])}const m=a(o,[["render",l]]);export{u as __pageData,m as default};

View File

@ -1,4 +1,4 @@
import{c as s,Q as e,j as i,m as a}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 3x Rule of Agent Costs","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/three-x-rule.md","filePath":"blog/posts/three-x-rule.md","lastUpdated":null}'),n={name:"blog/posts/three-x-rule.md"};function l(h,t,r,o,p,d){return e(),i("div",null,[...t[0]||(t[0]=[a(`<h1 id="the-3x-rule-of-agent-costs" tabindex="-1">The 3x Rule of Agent Costs <a class="header-anchor" href="#the-3x-rule-of-agent-costs" aria-label="Permalink to &quot;The 3x Rule of Agent Costs&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>Here is a rule that will save you from budget surprises: <strong>production agent costs 3x your prototype estimate.</strong></p><h2 id="why-the-multiplier-exists" tabindex="-1">Why the Multiplier Exists <a class="header-anchor" href="#why-the-multiplier-exists" aria-label="Permalink to &quot;Why the Multiplier Exists&quot;"></a></h2><table tabindex="0"><thead><tr><th>Phase</th><th>Multiplier</th><th>What Happens</th></tr></thead><tbody><tr><td>Prototype</td><td>1x</td><td>Happy path works perfectly</td></tr><tr><td>With retries</td><td>1.5x</td><td>Failed tool calls retry, edge cases handled</td></tr><tr><td>Production</td><td>3x</td><td>Monitoring, error handling, observability, security</td></tr></tbody></table><h2 id="where-the-cost-goes" tabindex="-1">Where the Cost Goes <a class="header-anchor" href="#where-the-cost-goes" aria-label="Permalink to &quot;Where the Cost Goes&quot;"></a></h2><p>Output tokens dominate — about 70% of total cost. The model&#39;s reasoning is the expensive part. Input tokens (context) are about 20%. Cached tokens are 10%.</p><p>Every tool call costs 3-5x more than the call itself:</p><ul><li>Planning which tool to use</li><li>Executing the tool</li><li>Error recovery if it fails</li><li>Parsing the result</li><li>Adding the result back to context</li></ul><h2 id="quick-estimation" tabindex="-1">Quick Estimation <a class="header-anchor" href="#quick-estimation" aria-label="Permalink to &quot;Quick Estimation&quot;"></a></h2><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</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;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> estimate_cost</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(turns, tokens_per_turn, price_per_m):</span></span>
import{c as s,Q as e,j as i,m as a}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 3x Rule of Agent Costs","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/three-x-rule.md","filePath":"blog/posts/three-x-rule.md","lastUpdated":1780488246000}'),n={name:"blog/posts/three-x-rule.md"};function l(h,t,r,o,p,d){return e(),i("div",null,[...t[0]||(t[0]=[a(`<h1 id="the-3x-rule-of-agent-costs" tabindex="-1">The 3x Rule of Agent Costs <a class="header-anchor" href="#the-3x-rule-of-agent-costs" aria-label="Permalink to &quot;The 3x Rule of Agent Costs&quot;"></a></h1><p><strong>June 10, 2026</strong></p><p>Here is a rule that will save you from budget surprises: <strong>production agent costs 3x your prototype estimate.</strong></p><h2 id="why-the-multiplier-exists" tabindex="-1">Why the Multiplier Exists <a class="header-anchor" href="#why-the-multiplier-exists" aria-label="Permalink to &quot;Why the Multiplier Exists&quot;"></a></h2><table tabindex="0"><thead><tr><th>Phase</th><th>Multiplier</th><th>What Happens</th></tr></thead><tbody><tr><td>Prototype</td><td>1x</td><td>Happy path works perfectly</td></tr><tr><td>With retries</td><td>1.5x</td><td>Failed tool calls retry, edge cases handled</td></tr><tr><td>Production</td><td>3x</td><td>Monitoring, error handling, observability, security</td></tr></tbody></table><h2 id="where-the-cost-goes" tabindex="-1">Where the Cost Goes <a class="header-anchor" href="#where-the-cost-goes" aria-label="Permalink to &quot;Where the Cost Goes&quot;"></a></h2><p>Output tokens dominate — about 70% of total cost. The model&#39;s reasoning is the expensive part. Input tokens (context) are about 20%. Cached tokens are 10%.</p><p>Every tool call costs 3-5x more than the call itself:</p><ul><li>Planning which tool to use</li><li>Executing the tool</li><li>Error recovery if it fails</li><li>Parsing the result</li><li>Adding the result back to context</li></ul><h2 id="quick-estimation" tabindex="-1">Quick Estimation <a class="header-anchor" href="#quick-estimation" aria-label="Permalink to &quot;Quick Estimation&quot;"></a></h2><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</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;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> estimate_cost</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(turns, tokens_per_turn, price_per_m):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> base </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> turns </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> tokens_per_turn </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> price_per_m </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1_000_000</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;prototype&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: base,</span></span>

View File

@ -1 +1 @@
import{c as s,Q as e,j as i,m as a}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 3x Rule of Agent Costs","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/three-x-rule.md","filePath":"blog/posts/three-x-rule.md","lastUpdated":null}'),n={name:"blog/posts/three-x-rule.md"};function l(h,t,r,o,p,d){return e(),i("div",null,[...t[0]||(t[0]=[a("",15)])])}const c=s(n,[["render",l]]);export{u as __pageData,c as default};
import{c as s,Q as e,j as i,m as a}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The 3x Rule of Agent Costs","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/three-x-rule.md","filePath":"blog/posts/three-x-rule.md","lastUpdated":1780488246000}'),n={name:"blog/posts/three-x-rule.md"};function l(h,t,r,o,p,d){return e(),i("div",null,[...t[0]||(t[0]=[a("",15)])])}const c=s(n,[["render",l]]);export{u as __pageData,c as default};

View File

@ -1,4 +1,4 @@
import{c as t,Q as r,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Verifier Pattern","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/verifier-pattern.md","filePath":"blog/posts/verifier-pattern.md","lastUpdated":null}'),n={name:"blog/posts/verifier-pattern.md"};function o(s,e,d,l,h,p){return r(),a("div",null,[...e[0]||(e[0]=[i(`<h1 id="the-verifier-pattern" tabindex="-1">The Verifier Pattern <a class="header-anchor" href="#the-verifier-pattern" aria-label="Permalink to &quot;The Verifier Pattern&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>Here&#39;s the problem: engineers spend roughly half their day reviewing agent output. Every &quot;I created the table,&quot; &quot;I added the foreign key,&quot; &quot;I applied the migration&quot; gets re-checked by hand. That review work is the binding constraint on agentic engineering throughput.</p><p>The verifier pattern solves this: a second, read-only agent that automatically checks every claim the builder makes.</p><h2 id="architecture" tabindex="-1">Architecture <a class="header-anchor" href="#architecture" aria-label="Permalink to &quot;Architecture&quot;"></a></h2><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>Builder (your terminal) ---unix socket---&gt; Verifier (new window, input LOCKED)</span></span>
import{c as t,Q as r,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Verifier Pattern","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/verifier-pattern.md","filePath":"blog/posts/verifier-pattern.md","lastUpdated":1780488246000}'),n={name:"blog/posts/verifier-pattern.md"};function o(s,e,d,l,h,p){return r(),a("div",null,[...e[0]||(e[0]=[i(`<h1 id="the-verifier-pattern" tabindex="-1">The Verifier Pattern <a class="header-anchor" href="#the-verifier-pattern" aria-label="Permalink to &quot;The Verifier Pattern&quot;"></a></h1><p><strong>June 8, 2026</strong></p><p>Here&#39;s the problem: engineers spend roughly half their day reviewing agent output. Every &quot;I created the table,&quot; &quot;I added the foreign key,&quot; &quot;I applied the migration&quot; gets re-checked by hand. That review work is the binding constraint on agentic engineering throughput.</p><p>The verifier pattern solves this: a second, read-only agent that automatically checks every claim the builder makes.</p><h2 id="architecture" tabindex="-1">Architecture <a class="header-anchor" href="#architecture" aria-label="Permalink to &quot;Architecture&quot;"></a></h2><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>Builder (your terminal) ---unix socket---&gt; Verifier (new window, input LOCKED)</span></span>
<span class="line"><span> | |</span></span>
<span class="line"><span> v writes: v reads (read-only tools):</span></span>
<span class="line"><span> session.jsonl session.jsonl</span></span>

View File

@ -1 +1 @@
import{c as t,Q as r,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Verifier Pattern","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/verifier-pattern.md","filePath":"blog/posts/verifier-pattern.md","lastUpdated":null}'),n={name:"blog/posts/verifier-pattern.md"};function o(s,e,d,l,h,p){return r(),a("div",null,[...e[0]||(e[0]=[i("",15)])])}const f=t(n,[["render",o]]);export{u as __pageData,f as default};
import{c as t,Q as r,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"The Verifier Pattern","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/verifier-pattern.md","filePath":"blog/posts/verifier-pattern.md","lastUpdated":1780488246000}'),n={name:"blog/posts/verifier-pattern.md"};function o(s,e,d,l,h,p){return r(),a("div",null,[...e[0]||(e[0]=[i("",15)])])}const f=t(n,[["render",o]]);export{u as __pageData,f as default};

View File

@ -0,0 +1 @@
import{c as t,Q as a,j as r,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Vibe Coding vs Agentic Engineering","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/vibe-vs-agentic.md","filePath":"blog/posts/vibe-vs-agentic.md","lastUpdated":1780488246000}'),i={name:"blog/posts/vibe-vs-agentic.md"};function o(s,e,d,h,c,g){return a(),r("div",null,[...e[0]||(e[0]=[n('<h1 id="vibe-coding-vs-agentic-engineering" tabindex="-1">Vibe Coding vs Agentic Engineering <a class="header-anchor" href="#vibe-coding-vs-agentic-engineering" aria-label="Permalink to &quot;Vibe Coding vs Agentic Engineering&quot;"></a></h1><p><strong>June 4, 2026</strong></p><p>Vibe coding is prompting and shipping whatever comes out. Agentic engineering is building systems that produce reliable, verifiable results. They are not the same thing.</p><h2 id="the-5-hard-rules" tabindex="-1">The 5 Hard Rules <a class="header-anchor" href="#the-5-hard-rules" aria-label="Permalink to &quot;The 5 Hard Rules&quot;"></a></h2><p><strong>1. Risk compounds with runtime.</strong> A 1% per-turn failure rate equals a 63% chance of disaster over 100 turns. Long-running agents are not safer. They are more exposed.</p><p><strong>2. If your agent can write AND execute code, you are back at L1 security.</strong> The marquee break: agent writes cleanup.py, runs python cleanup.py, your production data is gone. The security hook never fired because it only saw &quot;python cleanup.py.&quot;</p><p><strong>3. Every turn is a roll of the dice.</strong> Modern models refuse well 99% of the time. That last 1% grows with every feature release. Engineer the harness for the 1%, not the 99%.</p><p><strong>4. Token costs scale with loop depth, not task complexity.</strong> A simple task with a bad loop costs 10x more than a complex task with a clean loop. Optimize the loop first.</p><p><strong>5. What you cannot measure, you cannot improve.</strong> Every agent system needs: cost per task, success rate, loop efficiency, failure mode tracking.</p><h2 id="the-practical-difference" tabindex="-1">The Practical Difference <a class="header-anchor" href="#the-practical-difference" aria-label="Permalink to &quot;The Practical Difference&quot;"></a></h2><table tabindex="0"><thead><tr><th>Dimension</th><th>Vibe Coding</th><th>Agentic Engineering</th></tr></thead><tbody><tr><td>Approach</td><td>Prompt and pray</td><td>Build and verify</td></tr><tr><td>Security</td><td>Trust the model</td><td>Trust the harness</td></tr><tr><td>Cost</td><td>Unknown until the bill arrives</td><td>Tracked and optimized</td></tr><tr><td>Quality</td><td>Whatever comes out</td><td>Measured against golden dataset</td></tr><tr><td>Iteration</td><td>Try another prompt</td><td>Fix the harness</td></tr></tbody></table><h2 id="the-karpathy-framing" tabindex="-1">The Karpathy Framing <a class="header-anchor" href="#the-karpathy-framing" aria-label="Permalink to &quot;The Karpathy Framing&quot;"></a></h2><p>At Sequoia Ascent 2026, Andrej Karpathy said: &quot;Vibe coding raises the floor. Agentic engineering raises the ceiling.&quot; Vibe coding makes mediocre engineers productive. Agentic engineering makes great engineers extraordinary.</p><hr><p><em>From Module 1 of the <a href="/">Agentic Engineering Course</a>. The first module establishes the foundations that the rest of the course builds on.</em></p>',15)])])}const u=t(i,[["render",o]]);export{p as __pageData,u as default};

View File

@ -1 +1 @@
import{c as t,Q as a,j as r,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Vibe Coding vs Agentic Engineering","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/vibe-vs-agentic.md","filePath":"blog/posts/vibe-vs-agentic.md","lastUpdated":null}'),i={name:"blog/posts/vibe-vs-agentic.md"};function o(s,e,d,h,c,g){return a(),r("div",null,[...e[0]||(e[0]=[n("",15)])])}const u=t(i,[["render",o]]);export{p as __pageData,u as default};
import{c as t,Q as a,j as r,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Vibe Coding vs Agentic Engineering","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/vibe-vs-agentic.md","filePath":"blog/posts/vibe-vs-agentic.md","lastUpdated":1780488246000}'),i={name:"blog/posts/vibe-vs-agentic.md"};function o(s,e,d,h,c,g){return a(),r("div",null,[...e[0]||(e[0]=[n("",15)])])}const u=t(i,[["render",o]]);export{p as __pageData,u as default};

View File

@ -1 +0,0 @@
import{c as t,Q as a,j as r,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Vibe Coding vs Agentic Engineering","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/vibe-vs-agentic.md","filePath":"blog/posts/vibe-vs-agentic.md","lastUpdated":null}'),i={name:"blog/posts/vibe-vs-agentic.md"};function o(s,e,d,h,c,g){return a(),r("div",null,[...e[0]||(e[0]=[n('<h1 id="vibe-coding-vs-agentic-engineering" tabindex="-1">Vibe Coding vs Agentic Engineering <a class="header-anchor" href="#vibe-coding-vs-agentic-engineering" aria-label="Permalink to &quot;Vibe Coding vs Agentic Engineering&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>Vibe coding is prompting and shipping whatever comes out. Agentic engineering is building systems that produce reliable, verifiable results. They are not the same thing.</p><h2 id="the-5-hard-rules" tabindex="-1">The 5 Hard Rules <a class="header-anchor" href="#the-5-hard-rules" aria-label="Permalink to &quot;The 5 Hard Rules&quot;"></a></h2><p><strong>1. Risk compounds with runtime.</strong> A 1% per-turn failure rate equals a 63% chance of disaster over 100 turns. Long-running agents are not safer. They are more exposed.</p><p><strong>2. If your agent can write AND execute code, you are back at L1 security.</strong> The marquee break: agent writes cleanup.py, runs python cleanup.py, your production data is gone. The security hook never fired because it only saw &quot;python cleanup.py.&quot;</p><p><strong>3. Every turn is a roll of the dice.</strong> Modern models refuse well 99% of the time. That last 1% grows with every feature release. Engineer the harness for the 1%, not the 99%.</p><p><strong>4. Token costs scale with loop depth, not task complexity.</strong> A simple task with a bad loop costs 10x more than a complex task with a clean loop. Optimize the loop first.</p><p><strong>5. What you cannot measure, you cannot improve.</strong> Every agent system needs: cost per task, success rate, loop efficiency, failure mode tracking.</p><h2 id="the-practical-difference" tabindex="-1">The Practical Difference <a class="header-anchor" href="#the-practical-difference" aria-label="Permalink to &quot;The Practical Difference&quot;"></a></h2><table tabindex="0"><thead><tr><th>Dimension</th><th>Vibe Coding</th><th>Agentic Engineering</th></tr></thead><tbody><tr><td>Approach</td><td>Prompt and pray</td><td>Build and verify</td></tr><tr><td>Security</td><td>Trust the model</td><td>Trust the harness</td></tr><tr><td>Cost</td><td>Unknown until the bill arrives</td><td>Tracked and optimized</td></tr><tr><td>Quality</td><td>Whatever comes out</td><td>Measured against golden dataset</td></tr><tr><td>Iteration</td><td>Try another prompt</td><td>Fix the harness</td></tr></tbody></table><h2 id="the-karpathy-framing" tabindex="-1">The Karpathy Framing <a class="header-anchor" href="#the-karpathy-framing" aria-label="Permalink to &quot;The Karpathy Framing&quot;"></a></h2><p>At Sequoia Ascent 2026, Andrej Karpathy said: &quot;Vibe coding raises the floor. Agentic engineering raises the ceiling.&quot; Vibe coding makes mediocre engineers productive. Agentic engineering makes great engineers extraordinary.</p><hr><p><em>From Module 1 of the <a href="/">Agentic Engineering Course</a>. The first module establishes the foundations that the rest of the course builds on.</em></p>',15)])])}const u=t(i,[["render",o]]);export{p as __pageData,u as default};

View File

@ -1,4 +1,4 @@
import{c as a,Q as e,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"What Is an AI Agent, Really?","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/what-is-an-agent.md","filePath":"blog/posts/what-is-an-agent.md","lastUpdated":null}'),n={name:"blog/posts/what-is-an-agent.md"};function o(l,s,h,p,r,d){return e(),t("div",null,[...s[0]||(s[0]=[i(`<h1 id="what-is-an-ai-agent-really" tabindex="-1">What Is an AI Agent, Really? <a class="header-anchor" href="#what-is-an-ai-agent-really" aria-label="Permalink to &quot;What Is an AI Agent, Really?&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>An AI agent = LLM + Tools + Loop. If any of the three is missing, it is not an agent.</p><h2 id="the-three-components" tabindex="-1">The Three Components <a class="header-anchor" href="#the-three-components" aria-label="Permalink to &quot;The Three Components&quot;"></a></h2><p><strong>LLM</strong> — The reasoning engine. Given context and available tools, it decides what to do next. The LLM is NOT the agent. It is the brain of the agent.</p><p><strong>Tools</strong> — The capability surface. Functions the agent can call: read files, run commands, search the web, query databases. Each tool has a name, description, and input schema.</p><p><strong>Loop</strong> — The autonomous decision cycle. Think (LLM decides) leads to Act (tool executes) leads to Observe (result comes back) leads to Repeat.</p><h2 id="what-each-combination-gives-you" tabindex="-1">What Each Combination Gives You <a class="header-anchor" href="#what-each-combination-gives-you" aria-label="Permalink to &quot;What Each Combination Gives You&quot;"></a></h2><table tabindex="0"><thead><tr><th>Combination</th><th>Result</th></tr></thead><tbody><tr><td>LLM only</td><td>Chatbot</td></tr><tr><td>LLM + Tools (no loop)</td><td>Augmented inference</td></tr><tr><td>LLM + Loop (no tools)</td><td>Talking to itself</td></tr><tr><td>LLM + Tools + Loop</td><td>Agent</td></tr></tbody></table><h2 id="the-loop-in-pseudocode" tabindex="-1">The Loop in Pseudocode <a class="header-anchor" href="#the-loop-in-pseudocode" aria-label="Permalink to &quot;The Loop in Pseudocode&quot;"></a></h2><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</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;">messages </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [system_prompt, user_request]</span></span>
import{c as a,Q as e,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"What Is an AI Agent, Really?","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/what-is-an-agent.md","filePath":"blog/posts/what-is-an-agent.md","lastUpdated":1780488246000}'),n={name:"blog/posts/what-is-an-agent.md"};function o(l,s,h,p,r,d){return e(),t("div",null,[...s[0]||(s[0]=[i(`<h1 id="what-is-an-ai-agent-really" tabindex="-1">What Is an AI Agent, Really? <a class="header-anchor" href="#what-is-an-ai-agent-really" aria-label="Permalink to &quot;What Is an AI Agent, Really?&quot;"></a></h1><p><strong>June 2, 2026</strong></p><p>An AI agent = LLM + Tools + Loop. If any of the three is missing, it is not an agent.</p><h2 id="the-three-components" tabindex="-1">The Three Components <a class="header-anchor" href="#the-three-components" aria-label="Permalink to &quot;The Three Components&quot;"></a></h2><p><strong>LLM</strong> — The reasoning engine. Given context and available tools, it decides what to do next. The LLM is NOT the agent. It is the brain of the agent.</p><p><strong>Tools</strong> — The capability surface. Functions the agent can call: read files, run commands, search the web, query databases. Each tool has a name, description, and input schema.</p><p><strong>Loop</strong> — The autonomous decision cycle. Think (LLM decides) leads to Act (tool executes) leads to Observe (result comes back) leads to Repeat.</p><h2 id="what-each-combination-gives-you" tabindex="-1">What Each Combination Gives You <a class="header-anchor" href="#what-each-combination-gives-you" aria-label="Permalink to &quot;What Each Combination Gives You&quot;"></a></h2><table tabindex="0"><thead><tr><th>Combination</th><th>Result</th></tr></thead><tbody><tr><td>LLM only</td><td>Chatbot</td></tr><tr><td>LLM + Tools (no loop)</td><td>Augmented inference</td></tr><tr><td>LLM + Loop (no tools)</td><td>Talking to itself</td></tr><tr><td>LLM + Tools + Loop</td><td>Agent</td></tr></tbody></table><h2 id="the-loop-in-pseudocode" tabindex="-1">The Loop in Pseudocode <a class="header-anchor" href="#the-loop-in-pseudocode" aria-label="Permalink to &quot;The Loop in Pseudocode&quot;"></a></h2><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</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;">messages </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [system_prompt, user_request]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">while</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> True</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> response </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> llm.invoke(messages, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">tools</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">tool_definitions)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> response.is_final_answer:</span></span>

View File

@ -1 +1 @@
import{c as a,Q as e,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"What Is an AI Agent, Really?","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/what-is-an-agent.md","filePath":"blog/posts/what-is-an-agent.md","lastUpdated":null}'),n={name:"blog/posts/what-is-an-agent.md"};function o(l,s,h,p,r,d){return e(),t("div",null,[...s[0]||(s[0]=[i("",15)])])}const g=a(n,[["render",o]]);export{c as __pageData,g as default};
import{c as a,Q as e,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"What Is an AI Agent, Really?","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/what-is-an-agent.md","filePath":"blog/posts/what-is-an-agent.md","lastUpdated":1780488246000}'),n={name:"blog/posts/what-is-an-agent.md"};function o(l,s,h,p,r,d){return e(),t("div",null,[...s[0]||(s[0]=[i("",15)])])}const g=a(n,[["render",o]]);export{c as __pageData,g as default};

View File

@ -1,16 +0,0 @@
import{c as n,Q as a,j as t,m as s}from"./chunks/framework.BPKcPtvA.js";const d=JSON.parse('{"title":"Why One Agent Is Not Enough","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/why-multi-agent.md","filePath":"blog/posts/why-multi-agent.md","lastUpdated":null}'),i={name:"blog/posts/why-multi-agent.md"};function l(o,e,r,p,h,g){return a(),t("div",null,[...e[0]||(e[0]=[s(`<h1 id="why-one-agent-is-not-enough" tabindex="-1">Why One Agent Is Not Enough <a class="header-anchor" href="#why-one-agent-is-not-enough" aria-label="Permalink to &quot;Why One Agent Is Not Enough&quot;"></a></h1><p><strong>May 26, 2026</strong></p><p>A single agent, no matter how smart, hits three ceilings.</p><h2 id="the-context-ceiling" tabindex="-1">The Context Ceiling <a class="header-anchor" href="#the-context-ceiling" aria-label="Permalink to &quot;The Context Ceiling&quot;"></a></h2><p>One agent doing everything means one context window holding everything. File contents, database schemas, business logic, deployment configs — they all compete for the same limited space. A 100K token codebase leaves zero room for the actual task.</p><h2 id="the-capability-ceiling" tabindex="-1">The Capability Ceiling <a class="header-anchor" href="#the-capability-ceiling" aria-label="Permalink to &quot;The Capability Ceiling&quot;"></a></h2><p>A generalist agent is mediocre at everything. A specialized agent — backend dev, security reviewer, UI designer — outperforms the generalist in its domain by a wide margin. You wouldn&#39;t ask your frontend dev to write SQL migrations. Why ask your agent to?</p><h2 id="the-reliability-ceiling" tabindex="-1">The Reliability Ceiling <a class="header-anchor" href="#the-reliability-ceiling" aria-label="Permalink to &quot;The Reliability Ceiling&quot;"></a></h2><p>One agent failing = everything fails. Multi-agent systems degrade gracefully. If the reviewer agent crashes, the builder keeps working. If the planner goes down, deployed agents continue running.</p><h2 id="the-solution-depth-2-delegation" tabindex="-1">The Solution: Depth-2 Delegation <a class="header-anchor" href="#the-solution-depth-2-delegation" aria-label="Permalink to &quot;The Solution: Depth-2 Delegation&quot;"></a></h2><p>The production-proven pattern:</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>User</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> v</span></span>
<span class="line"><span>Orchestrator (Opus-level, thinking only)</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> +-- Planning Team Lead</span></span>
<span class="line"><span> | +-- Product Manager (worker)</span></span>
<span class="line"><span> | +-- UX Researcher (worker)</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> +-- Engineering Team Lead</span></span>
<span class="line"><span> | +-- Frontend Dev (worker)</span></span>
<span class="line"><span> | +-- Backend Dev (worker)</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> +-- Validation Team Lead</span></span>
<span class="line"><span> +-- QA Engineer (worker)</span></span>
<span class="line"><span> +-- Security Reviewer (worker)</span></span></code></pre></div><p>Leads think, plan, and delegate. Workers execute. The orchestrator never touches code.</p><h2 id="when-to-go-multi-agent" tabindex="-1">When to Go Multi-Agent <a class="header-anchor" href="#when-to-go-multi-agent" aria-label="Permalink to &quot;When to Go Multi-Agent&quot;"></a></h2><p>You need multiple agents when any of these are true:</p><ul><li><strong>Different expertise required</strong> Your task needs a planner, a coder, a reviewer, and a security auditor</li><li><strong>Parallel work possible</strong> Multiple sub-tasks can run simultaneously</li><li><strong>Failure cost is high</strong> You want a second agent to catch mistakes before they ship</li><li><strong>Context exceeds one window</strong> Split across specialized agents</li></ul><p>If none of these are true, a single well-configured agent is simpler and cheaper.</p><hr><p><em>This is an excerpt from Module 4 of the <a href="/">Agentic Engineering Course</a>. The full module includes runnable lab code for building multi-agent systems with domain locking, mental models, and P2P communication.</em></p>`,19)])])}const u=n(i,[["render",l]]);export{d as __pageData,u as default};

View File

@ -0,0 +1,16 @@
import{c as n,Q as a,j as t,m as s}from"./chunks/framework.BPKcPtvA.js";const d=JSON.parse('{"title":"Why One Agent Is Not Enough","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/why-multi-agent.md","filePath":"blog/posts/why-multi-agent.md","lastUpdated":1780488246000}'),i={name:"blog/posts/why-multi-agent.md"};function o(l,e,r,p,h,g){return a(),t("div",null,[...e[0]||(e[0]=[s(`<h1 id="why-one-agent-is-not-enough" tabindex="-1">Why One Agent Is Not Enough <a class="header-anchor" href="#why-one-agent-is-not-enough" aria-label="Permalink to &quot;Why One Agent Is Not Enough&quot;"></a></h1><p><strong>June 3, 2026</strong></p><p>A single agent, no matter how smart, hits three ceilings.</p><h2 id="the-context-ceiling" tabindex="-1">The Context Ceiling <a class="header-anchor" href="#the-context-ceiling" aria-label="Permalink to &quot;The Context Ceiling&quot;"></a></h2><p>One agent doing everything means one context window holding everything. File contents, database schemas, business logic, deployment configs — they all compete for the same limited space. A 100K token codebase leaves zero room for the actual task.</p><h2 id="the-capability-ceiling" tabindex="-1">The Capability Ceiling <a class="header-anchor" href="#the-capability-ceiling" aria-label="Permalink to &quot;The Capability Ceiling&quot;"></a></h2><p>A generalist agent is mediocre at everything. A specialized agent — backend dev, security reviewer, UI designer — outperforms the generalist in its domain by a wide margin. You wouldn&#39;t ask your frontend dev to write SQL migrations. Why ask your agent to?</p><h2 id="the-reliability-ceiling" tabindex="-1">The Reliability Ceiling <a class="header-anchor" href="#the-reliability-ceiling" aria-label="Permalink to &quot;The Reliability Ceiling&quot;"></a></h2><p>One agent failing = everything fails. Multi-agent systems degrade gracefully. If the reviewer agent crashes, the builder keeps working. If the planner goes down, deployed agents continue running.</p><h2 id="the-solution-depth-2-delegation" tabindex="-1">The Solution: Depth-2 Delegation <a class="header-anchor" href="#the-solution-depth-2-delegation" aria-label="Permalink to &quot;The Solution: Depth-2 Delegation&quot;"></a></h2><p>The production-proven pattern:</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>User</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> v</span></span>
<span class="line"><span>Orchestrator (Opus-level, thinking only)</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> +-- Planning Team Lead</span></span>
<span class="line"><span> | +-- Product Manager (worker)</span></span>
<span class="line"><span> | +-- UX Researcher (worker)</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> +-- Engineering Team Lead</span></span>
<span class="line"><span> | +-- Frontend Dev (worker)</span></span>
<span class="line"><span> | +-- Backend Dev (worker)</span></span>
<span class="line"><span> |</span></span>
<span class="line"><span> +-- Validation Team Lead</span></span>
<span class="line"><span> +-- QA Engineer (worker)</span></span>
<span class="line"><span> +-- Security Reviewer (worker)</span></span></code></pre></div><p>Leads think, plan, and delegate. Workers execute. The orchestrator never touches code.</p><h2 id="when-to-go-multi-agent" tabindex="-1">When to Go Multi-Agent <a class="header-anchor" href="#when-to-go-multi-agent" aria-label="Permalink to &quot;When to Go Multi-Agent&quot;"></a></h2><p>You need multiple agents when any of these are true:</p><ul><li><strong>Different expertise required</strong> Your task needs a planner, a coder, a reviewer, and a security auditor</li><li><strong>Parallel work possible</strong> Multiple sub-tasks can run simultaneously</li><li><strong>Failure cost is high</strong> You want a second agent to catch mistakes before they ship</li><li><strong>Context exceeds one window</strong> Split across specialized agents</li></ul><p>If none of these are true, a single well-configured agent is simpler and cheaper.</p><hr><p><em>This is an excerpt from Module 4 of the <a href="/">Agentic Engineering Course</a>. The full module includes runnable lab code for building multi-agent systems with domain locking, mental models, and P2P communication.</em></p>`,19)])])}const u=n(i,[["render",o]]);export{d as __pageData,u as default};

View File

@ -1 +1 @@
import{c as n,Q as a,j as t,m as s}from"./chunks/framework.BPKcPtvA.js";const d=JSON.parse('{"title":"Why One Agent Is Not Enough","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/why-multi-agent.md","filePath":"blog/posts/why-multi-agent.md","lastUpdated":null}'),i={name:"blog/posts/why-multi-agent.md"};function l(o,e,r,p,h,g){return a(),t("div",null,[...e[0]||(e[0]=[s("",19)])])}const u=n(i,[["render",l]]);export{d as __pageData,u as default};
import{c as n,Q as a,j as t,m as s}from"./chunks/framework.BPKcPtvA.js";const d=JSON.parse('{"title":"Why One Agent Is Not Enough","description":"","frontmatter":{},"headers":[],"relativePath":"blog/posts/why-multi-agent.md","filePath":"blog/posts/why-multi-agent.md","lastUpdated":1780488246000}'),i={name:"blog/posts/why-multi-agent.md"};function o(l,e,r,p,h,g){return a(),t("div",null,[...e[0]||(e[0]=[s("",19)])])}const u=n(i,[["render",o]]);export{d as __pageData,u as default};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{c as t,Q as r,j as a,m as i}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"Buy","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md","lastUpdated":1780488246000}'),o={name:"buy.md"};function l(s,e,d,n,c,h){return r(),a("div",null,[...e[0]||(e[0]=[i("",16)])])}const p=t(o,[["render",l]]);export{f as __pageData,p as default};

View File

@ -1 +0,0 @@
import{c as e,Q as i,j as a,m as r}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Buy","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md","lastUpdated":null}'),o={name:"buy.md"};function l(d,t,s,n,c,h){return i(),a("div",null,[...t[0]||(t[0]=[r('<h1 id="buy" tabindex="-1">Buy <a class="header-anchor" href="#buy" aria-label="Permalink to &quot;Buy&quot;"></a></h1><h2 id="choose-your-tier" tabindex="-1">Choose Your Tier <a class="header-anchor" href="#choose-your-tier" aria-label="Permalink to &quot;Choose Your Tier&quot;"></a></h2><h3 id="self-paced-—-97" tabindex="-1">Self-Paced — $97 <a class="header-anchor" href="#self-paced-—-97" aria-label="Permalink to &quot;Self-Paced — $97&quot;"></a></h3><p>Best for independent learners.</p><ul><li>65 lessons across 8 modules</li><li>13 scaffolded labs with solutions</li><li>56 quiz questions with answer keys</li><li>20 production-ready SKILL.md files (7 kits)</li><li>Install scripts (PowerShell + bash)</li><li>Capstone reference implementation</li><li>Mock LLM for offline lab execution</li><li>Instant download (9 ZIP packages)</li></ul><h3 id="enterprise-—-199" tabindex="-1">Enterprise — $199 <a class="header-anchor" href="#enterprise-—-199" aria-label="Permalink to &quot;Enterprise — $199&quot;"></a></h3><p>Best for teams and organizations.</p><p>Everything in Self-Paced, plus:</p><ul><li>Private Discord channel</li><li>2 custom skills tailored to your stack</li><li>1-hour onboarding call</li><li>Priority updates for 1 year</li><li>Early access to new skill kits</li></ul><h3 id="cohort-—-247-next-cohort-tbd" tabindex="-1">Cohort — $247 (Next cohort: TBD) <a class="header-anchor" href="#cohort-—-247-next-cohort-tbd" aria-label="Permalink to &quot;Cohort — $247 (Next cohort: TBD)&quot;"></a></h3><p>Best for structured learning with deadlines.</p><p>Everything in Enterprise, plus:</p><ul><li>6-week structured schedule with weekly milestones</li><li>Weekly live office hours</li><li>Peer review of capstone project</li><li>Completion certificate</li><li>Cohort alumni network</li></ul><hr><h2 id="individual-skill-kits" tabindex="-1">Individual Skill Kits <a class="header-anchor" href="#individual-skill-kits" aria-label="Permalink to &quot;Individual Skill Kits&quot;"></a></h2><p>Not ready for the full course? Buy individual kits:</p><table tabindex="0"><thead><tr><th>Kit</th><th>Price</th><th>What&#39;s Included</th></tr></thead><tbody><tr><td>Security Foundation</td><td>$49</td><td>L3-L5 hooks, damage control, sandbox</td></tr><tr><td>Multi-Agent Orch.</td><td>$49</td><td>Teams, chains, mental models, domain locks</td></tr><tr><td>Verifier Pro</td><td>$39</td><td>Builder + verifier, claim decomposition</td></tr><tr><td>Task Discipline</td><td>$29</td><td>TillDone core + progress + nudge</td></tr><tr><td>Autoresearch</td><td>$39</td><td>Experiment loop, integrity guards</td></tr><tr><td>Observability</td><td>$29</td><td>SQLite tracing, cost tracking</td></tr><tr><td>CEO Board</td><td>$49</td><td>11 agent definitions + verifier</td></tr></tbody></table><hr><h2 id="certificate" tabindex="-1">Certificate <a class="header-anchor" href="#certificate" aria-label="Permalink to &quot;Certificate&quot;"></a></h2><p>Students who complete the capstone project receive a Certificate of Completion. The certificate verifies completion of 65 lessons, 13 labs, 56 quizzes, and a production-grade capstone project. Verify at <code>fdsa.agency/verify</code>.</p><hr><p><em>Questions? Contact artale@fdsa.agency</em></p>',22)])])}const f=e(o,[["render",l]]);export{p as __pageData,f as default};

View File

@ -1 +0,0 @@
import{c as e,Q as i,j as a,m as r}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Buy","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md","lastUpdated":null}'),o={name:"buy.md"};function l(d,t,s,n,c,h){return i(),a("div",null,[...t[0]||(t[0]=[r("",22)])])}const f=e(o,[["render",l]]);export{p as __pageData,f as default};

View File

@ -0,0 +1 @@
import{c as t,Q as a,j as r,m as o}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"Certificate of Completion","description":"","frontmatter":{},"headers":[],"relativePath":"certificate.md","filePath":"certificate.md","lastUpdated":1780488246000}'),n={name:"certificate.md"};function s(i,e,c,_,d,l){return a(),r("div",null,[...e[0]||(e[0]=[o('<h1 id="certificate-of-completion" tabindex="-1">Certificate of Completion <a class="header-anchor" href="#certificate-of-completion" aria-label="Permalink to &quot;Certificate of Completion&quot;"></a></h1><p>This certifies that</p><p><strong>________________________________</strong></p><p>has completed the</p><h2 id="fdsa-agentic-engineering-course" tabindex="-1">FDSA Agentic Engineering Course <a class="header-anchor" href="#fdsa-agentic-engineering-course" aria-label="Permalink to &quot;FDSA Agentic Engineering Course&quot;"></a></h2><p><strong>65 lessons across 8 modules</strong><strong>13 hands-on labs with starter code and solutions</strong><strong>56 quiz questions across 7 module checkpoints</strong><strong>20 production-ready SKILL.md files in 7 kits</strong><strong>Capstone: production-grade multi-agent system</strong></p><hr><p><em>Curriculum: Agent Harness (M1-M3), Software Factory (M4), Extensible Software (M2+M5), Always-On Agents (M7), Agentic Access (M2+M5), Tokenomics (M6). Framework-agnostic across Claude Code, Pi Agent, OpenCode, Hermes, and OpenClaw.</em></p><p><em>Verify at: <a href="https://fdsa.agency/verify" target="_blank" rel="noreferrer">https://fdsa.agency/verify</a></em></p>',9)])])}const g=t(n,[["render",s]]);export{f as __pageData,g as default};

View File

@ -0,0 +1 @@
import{c as t,Q as a,j as r,m as o}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"Certificate of Completion","description":"","frontmatter":{},"headers":[],"relativePath":"certificate.md","filePath":"certificate.md","lastUpdated":1780488246000}'),n={name:"certificate.md"};function s(i,e,c,_,d,l){return a(),r("div",null,[...e[0]||(e[0]=[o("",9)])])}const g=t(n,[["render",s]]);export{f as __pageData,g as default};

View File

@ -1 +0,0 @@
import{c as t,Q as a,j as r,m as n}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"Certificate of Completion","description":"","frontmatter":{},"headers":[],"relativePath":"certificate.md","filePath":"certificate.md","lastUpdated":null}'),o={name:"certificate.md"};function s(i,e,c,_,l,d){return a(),r("div",null,[...e[0]||(e[0]=[n('<h1 id="certificate-of-completion" tabindex="-1">Certificate of Completion <a class="header-anchor" href="#certificate-of-completion" aria-label="Permalink to &quot;Certificate of Completion&quot;"></a></h1><p>This certifies that</p><p><strong>________________________________</strong></p><p>has completed the</p><h2 id="fdsa-agentic-engineering-course" tabindex="-1">FDSA Agentic Engineering Course <a class="header-anchor" href="#fdsa-agentic-engineering-course" aria-label="Permalink to &quot;FDSA Agentic Engineering Course&quot;"></a></h2><p><strong>65 lessons across 8 modules</strong><strong>13 hands-on labs with starter code and solutions</strong><strong>56 quiz questions across 7 module checkpoints</strong><strong>20 production-ready SKILL.md files in 7 kits</strong><strong>Capstone: production-grade multi-agent system</strong></p><hr><p><em>Curriculum: Agent Harness (M1-M3), Software Factory (M4), Extensible Software (M2+M5), Always-On Agents (M7), Agentic Access (M2+M5), Tokenomics (M6). Framework-agnostic across Claude Code, Pi Agent, OpenCode, Hermes, and OpenClaw.</em></p><p><em>Verify at: <a href="https://fdsa.agency/verify" target="_blank" rel="noreferrer">https://fdsa.agency/verify</a></em></p>',9)])])}const g=t(o,[["render",s]]);export{f as __pageData,g as default};

View File

@ -1 +0,0 @@
import{c as t,Q as a,j as r,m as n}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"Certificate of Completion","description":"","frontmatter":{},"headers":[],"relativePath":"certificate.md","filePath":"certificate.md","lastUpdated":null}'),o={name:"certificate.md"};function s(i,e,c,_,l,d){return a(),r("div",null,[...e[0]||(e[0]=[n("",9)])])}const g=t(o,[["render",s]]);export{f as __pageData,g as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"Student Orientation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":null}'),i={name:"getting-started.md"};function l(o,t,r,d,h,p){return a(),s("div",null,[...t[0]||(t[0]=[n(`<h1 id="student-orientation-guide" tabindex="-1">Student Orientation Guide <a class="header-anchor" href="#student-orientation-guide" aria-label="Permalink to &quot;Student Orientation Guide&quot;"></a></h1><p>Welcome to the Agentic Engineering Course. This guide tells you exactly what to do first.</p><hr><h2 id="step-1-prerequisites-checklist" tabindex="-1">Step 1: Prerequisites Checklist <a class="header-anchor" href="#step-1-prerequisites-checklist" aria-label="Permalink to &quot;Step 1: Prerequisites Checklist&quot;"></a></h2><p>Before starting, ensure you have:</p><ul><li>[ ] <strong>Python 3.12+</strong> installed (<code>python --version</code>)</li><li>[ ] <strong>Git</strong> installed (<code>git --version</code>)</li><li>[ ] <strong>A text editor</strong> (VS Code recommended)</li><li>[ ] <strong>At least one API key</strong> (see API Keys section below)</li><li>[ ] <strong>Terminal</strong> (PowerShell on Windows, bash on Mac/Linux)</li></ul><h3 id="optional-install-later-when-needed" tabindex="-1">Optional (install later when needed) <a class="header-anchor" href="#optional-install-later-when-needed" aria-label="Permalink to &quot;Optional (install later when needed)&quot;"></a></h3><ul><li>[ ] <strong>Claude Code CLI</strong> — <code>npm install -g @anthropic/claude-code</code></li><li>[ ] <strong>Pi Agent CLI</strong> — <code>npm install -g pi-coding-agent</code></li><li>[ ] <strong>OpenCode CLI</strong> — <code>npm install -g @opencode/cli</code></li></ul><hr><h2 id="step-2-course-structure" tabindex="-1">Step 2: Course Structure <a class="header-anchor" href="#step-2-course-structure" aria-label="Permalink to &quot;Step 2: Course Structure&quot;"></a></h2><p>The course is organized into <strong>8 modules</strong> with <strong>13 labs</strong>:</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>course/</span></span>
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"Student Orientation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":1780488246000}'),i={name:"getting-started.md"};function l(o,t,r,d,h,p){return a(),s("div",null,[...t[0]||(t[0]=[n(`<h1 id="student-orientation-guide" tabindex="-1">Student Orientation Guide <a class="header-anchor" href="#student-orientation-guide" aria-label="Permalink to &quot;Student Orientation Guide&quot;"></a></h1><p>Welcome to the Agentic Engineering Course. This guide tells you exactly what to do first.</p><hr><h2 id="step-1-prerequisites-checklist" tabindex="-1">Step 1: Prerequisites Checklist <a class="header-anchor" href="#step-1-prerequisites-checklist" aria-label="Permalink to &quot;Step 1: Prerequisites Checklist&quot;"></a></h2><p>Before starting, ensure you have:</p><ul><li>[ ] <strong>Python 3.12+</strong> installed (<code>python --version</code>)</li><li>[ ] <strong>Git</strong> installed (<code>git --version</code>)</li><li>[ ] <strong>A text editor</strong> (VS Code recommended)</li><li>[ ] <strong>At least one API key</strong> (see API Keys section below)</li><li>[ ] <strong>Terminal</strong> (PowerShell on Windows, bash on Mac/Linux)</li></ul><h3 id="optional-install-later-when-needed" tabindex="-1">Optional (install later when needed) <a class="header-anchor" href="#optional-install-later-when-needed" aria-label="Permalink to &quot;Optional (install later when needed)&quot;"></a></h3><ul><li>[ ] <strong>Claude Code CLI</strong> — <code>npm install -g @anthropic/claude-code</code></li><li>[ ] <strong>Pi Agent CLI</strong> — <code>npm install -g pi-coding-agent</code></li><li>[ ] <strong>OpenCode CLI</strong> — <code>npm install -g @opencode/cli</code></li></ul><hr><h2 id="step-2-course-structure" tabindex="-1">Step 2: Course Structure <a class="header-anchor" href="#step-2-course-structure" aria-label="Permalink to &quot;Step 2: Course Structure&quot;"></a></h2><p>The course is organized into <strong>8 modules</strong> with <strong>13 labs</strong>:</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>course/</span></span>
<span class="line"><span> 00-CURRICULUM.md START HERE: Full lesson plan</span></span>
<span class="line"><span> M1-FOUNDATIONS.md START HERE: Module 1</span></span>
<span class="line"><span> M2-ARCHITECTURE.md</span></span>
@ -11,7 +11,7 @@ import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=
<span class="line"><span>2. Complete the lab exercise (labs/L1-first-agent/)</span></span>
<span class="line"><span>3. Take the quiz (ASSESSMENTS.md)</span></span>
<span class="line"><span>4. Move to next module</span></span></code></pre></div><hr><h2 id="step-3-your-first-lab" tabindex="-1">Step 3: Your First Lab <a class="header-anchor" href="#step-3-your-first-lab" aria-label="Permalink to &quot;Step 3: Your First Lab&quot;"></a></h2><p>Navigate to <code>labs/L1-first-agent/</code> and open <code>starter.py</code>:</p><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L1-first-agent/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><p><strong>Don&#39;t have an API key?</strong> The mock LLM client handles this automatically. Your code runs the same way with or without a real API key.</p><h3 id="lab-tips" tabindex="-1">Lab Tips <a class="header-anchor" href="#lab-tips" aria-label="Permalink to &quot;Lab Tips&quot;"></a></h3><ul><li>Each lab has <code>starter.py</code> (fill in the blanks) and <code>solution.py</code> (reference answer)</li><li>Try the starter first. Look at the solution only when stuck</li><li>The <code>reasoning</code> parameter on every tool call is not optional it&#39;s a course requirement</li><li>Always set <code>MAX_ITERATIONS</code> to prevent infinite loops</li></ul><hr><h2 id="step-4-install-skills-optional" tabindex="-1">Step 4: Install Skills (Optional) <a class="header-anchor" href="#step-4-install-skills-optional" aria-label="Permalink to &quot;Step 4: Install Skills (Optional)&quot;"></a></h2><p>After completing Module 3 (Security), install the skill kits:</p><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;"># Windows</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><p><strong>Don&#39;t have an API key?</strong> The mock LLM client handles this automatically. Your code runs the same way with or without a real API key.</p><h3 id="lab-tips" tabindex="-1">Lab Tips <a class="header-anchor" href="#lab-tips" aria-label="Permalink to &quot;Lab Tips&quot;"></a></h3><ul><li>Each lab has <code>starter.py</code> (fill in the blanks) and <code>solution.py</code> (reference answer)</li><li>Try the starter first. Look at the solution only when stuck</li><li>The <code>reasoning</code> parameter on every tool call is not optional it&#39;s a course requirement</li><li>Always set <code>MAX_ITERATIONS</code> to prevent infinite loops</li></ul><hr><h2 id="step-4-install-skills-optional" tabindex="-1">Step 4: Install Skills (Optional) <a class="header-anchor" href="#step-4-install-skills-optional" aria-label="Permalink to &quot;Step 4: Install Skills (Optional)&quot;"></a></h2><p>After completing Module 3 (Security), install the skill kits:</p><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;"># Windows</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">powershell</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -File</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install.ps1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Mac/Linux</span></span>

View File

@ -1 +1 @@
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"Student Orientation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":null}'),i={name:"getting-started.md"};function l(o,t,r,d,h,p){return a(),s("div",null,[...t[0]||(t[0]=[n("",38)])])}const g=e(i,[["render",l]]);export{u as __pageData,g as default};
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"Student Orientation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":1780488246000}'),i={name:"getting-started.md"};function l(o,t,r,d,h,p){return a(),s("div",null,[...t[0]||(t[0]=[n("",38)])])}const g=e(i,[["render",l]]);export{u as __pageData,g as default};

View File

@ -1 +0,0 @@
import{c as e,Q as t,j as a}from"./chunks/framework.BPKcPtvA.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"LandingLayout"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function o(r,d,s,c,i,p){return t(),a("div")}const m=e(n,[["render",o]]);export{_ as __pageData,m as default};

View File

@ -1 +0,0 @@
import{c as e,Q as t,j as a}from"./chunks/framework.BPKcPtvA.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"LandingLayout"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function o(r,d,s,c,i,p){return t(),a("div")}const m=e(n,[["render",o]]);export{_ as __pageData,m as default};

View File

@ -0,0 +1 @@
import{c as e,Q as t,j as a}from"./chunks/framework.BPKcPtvA.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"LandingLayout"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1780488246000}'),n={name:"index.md"};function o(r,d,s,c,i,p){return t(),a("div")}const m=e(n,[["render",o]]);export{l as __pageData,m as default};

View File

@ -0,0 +1 @@
import{c as e,Q as t,j as a}from"./chunks/framework.BPKcPtvA.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"LandingLayout"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1780488246000}'),n={name:"index.md"};function o(r,d,s,c,i,p){return t(),a("div")}const m=e(n,[["render",o]]);export{l as __pageData,m as default};

View File

@ -0,0 +1,11 @@
import{c as a,Q as i,j as s,m as e}from"./chunks/framework.BPKcPtvA.js";const k=JSON.parse('{"title":"Labs Overview","description":"","frontmatter":{},"headers":[],"relativePath":"labs/index.md","filePath":"labs/index.md","lastUpdated":1780488246000}'),n={name:"labs/index.md"};function l(d,t,r,h,o,p){return i(),s("div",null,[...t[0]||(t[0]=[e(`<h1 id="labs-overview" tabindex="-1">Labs Overview <a class="header-anchor" href="#labs-overview" aria-label="Permalink to &quot;Labs Overview&quot;"></a></h1><p>13 hands-on labs covering the full agentic engineering stack. Each lab has a <code>starter.py</code> (fill in the blanks) and <code>solution.py</code> (reference answer).</p><h2 id="lab-index" tabindex="-1">Lab Index <a class="header-anchor" href="#lab-index" aria-label="Permalink to &quot;Lab Index&quot;"></a></h2><table tabindex="0"><thead><tr><th>Lab</th><th>Module</th><th>Topic</th><th>Est. Time</th></tr></thead><tbody><tr><td><a href="/labs/l1-first-agent">L1: First Agent</a></td><td>M1</td><td>Single-tool agent from scratch</td><td>60 min</td></tr><tr><td><a href="/labs/l2-multi-tool">L2a: Multi-Tool Agent</a></td><td>M2</td><td>File ops + web search</td><td>75 min</td></tr><tr><td><a href="/labs/l2-context">L2b: Context-Aware</a></td><td>M2</td><td>Sliding window + summarization</td><td>60 min</td></tr><tr><td><a href="/labs/l3-whitelist-hook">L3a: Whitelist Hook</a></td><td>M3</td><td>L4 security implementation</td><td>60 min</td></tr><tr><td><a href="/labs/l3-verifier">L3b: Verifier Agent</a></td><td>M3</td><td>Read-only verification</td><td>75 min</td></tr><tr><td><a href="/labs/l4-agent-chain">L4a: Agent Chain</a></td><td>M4</td><td>YAML pipeline</td><td>60 min</td></tr><tr><td><a href="/labs/l4-multi-team">L4b: Multi-Team</a></td><td>M4</td><td>Team config + domain locking</td><td>90 min</td></tr><tr><td><a href="/labs/l5-observability">L5a: Observability</a></td><td>M5</td><td>SQLite tool tracing</td><td>60 min</td></tr><tr><td><a href="/labs/l5-cicd">L5b: CI/CD</a></td><td>M5</td><td>Golden dataset + regression gate</td><td>60 min</td></tr><tr><td><a href="/labs/l6-eval-harness">L6a: Eval Harness</a></td><td>M6</td><td>pass@k evaluation</td><td>60 min</td></tr><tr><td><a href="/labs/l6-cost-optimization">L6b: Cost Optimization</a></td><td>M6</td><td>Cascade routing</td><td>45 min</td></tr><tr><td><a href="/labs/l7-autoresearch">L7a: Autoresearch</a></td><td>M7</td><td>Self-improving experiment loop</td><td>75 min</td></tr><tr><td><a href="/labs/l7-meta-agent">L7b: Meta-Agent</a></td><td>M7</td><td>Agent that builds agents</td><td>60 min</td></tr></tbody></table><h2 id="running-labs" tabindex="-1">Running Labs <a class="header-anchor" href="#running-labs" aria-label="Permalink to &quot;Running Labs&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L1-first-agent/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Without API key (uses mock LLM automatically):</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># With API key:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ANTHROPIC_API_KEY</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sk-ant-...&quot;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Check solution after attempting:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> solution.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><h2 id="lab-structure" tabindex="-1">Lab Structure <a class="header-anchor" href="#lab-structure" aria-label="Permalink to &quot;Lab Structure&quot;"></a></h2><p>Each lab has:</p><ul><li><code>starter.py</code> Code skeleton with TODO markers</li><li><code>solution.py</code> Complete reference implementation</li><li>No additional files needed all labs are self-contained</li></ul><h2 id="offline-mode" tabindex="-1">Offline Mode <a class="header-anchor" href="#offline-mode" aria-label="Permalink to &quot;Offline Mode&quot;"></a></h2><p>All labs include automatic mock LLM fallback. No API keys required. The mock client returns realistic, deterministic responses so you can verify your code logic without paying for API calls.</p>`,11)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};

View File

@ -0,0 +1 @@
import{c as a,Q as i,j as s,m as e}from"./chunks/framework.BPKcPtvA.js";const k=JSON.parse('{"title":"Labs Overview","description":"","frontmatter":{},"headers":[],"relativePath":"labs/index.md","filePath":"labs/index.md","lastUpdated":1780488246000}'),n={name:"labs/index.md"};function l(d,t,r,h,o,p){return i(),s("div",null,[...t[0]||(t[0]=[e("",11)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};

View File

@ -1,11 +0,0 @@
import{c as a,Q as i,j as s,m as e}from"./chunks/framework.BPKcPtvA.js";const k=JSON.parse('{"title":"Labs Overview","description":"","frontmatter":{},"headers":[],"relativePath":"labs/index.md","filePath":"labs/index.md","lastUpdated":null}'),n={name:"labs/index.md"};function l(d,t,r,h,o,p){return i(),s("div",null,[...t[0]||(t[0]=[e(`<h1 id="labs-overview" tabindex="-1">Labs Overview <a class="header-anchor" href="#labs-overview" aria-label="Permalink to &quot;Labs Overview&quot;"></a></h1><p>13 hands-on labs covering the full agentic engineering stack. Each lab has a <code>starter.py</code> (fill in the blanks) and <code>solution.py</code> (reference answer).</p><h2 id="lab-index" tabindex="-1">Lab Index <a class="header-anchor" href="#lab-index" aria-label="Permalink to &quot;Lab Index&quot;"></a></h2><table tabindex="0"><thead><tr><th>Lab</th><th>Module</th><th>Topic</th><th>Est. Time</th></tr></thead><tbody><tr><td><a href="/labs/l1-first-agent">L1: First Agent</a></td><td>M1</td><td>Single-tool agent from scratch</td><td>60 min</td></tr><tr><td><a href="/labs/l2-multi-tool">L2a: Multi-Tool Agent</a></td><td>M2</td><td>File ops + web search</td><td>75 min</td></tr><tr><td><a href="/labs/l2-context">L2b: Context-Aware</a></td><td>M2</td><td>Sliding window + summarization</td><td>60 min</td></tr><tr><td><a href="/labs/l3-whitelist-hook">L3a: Whitelist Hook</a></td><td>M3</td><td>L4 security implementation</td><td>60 min</td></tr><tr><td><a href="/labs/l3-verifier">L3b: Verifier Agent</a></td><td>M3</td><td>Read-only verification</td><td>75 min</td></tr><tr><td><a href="/labs/l4-agent-chain">L4a: Agent Chain</a></td><td>M4</td><td>YAML pipeline</td><td>60 min</td></tr><tr><td><a href="/labs/l4-multi-team">L4b: Multi-Team</a></td><td>M4</td><td>Team config + domain locking</td><td>90 min</td></tr><tr><td><a href="/labs/l5-observability">L5a: Observability</a></td><td>M5</td><td>SQLite tool tracing</td><td>60 min</td></tr><tr><td><a href="/labs/l5-cicd">L5b: CI/CD</a></td><td>M5</td><td>Golden dataset + regression gate</td><td>60 min</td></tr><tr><td><a href="/labs/l6-eval-harness">L6a: Eval Harness</a></td><td>M6</td><td>pass@k evaluation</td><td>60 min</td></tr><tr><td><a href="/labs/l6-cost-optimization">L6b: Cost Optimization</a></td><td>M6</td><td>Cascade routing</td><td>45 min</td></tr><tr><td><a href="/labs/l7-autoresearch">L7a: Autoresearch</a></td><td>M7</td><td>Self-improving experiment loop</td><td>75 min</td></tr><tr><td><a href="/labs/l7-meta-agent">L7b: Meta-Agent</a></td><td>M7</td><td>Agent that builds agents</td><td>60 min</td></tr></tbody></table><h2 id="running-labs" tabindex="-1">Running Labs <a class="header-anchor" href="#running-labs" aria-label="Permalink to &quot;Running Labs&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L1-first-agent/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Without API key (uses mock LLM automatically):</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># With API key:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ANTHROPIC_API_KEY</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sk-ant-...&quot;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Check solution after attempting:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> solution.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><h2 id="lab-structure" tabindex="-1">Lab Structure <a class="header-anchor" href="#lab-structure" aria-label="Permalink to &quot;Lab Structure&quot;"></a></h2><p>Each lab has:</p><ul><li><code>starter.py</code> Code skeleton with TODO markers</li><li><code>solution.py</code> Complete reference implementation</li><li>No additional files needed all labs are self-contained</li></ul><h2 id="offline-mode" tabindex="-1">Offline Mode <a class="header-anchor" href="#offline-mode" aria-label="Permalink to &quot;Offline Mode&quot;"></a></h2><p>All labs include automatic mock LLM fallback. No API keys required. The mock client returns realistic, deterministic responses so you can verify your code logic without paying for API calls.</p>`,11)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};

View File

@ -1 +0,0 @@
import{c as a,Q as i,j as s,m as e}from"./chunks/framework.BPKcPtvA.js";const k=JSON.parse('{"title":"Labs Overview","description":"","frontmatter":{},"headers":[],"relativePath":"labs/index.md","filePath":"labs/index.md","lastUpdated":null}'),n={name:"labs/index.md"};function l(d,t,r,h,o,p){return i(),s("div",null,[...t[0]||(t[0]=[e("",11)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};

View File

@ -1,2 +1,2 @@
import{c as t,Q as a,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L1: Your First Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l1-first-agent.md","filePath":"labs/l1-first-agent.md","lastUpdated":null}'),o={name:"labs/l1-first-agent.md"};function l(n,e,r,h,c,d){return a(),i("div",null,[...e[0]||(e[0]=[s(`<h1 id="l1-your-first-agent" tabindex="-1">L1: Your First Agent <a class="header-anchor" href="#l1-your-first-agent" aria-label="Permalink to &quot;L1: Your First Agent&quot;"></a></h1><p>Build a single-tool agent from scratch.</p><p><strong>Module</strong>: M1 Foundations<br><strong>Est. Time</strong>: 60 min<br><strong>Files</strong>: <code>starter.py</code>, <code>solution.py</code></p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create an agent that reads a file and answers questions about its contents.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><ul><li>LLM + Tools + Loop = Agent</li><li>Tool definition with input schema</li><li>The agent loop (think → act → observe → repeat)</li><li>The <code>reasoning</code> parameter</li></ul><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L1-first-agent/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><p>The starter has TODO markers where you fill in:</p><ol><li>Define the <code>read_file</code> tool schema</li><li>Implement the <code>execute_tool</code> function</li><li>Implement the <code>run_agent</code> loop</li><li>Wire up the main entry point</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><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:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> solution.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> data.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><p>Compare your implementation against the solution. Key differences to check:</p><ul><li>Did you set <code>MAX_ITERATIONS</code>?</li><li>Does every tool call include <code>reasoning</code>?</li><li>Does the loop terminate on <code>end_turn</code>?</li></ul><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Tool call is made correctly (schema matches)</li><li>Tool result is fed back to the LLM</li><li>LLM produces final answer using tool result</li><li>Loop terminates (doesn&#39;t run forever)</li></ol>`,17)])])}const k=t(o,[["render",l]]);export{u as __pageData,k as default};
import{c as t,Q as a,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L1: Your First Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l1-first-agent.md","filePath":"labs/l1-first-agent.md","lastUpdated":1780488246000}'),o={name:"labs/l1-first-agent.md"};function l(n,e,r,h,c,p){return a(),i("div",null,[...e[0]||(e[0]=[s(`<h1 id="l1-your-first-agent" tabindex="-1">L1: Your First Agent <a class="header-anchor" href="#l1-your-first-agent" aria-label="Permalink to &quot;L1: Your First Agent&quot;"></a></h1><p>Build a single-tool agent from scratch.</p><p><strong>Module</strong>: M1 Foundations<br><strong>Est. Time</strong>: 60 min<br><strong>Files</strong>: <code>starter.py</code>, <code>solution.py</code></p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create an agent that reads a file and answers questions about its contents.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><ul><li>LLM + Tools + Loop = Agent</li><li>Tool definition with input schema</li><li>The agent loop (think → act → observe → repeat)</li><li>The <code>reasoning</code> parameter</li></ul><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L1-first-agent/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><p>The starter has TODO markers where you fill in:</p><ol><li>Define the <code>read_file</code> tool schema</li><li>Implement the <code>execute_tool</code> function</li><li>Implement the <code>run_agent</code> loop</li><li>Wire up the main entry point</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><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:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> solution.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;What is this file about?&quot;</span></span></code></pre></div><p>Compare your implementation against the solution. Key differences to check:</p><ul><li>Did you set <code>MAX_ITERATIONS</code>?</li><li>Does every tool call include <code>reasoning</code>?</li><li>Does the loop terminate on <code>end_turn</code>?</li></ul><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Tool call is made correctly (schema matches)</li><li>Tool result is fed back to the LLM</li><li>LLM produces final answer using tool result</li><li>Loop terminates (doesn&#39;t run forever)</li></ol>`,17)])])}const k=t(o,[["render",l]]);export{u as __pageData,k as default};

View File

@ -1 +1 @@
import{c as t,Q as a,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L1: Your First Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l1-first-agent.md","filePath":"labs/l1-first-agent.md","lastUpdated":null}'),o={name:"labs/l1-first-agent.md"};function l(n,e,r,h,c,d){return a(),i("div",null,[...e[0]||(e[0]=[s("",17)])])}const k=t(o,[["render",l]]);export{u as __pageData,k as default};
import{c as t,Q as a,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L1: Your First Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l1-first-agent.md","filePath":"labs/l1-first-agent.md","lastUpdated":1780488246000}'),o={name:"labs/l1-first-agent.md"};function l(n,e,r,h,c,p){return a(),i("div",null,[...e[0]||(e[0]=[s("",17)])])}const k=t(o,[["render",l]]);export{u as __pageData,k as default};

View File

@ -1,2 +0,0 @@
import{c as t,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2b: Context-Aware Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-context.md","filePath":"labs/l2-context.md","lastUpdated":null}'),i={name:"labs/l2-context.md"};function o(l,e,r,c,h,d){return a(),s("div",null,[...e[0]||(e[0]=[n(`<h1 id="l2b-context-aware-agent" tabindex="-1">L2b: Context-Aware Agent <a class="header-anchor" href="#l2b-context-aware-agent" aria-label="Permalink to &quot;L2b: Context-Aware Agent&quot;"></a></h1><p><strong>Module</strong>: M2 Architecture<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Implement sliding window + summarization for long agent sessions.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l2-context/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Build a ContextManager class</li><li>Implement max_recent_turns sliding window</li><li>Summarize old messages when window exceeds limit</li><li>Build context from summary + recent messages</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const m=t(i,[["render",o]]);export{u as __pageData,m as default};

View File

@ -0,0 +1,2 @@
import{c as t,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2b: Context-Aware Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-context.md","filePath":"labs/l2-context.md","lastUpdated":1780488246000}'),i={name:"labs/l2-context.md"};function o(l,e,r,c,h,d){return a(),s("div",null,[...e[0]||(e[0]=[n(`<h1 id="l2b-context-aware-agent" tabindex="-1">L2b: Context-Aware Agent <a class="header-anchor" href="#l2b-context-aware-agent" aria-label="Permalink to &quot;L2b: Context-Aware Agent&quot;"></a></h1><p><strong>Module</strong>: M2 Architecture<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Implement sliding window + summarization for long agent sessions.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l2-context/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Build a ContextManager class</li><li>Implement max_recent_turns sliding window</li><li>Summarize old messages when window exceeds limit</li><li>Build context from summary + recent messages</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const m=t(i,[["render",o]]);export{u as __pageData,m as default};

View File

@ -1 +1 @@
import{c as t,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2b: Context-Aware Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-context.md","filePath":"labs/l2-context.md","lastUpdated":null}'),i={name:"labs/l2-context.md"};function o(l,e,r,c,h,d){return a(),s("div",null,[...e[0]||(e[0]=[n("",12)])])}const m=t(i,[["render",o]]);export{u as __pageData,m as default};
import{c as t,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2b: Context-Aware Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-context.md","filePath":"labs/l2-context.md","lastUpdated":1780488246000}'),i={name:"labs/l2-context.md"};function o(l,e,r,c,h,d){return a(),s("div",null,[...e[0]||(e[0]=[n("",12)])])}const m=t(i,[["render",o]]);export{u as __pageData,m as default};

View File

@ -0,0 +1,2 @@
import{c as t,Q as a,j as o,m as l}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2a: Multi-Tool Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-multi-tool.md","filePath":"labs/l2-multi-tool.md","lastUpdated":1780488246000}'),i={name:"labs/l2-multi-tool.md"};function s(n,e,r,c,h,p){return a(),o("div",null,[...e[0]||(e[0]=[l(`<h1 id="l2a-multi-tool-agent" tabindex="-1">L2a: Multi-Tool Agent <a class="header-anchor" href="#l2a-multi-tool-agent" aria-label="Permalink to &quot;L2a: Multi-Tool Agent&quot;"></a></h1><p><strong>Module</strong>: M2 Architecture<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Add file operations AND web search to your agent.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l2-multi-tool/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define a read_file tool schema</li><li>Define a search_web tool (DuckDuckGo or similar)</li><li>Define a write_file tool</li><li>Implement execute_tool for all three</li><li>Run the agent loop with tool result feedback</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=t(i,[["render",s]]);export{u as __pageData,b as default};

View File

@ -0,0 +1 @@
import{c as t,Q as a,j as o,m as l}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2a: Multi-Tool Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-multi-tool.md","filePath":"labs/l2-multi-tool.md","lastUpdated":1780488246000}'),i={name:"labs/l2-multi-tool.md"};function s(n,e,r,c,h,p){return a(),o("div",null,[...e[0]||(e[0]=[l("",12)])])}const b=t(i,[["render",s]]);export{u as __pageData,b as default};

View File

@ -1,2 +0,0 @@
import{c as t,Q as a,j as l,m as o}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2a: Multi-Tool Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-multi-tool.md","filePath":"labs/l2-multi-tool.md","lastUpdated":null}'),i={name:"labs/l2-multi-tool.md"};function s(n,e,r,c,h,p){return a(),l("div",null,[...e[0]||(e[0]=[o(`<h1 id="l2a-multi-tool-agent" tabindex="-1">L2a: Multi-Tool Agent <a class="header-anchor" href="#l2a-multi-tool-agent" aria-label="Permalink to &quot;L2a: Multi-Tool Agent&quot;"></a></h1><p><strong>Module</strong>: M2 Architecture<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Add file operations AND web search to your agent.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l2-multi-tool/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define a read_file tool schema</li><li>Define a search_web tool (DuckDuckGo or similar)</li><li>Define a write_file tool</li><li>Implement execute_tool for all three</li><li>Run the agent loop with tool result feedback</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=t(i,[["render",s]]);export{u as __pageData,b as default};

View File

@ -1 +0,0 @@
import{c as t,Q as a,j as l,m as o}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L2a: Multi-Tool Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l2-multi-tool.md","filePath":"labs/l2-multi-tool.md","lastUpdated":null}'),i={name:"labs/l2-multi-tool.md"};function s(n,e,r,c,h,p){return a(),l("div",null,[...e[0]||(e[0]=[o("",12)])])}const b=t(i,[["render",s]]);export{u as __pageData,b as default};

View File

@ -1,2 +0,0 @@
import{c as a,Q as t,j as i,m as r}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"L3b: Verifier Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-verifier.md","filePath":"labs/l3-verifier.md","lastUpdated":null}'),l={name:"labs/l3-verifier.md"};function s(o,e,n,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[r(`<h1 id="l3b-verifier-agent" tabindex="-1">L3b: Verifier Agent <a class="header-anchor" href="#l3b-verifier-agent" aria-label="Permalink to &quot;L3b: Verifier Agent&quot;"></a></h1><p><strong>Module</strong>: M3 Safety<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create a read-only agent that checks the builder&#39;s work independently.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l3-verifier/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define read-only tools (read_file, grep_search, list_files)</li><li>Implement claim verification logic</li><li>Report confidence level (PERFECT through FAILED)</li><li>No write/edit/bash tools allowed</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=a(l,[["render",s]]);export{f as __pageData,b as default};

View File

@ -1 +0,0 @@
import{c as a,Q as t,j as i,m as r}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"L3b: Verifier Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-verifier.md","filePath":"labs/l3-verifier.md","lastUpdated":null}'),l={name:"labs/l3-verifier.md"};function s(o,e,n,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[r("",12)])])}const b=a(l,[["render",s]]);export{f as __pageData,b as default};

View File

@ -0,0 +1,2 @@
import{c as a,Q as t,j as i,m as r}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"L3b: Verifier Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-verifier.md","filePath":"labs/l3-verifier.md","lastUpdated":1780488246000}'),s={name:"labs/l3-verifier.md"};function l(o,e,n,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[r(`<h1 id="l3b-verifier-agent" tabindex="-1">L3b: Verifier Agent <a class="header-anchor" href="#l3b-verifier-agent" aria-label="Permalink to &quot;L3b: Verifier Agent&quot;"></a></h1><p><strong>Module</strong>: M3 Safety<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create a read-only agent that checks the builder&#39;s work independently.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l3-verifier/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define read-only tools (read_file, grep_search, list_files)</li><li>Implement claim verification logic</li><li>Report confidence level (PERFECT through FAILED)</li><li>No write/edit/bash tools allowed</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=a(s,[["render",l]]);export{f as __pageData,b as default};

View File

@ -0,0 +1 @@
import{c as a,Q as t,j as i,m as r}from"./chunks/framework.BPKcPtvA.js";const f=JSON.parse('{"title":"L3b: Verifier Agent","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-verifier.md","filePath":"labs/l3-verifier.md","lastUpdated":1780488246000}'),s={name:"labs/l3-verifier.md"};function l(o,e,n,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[r("",12)])])}const b=a(s,[["render",l]]);export{f as __pageData,b as default};

View File

@ -1,4 +1,4 @@
import{c as a,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L3a: L4 Whitelist Hook","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-whitelist-hook.md","filePath":"labs/l3-whitelist-hook.md","lastUpdated":null}'),l={name:"labs/l3-whitelist-hook.md"};function n(o,e,r,p,h,c){return s(),t("div",null,[...e[0]||(e[0]=[i(`<h1 id="l3a-l4-whitelist-hook" tabindex="-1">L3a: L4 Whitelist Hook <a class="header-anchor" href="#l3a-l4-whitelist-hook" aria-label="Permalink to &quot;L3a: L4 Whitelist Hook&quot;"></a></h1><p>Implement a production-grade L4 security whitelist hook.</p><p><strong>Module</strong>: M3 Safety &amp; Security<br><strong>Est. Time</strong>: 60 min<br><strong>Files</strong>: <code>starter.py</code>, <code>solution.py</code></p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Block ALL bash commands except 10 safelisted patterns. This prevents the L3 marque break (agent writing and running scripts).</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><ul><li>L4 whitelist (architectural security)</li><li>Regex pattern matching</li><li>Compound shell operator detection</li><li>Defense in depth</li></ul><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L3-whitelist-hook/</span></span>
import{c as a,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L3a: L4 Whitelist Hook","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-whitelist-hook.md","filePath":"labs/l3-whitelist-hook.md","lastUpdated":1780488246000}'),l={name:"labs/l3-whitelist-hook.md"};function n(o,e,r,p,h,c){return s(),t("div",null,[...e[0]||(e[0]=[i(`<h1 id="l3a-l4-whitelist-hook" tabindex="-1">L3a: L4 Whitelist Hook <a class="header-anchor" href="#l3a-l4-whitelist-hook" aria-label="Permalink to &quot;L3a: L4 Whitelist Hook&quot;"></a></h1><p>Implement a production-grade L4 security whitelist hook.</p><p><strong>Module</strong>: M3 Safety &amp; Security<br><strong>Est. Time</strong>: 60 min<br><strong>Files</strong>: <code>starter.py</code>, <code>solution.py</code></p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Block ALL bash commands except 10 safelisted patterns. This prevents the L3 marque break (agent writing and running scripts).</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><ul><li>L4 whitelist (architectural security)</li><li>Regex pattern matching</li><li>Compound shell operator detection</li><li>Defense in depth</li></ul><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L3-whitelist-hook/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span></span></code></pre></div><p>The starter has:</p><ol><li>A safelist patterns list (currently empty)</li><li>A compound operators detector (currently empty)</li><li>A whitelist check function (currently TODO)</li><li>Test cases for both ALLOWED and BLOCKED commands</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><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:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> solution.py</span></span></code></pre></div><h2 id="key-design-rules" tabindex="-1">Key Design Rules <a class="header-anchor" href="#key-design-rules" aria-label="Permalink to &quot;Key Design Rules&quot;"></a></h2><ol><li>Pin specific scripts: <code>^npm test$</code> not <code>^npm .*$</code></li><li>Never pattern-match an interpreter: <code>^python .*$</code> allows running any script</li><li>Block compound operators before regex</li><li>Audit log all blocks</li></ol><h2 id="test-cases" tabindex="-1">Test Cases <a class="header-anchor" href="#test-cases" aria-label="Permalink to &quot;Test Cases&quot;"></a></h2><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>npm test ALLOW</span></span>
<span class="line"><span>git status ALLOW</span></span>
<span class="line"><span>rm -rf target/ BLOCK</span></span>

View File

@ -1 +1 @@
import{c as a,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L3a: L4 Whitelist Hook","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-whitelist-hook.md","filePath":"labs/l3-whitelist-hook.md","lastUpdated":null}'),l={name:"labs/l3-whitelist-hook.md"};function n(o,e,r,p,h,c){return s(),t("div",null,[...e[0]||(e[0]=[i("",17)])])}const k=a(l,[["render",n]]);export{u as __pageData,k as default};
import{c as a,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L3a: L4 Whitelist Hook","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l3-whitelist-hook.md","filePath":"labs/l3-whitelist-hook.md","lastUpdated":1780488246000}'),l={name:"labs/l3-whitelist-hook.md"};function n(o,e,r,p,h,c){return s(),t("div",null,[...e[0]||(e[0]=[i("",17)])])}const k=a(l,[["render",n]]);export{u as __pageData,k as default};

View File

@ -1,2 +0,0 @@
import{c as a,Q as t,j as i,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L4a: Agent Chain","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-agent-chain.md","filePath":"labs/l4-agent-chain.md","lastUpdated":null}'),s={name:"labs/l4-agent-chain.md"};function l(r,e,o,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[n(`<h1 id="l4a-agent-chain" tabindex="-1">L4a: Agent Chain <a class="header-anchor" href="#l4a-agent-chain" aria-label="Permalink to &quot;L4a: Agent Chain&quot;"></a></h1><p><strong>Module</strong>: M4 Orchestration<br><strong>Files</strong>: starter.yaml, solution.yaml</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create a YAML-defined plan-build-review-verify pipeline.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l4-agent-chain/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define planner step with output format requirements</li><li>Define builder step with implementation rules</li><li>Define reviewer step with checklist criteria</li><li>Define verifier step with confidence reporting</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=a(s,[["render",l]]);export{u as __pageData,b as default};

View File

@ -0,0 +1,2 @@
import{c as a,Q as t,j as i,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L4a: Agent Chain","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-agent-chain.md","filePath":"labs/l4-agent-chain.md","lastUpdated":1780488246000}'),s={name:"labs/l4-agent-chain.md"};function r(l,e,o,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[n(`<h1 id="l4a-agent-chain" tabindex="-1">L4a: Agent Chain <a class="header-anchor" href="#l4a-agent-chain" aria-label="Permalink to &quot;L4a: Agent Chain&quot;"></a></h1><p><strong>Module</strong>: M4 Orchestration<br><strong>Files</strong>: starter.yaml, solution.yaml</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create a YAML-defined plan-build-review-verify pipeline.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l4-agent-chain/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define planner step with output format requirements</li><li>Define builder step with implementation rules</li><li>Define reviewer step with checklist criteria</li><li>Define verifier step with confidence reporting</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=a(s,[["render",r]]);export{u as __pageData,b as default};

View File

@ -1 +1 @@
import{c as a,Q as t,j as i,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L4a: Agent Chain","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-agent-chain.md","filePath":"labs/l4-agent-chain.md","lastUpdated":null}'),s={name:"labs/l4-agent-chain.md"};function l(r,e,o,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[n("",12)])])}const b=a(s,[["render",l]]);export{u as __pageData,b as default};
import{c as a,Q as t,j as i,m as n}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L4a: Agent Chain","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-agent-chain.md","filePath":"labs/l4-agent-chain.md","lastUpdated":1780488246000}'),s={name:"labs/l4-agent-chain.md"};function r(l,e,o,h,c,p){return t(),i("div",null,[...e[0]||(e[0]=[n("",12)])])}const b=a(s,[["render",r]]);export{u as __pageData,b as default};

View File

@ -0,0 +1,2 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"L4b: Multi-Team Config","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-multi-team.md","filePath":"labs/l4-multi-team.md","lastUpdated":1780488246000}'),o={name:"labs/l4-multi-team.md"};function l(n,e,r,c,h,p){return t(),i("div",null,[...e[0]||(e[0]=[s(`<h1 id="l4b-multi-team-config" tabindex="-1">L4b: Multi-Team Config <a class="header-anchor" href="#l4b-multi-team-config" aria-label="Permalink to &quot;L4b: Multi-Team Config&quot;"></a></h1><p><strong>Module</strong>: M4 Orchestration<br><strong>Files</strong>: starter-config.yaml, solution-config.yaml</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Set up orchestrator + 2 teams with domain locking.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l4-multi-team/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define orchestrator with delegate-only tools</li><li>Configure Engineering team with lead + members</li><li>Configure Validation team with domain permissions</li><li>Set per-agent permissions (read/upsert/delete scope)</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const u=a(o,[["render",l]]);export{m as __pageData,u as default};

View File

@ -1 +1 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"L4b: Multi-Team Config","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-multi-team.md","filePath":"labs/l4-multi-team.md","lastUpdated":null}'),o={name:"labs/l4-multi-team.md"};function l(n,e,r,c,h,p){return t(),i("div",null,[...e[0]||(e[0]=[s("",12)])])}const u=a(o,[["render",l]]);export{m as __pageData,u as default};
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"L4b: Multi-Team Config","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-multi-team.md","filePath":"labs/l4-multi-team.md","lastUpdated":1780488246000}'),o={name:"labs/l4-multi-team.md"};function l(n,e,r,c,h,p){return t(),i("div",null,[...e[0]||(e[0]=[s("",12)])])}const u=a(o,[["render",l]]);export{m as __pageData,u as default};

View File

@ -1,2 +0,0 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const m=JSON.parse('{"title":"L4b: Multi-Team Config","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l4-multi-team.md","filePath":"labs/l4-multi-team.md","lastUpdated":null}'),o={name:"labs/l4-multi-team.md"};function l(n,e,r,c,h,p){return t(),i("div",null,[...e[0]||(e[0]=[s(`<h1 id="l4b-multi-team-config" tabindex="-1">L4b: Multi-Team Config <a class="header-anchor" href="#l4b-multi-team-config" aria-label="Permalink to &quot;L4b: Multi-Team Config&quot;"></a></h1><p><strong>Module</strong>: M4 Orchestration<br><strong>Files</strong>: starter-config.yaml, solution-config.yaml</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Set up orchestrator + 2 teams with domain locking.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l4-multi-team/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define orchestrator with delegate-only tools</li><li>Configure Engineering team with lead + members</li><li>Configure Validation team with domain permissions</li><li>Set per-agent permissions (read/upsert/delete scope)</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const u=a(o,[["render",l]]);export{m as __pageData,u as default};

View File

@ -1,2 +0,0 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L5b: CI/CD Pipeline","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-cicd.md","filePath":"labs/l5-cicd.md","lastUpdated":null}'),l={name:"labs/l5-cicd.md"};function o(n,e,r,c,p,d){return t(),i("div",null,[...e[0]||(e[0]=[s(`<h1 id="l5b-ci-cd-pipeline" tabindex="-1">L5b: CI/CD Pipeline <a class="header-anchor" href="#l5b-ci-cd-pipeline" aria-label="Permalink to &quot;L5b: CI/CD Pipeline&quot;"></a></h1><p><strong>Module</strong>: M5 Production<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create golden dataset + automated regression gate.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l5-cicd/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define golden test cases (input, expected tools, expected output)</li><li>Implement score_case evaluation function</li><li>Run pass@k evaluation (k=1, 3, 5)</li><li>Gate deployment on pass rate threshold</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=a(l,[["render",o]]);export{u as __pageData,b as default};

View File

@ -1 +0,0 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L5b: CI/CD Pipeline","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-cicd.md","filePath":"labs/l5-cicd.md","lastUpdated":null}'),l={name:"labs/l5-cicd.md"};function o(n,e,r,c,p,d){return t(),i("div",null,[...e[0]||(e[0]=[s("",12)])])}const b=a(l,[["render",o]]);export{u as __pageData,b as default};

View File

@ -0,0 +1,2 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L5b: CI/CD Pipeline","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-cicd.md","filePath":"labs/l5-cicd.md","lastUpdated":1780488246000}'),o={name:"labs/l5-cicd.md"};function l(n,e,r,c,p,d){return t(),i("div",null,[...e[0]||(e[0]=[s(`<h1 id="l5b-ci-cd-pipeline" tabindex="-1">L5b: CI/CD Pipeline <a class="header-anchor" href="#l5b-ci-cd-pipeline" aria-label="Permalink to &quot;L5b: CI/CD Pipeline&quot;"></a></h1><p><strong>Module</strong>: M5 Production<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create golden dataset + automated regression gate.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l5-cicd/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define golden test cases (input, expected tools, expected output)</li><li>Implement score_case evaluation function</li><li>Run pass@k evaluation (k=1, 3, 5)</li><li>Gate deployment on pass rate threshold</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=a(o,[["render",l]]);export{u as __pageData,b as default};

View File

@ -0,0 +1 @@
import{c as a,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L5b: CI/CD Pipeline","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-cicd.md","filePath":"labs/l5-cicd.md","lastUpdated":1780488246000}'),o={name:"labs/l5-cicd.md"};function l(n,e,r,c,p,d){return t(),i("div",null,[...e[0]||(e[0]=[s("",12)])])}const b=a(o,[["render",l]]);export{u as __pageData,b as default};

View File

@ -0,0 +1,2 @@
import{c as e,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const b=JSON.parse('{"title":"L5a: Observability","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-observability.md","filePath":"labs/l5-observability.md","lastUpdated":1780488246000}'),l={name:"labs/l5-observability.md"};function o(r,a,n,c,h,p){return t(),i("div",null,[...a[0]||(a[0]=[s(`<h1 id="l5a-observability" tabindex="-1">L5a: Observability <a class="header-anchor" href="#l5a-observability" aria-label="Permalink to &quot;L5a: Observability&quot;"></a></h1><p><strong>Module</strong>: M5 Production<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Trace every tool call + LLM completion to SQLite.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l5-observability/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define SQLite schema for tool_calls and llm_completions</li><li>Implement ObservabilityTracker class</li><li>Log tool calls with params, result, duration</li><li>Log LLM completions with token counts and cost</li><li>Generate session summary report</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const u=e(l,[["render",o]]);export{b as __pageData,u as default};

View File

@ -1 +1 @@
import{c as e,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const b=JSON.parse('{"title":"L5a: Observability","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-observability.md","filePath":"labs/l5-observability.md","lastUpdated":null}'),l={name:"labs/l5-observability.md"};function o(r,a,n,c,h,p){return t(),i("div",null,[...a[0]||(a[0]=[s("",12)])])}const u=e(l,[["render",o]]);export{b as __pageData,u as default};
import{c as e,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const b=JSON.parse('{"title":"L5a: Observability","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-observability.md","filePath":"labs/l5-observability.md","lastUpdated":1780488246000}'),l={name:"labs/l5-observability.md"};function o(r,a,n,c,h,p){return t(),i("div",null,[...a[0]||(a[0]=[s("",12)])])}const u=e(l,[["render",o]]);export{b as __pageData,u as default};

View File

@ -1,2 +0,0 @@
import{c as e,Q as t,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const b=JSON.parse('{"title":"L5a: Observability","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l5-observability.md","filePath":"labs/l5-observability.md","lastUpdated":null}'),l={name:"labs/l5-observability.md"};function o(r,a,n,c,h,p){return t(),i("div",null,[...a[0]||(a[0]=[s(`<h1 id="l5a-observability" tabindex="-1">L5a: Observability <a class="header-anchor" href="#l5a-observability" aria-label="Permalink to &quot;L5a: Observability&quot;"></a></h1><p><strong>Module</strong>: M5 Production<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Trace every tool call + LLM completion to SQLite.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l5-observability/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define SQLite schema for tool_calls and llm_completions</li><li>Implement ObservabilityTracker class</li><li>Log tool calls with params, result, duration</li><li>Log LLM completions with token counts and cost</li><li>Generate session summary report</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const u=e(l,[["render",o]]);export{b as __pageData,u as default};

View File

@ -0,0 +1,2 @@
import{c as a,Q as e,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6b: Cost Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-cost-optimization.md","filePath":"labs/l6-cost-optimization.md","lastUpdated":1780488246000}'),o={name:"labs/l6-cost-optimization.md"};function n(l,t,r,p,c,h){return e(),i("div",null,[...t[0]||(t[0]=[s(`<h1 id="l6b-cost-optimization" tabindex="-1">L6b: Cost Optimization <a class="header-anchor" href="#l6b-cost-optimization" aria-label="Permalink to &quot;L6b: Cost Optimization&quot;"></a></h1><p><strong>Module</strong>: M6 Economics<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Profile a session, find savings, implement cascade routing.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l6-cost-optimization/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define model cost profiles (input/output $/M tokens)</li><li>Calculate all-Opus session cost</li><li>Implement cascade routing map (Flash/Sonnet/Opus by task)</li><li>Calculate savings percentage</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const m=a(o,[["render",n]]);export{u as __pageData,m as default};

View File

@ -1 +1 @@
import{c as a,Q as e,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6b: Cost Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-cost-optimization.md","filePath":"labs/l6-cost-optimization.md","lastUpdated":null}'),o={name:"labs/l6-cost-optimization.md"};function n(l,t,r,p,c,h){return e(),i("div",null,[...t[0]||(t[0]=[s("",12)])])}const m=a(o,[["render",n]]);export{u as __pageData,m as default};
import{c as a,Q as e,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6b: Cost Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-cost-optimization.md","filePath":"labs/l6-cost-optimization.md","lastUpdated":1780488246000}'),o={name:"labs/l6-cost-optimization.md"};function n(l,t,r,p,c,h){return e(),i("div",null,[...t[0]||(t[0]=[s("",12)])])}const m=a(o,[["render",n]]);export{u as __pageData,m as default};

View File

@ -1,2 +0,0 @@
import{c as a,Q as e,j as i,m as s}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6b: Cost Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-cost-optimization.md","filePath":"labs/l6-cost-optimization.md","lastUpdated":null}'),o={name:"labs/l6-cost-optimization.md"};function n(l,t,r,p,c,h){return e(),i("div",null,[...t[0]||(t[0]=[s(`<h1 id="l6b-cost-optimization" tabindex="-1">L6b: Cost Optimization <a class="header-anchor" href="#l6b-cost-optimization" aria-label="Permalink to &quot;L6b: Cost Optimization&quot;"></a></h1><p><strong>Module</strong>: M6 Economics<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Profile a session, find savings, implement cascade routing.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l6-cost-optimization/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define model cost profiles (input/output $/M tokens)</li><li>Calculate all-Opus session cost</li><li>Implement cascade routing map (Flash/Sonnet/Opus by task)</li><li>Calculate savings percentage</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const m=a(o,[["render",n]]);export{u as __pageData,m as default};

View File

@ -0,0 +1,2 @@
import{c as e,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6a: Eval Harness","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-eval-harness.md","filePath":"labs/l6-eval-harness.md","lastUpdated":1780488246000}'),l={name:"labs/l6-eval-harness.md"};function n(o,a,r,c,p,h){return s(),t("div",null,[...a[0]||(a[0]=[i(`<h1 id="l6a-eval-harness" tabindex="-1">L6a: Eval Harness <a class="header-anchor" href="#l6a-eval-harness" aria-label="Permalink to &quot;L6a: Eval Harness&quot;"></a></h1><p><strong>Module</strong>: M6 Economics<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Build golden Q&amp;A pairs + pass@k scoring system.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l6-eval-harness/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define 10+ test cases with tool and output expectations</li><li>Implement EvalHarness class with score_case</li><li>Compute pass@1, pass@3, pass@5 metrics</li><li>Support weighted scoring by case importance</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=e(l,[["render",n]]);export{u as __pageData,b as default};

View File

@ -1 +1 @@
import{c as e,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6a: Eval Harness","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-eval-harness.md","filePath":"labs/l6-eval-harness.md","lastUpdated":null}'),l={name:"labs/l6-eval-harness.md"};function n(o,a,r,c,p,h){return s(),t("div",null,[...a[0]||(a[0]=[i("",12)])])}const b=e(l,[["render",n]]);export{u as __pageData,b as default};
import{c as e,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6a: Eval Harness","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-eval-harness.md","filePath":"labs/l6-eval-harness.md","lastUpdated":1780488246000}'),l={name:"labs/l6-eval-harness.md"};function n(o,a,r,c,p,h){return s(),t("div",null,[...a[0]||(a[0]=[i("",12)])])}const b=e(l,[["render",n]]);export{u as __pageData,b as default};

View File

@ -1,2 +0,0 @@
import{c as e,Q as s,j as t,m as i}from"./chunks/framework.BPKcPtvA.js";const u=JSON.parse('{"title":"L6a: Eval Harness","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l6-eval-harness.md","filePath":"labs/l6-eval-harness.md","lastUpdated":null}'),l={name:"labs/l6-eval-harness.md"};function n(o,a,r,c,p,h){return s(),t("div",null,[...a[0]||(a[0]=[i(`<h1 id="l6a-eval-harness" tabindex="-1">L6a: Eval Harness <a class="header-anchor" href="#l6a-eval-harness" aria-label="Permalink to &quot;L6a: Eval Harness&quot;"></a></h1><p><strong>Module</strong>: M6 Economics<br><strong>Files</strong>: starter.py, solution.py</p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Build golden Q&amp;A pairs + pass@k scoring system.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><p>Refer to the corresponding module for full concept explanations.</p><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/l6-eval-harness/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Open starter file and fill in the TODOs</span></span></code></pre></div><h2 id="checkpoints" tabindex="-1">Checkpoints <a class="header-anchor" href="#checkpoints" aria-label="Permalink to &quot;Checkpoints&quot;"></a></h2><ol><li>Define 10+ test cases with tool and output expectations</li><li>Implement EvalHarness class with score_case</li><li>Compute pass@1, pass@3, pass@5 metrics</li><li>Support weighted scoring by case importance</li></ol><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>Compare against the solution file after attempting the starter.</p>`,12)])])}const b=e(l,[["render",n]]);export{u as __pageData,b as default};

View File

@ -1,4 +1,4 @@
import{c as i,Q as a,j as t,m as e}from"./chunks/framework.BPKcPtvA.js";const E=JSON.parse('{"title":"L7a: Autoresearch Loop","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l7-autoresearch.md","filePath":"labs/l7-autoresearch.md","lastUpdated":null}'),h={name:"labs/l7-autoresearch.md"};function n(l,s,k,r,p,o){return a(),t("div",null,[...s[0]||(s[0]=[e(`<h1 id="l7a-autoresearch-loop" tabindex="-1">L7a: Autoresearch Loop <a class="header-anchor" href="#l7a-autoresearch-loop" aria-label="Permalink to &quot;L7a: Autoresearch Loop&quot;"></a></h1><p>Build a self-improving agent with integrity guards.</p><p><strong>Module</strong>: M7 Advanced Topics<br><strong>Est. Time</strong>: 75 min<br><strong>Files</strong>: <code>starter.py</code>, <code>solution.py</code></p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create an agent that runs experiments, measures its own performance, logs results, and decides whether to keep or discard each change.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><ul><li>Autoresearch: run → measure → log → decide</li><li>Code hashing to detect grinding</li><li>Median vs best comparison</li><li>Reward hack defense</li></ul><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L7-autoresearch/</span></span>
import{c as i,Q as a,j as t,m as e}from"./chunks/framework.BPKcPtvA.js";const E=JSON.parse('{"title":"L7a: Autoresearch Loop","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l7-autoresearch.md","filePath":"labs/l7-autoresearch.md","lastUpdated":1780488246000}'),h={name:"labs/l7-autoresearch.md"};function n(l,s,k,r,p,o){return a(),t("div",null,[...s[0]||(s[0]=[e(`<h1 id="l7a-autoresearch-loop" tabindex="-1">L7a: Autoresearch Loop <a class="header-anchor" href="#l7a-autoresearch-loop" aria-label="Permalink to &quot;L7a: Autoresearch Loop&quot;"></a></h1><p>Build a self-improving agent with integrity guards.</p><p><strong>Module</strong>: M7 Advanced Topics<br><strong>Est. Time</strong>: 75 min<br><strong>Files</strong>: <code>starter.py</code>, <code>solution.py</code></p><h2 id="objective" tabindex="-1">Objective <a class="header-anchor" href="#objective" aria-label="Permalink to &quot;Objective&quot;"></a></h2><p>Create an agent that runs experiments, measures its own performance, logs results, and decides whether to keep or discard each change.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to &quot;Concepts&quot;"></a></h2><ul><li>Autoresearch: run → measure → log → decide</li><li>Code hashing to detect grinding</li><li>Median vs best comparison</li><li>Reward hack defense</li></ul><h2 id="starter" tabindex="-1">Starter <a class="header-anchor" href="#starter" aria-label="Permalink to &quot;Starter&quot;"></a></h2><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:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> course/labs/L7-autoresearch/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> starter.py</span></span></code></pre></div><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><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:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> solution.py</span></span></code></pre></div><h2 id="experiment-log-format" tabindex="-1">Experiment Log Format <a class="header-anchor" href="#experiment-log-format" aria-label="Permalink to &quot;Experiment Log Format&quot;"></a></h2><div class="language-jsonl vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">jsonl</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 style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;run&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;status&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;baseline&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;metric&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;latency&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;value&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">52</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;unit&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;ms&quot;</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;">&quot;run&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;status&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;keep&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;metric&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;latency&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;value&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">46</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;deltaPct&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">-11.5</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;">&quot;run&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;status&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;discard&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;metric&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;latency&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;value&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">53</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;deltaPct&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1.9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h2 id="integrity-guards" tabindex="-1">Integrity Guards <a class="header-anchor" href="#integrity-guards" aria-label="Permalink to &quot;Integrity Guards&quot;"></a></h2><table tabindex="0"><thead><tr><th>Threat</th><th>Detection</th><th>Prevention</th></tr></thead><tbody><tr><td>Grinding (same code re-run)</td><td>Code hash comparison</td><td>Skip run</td></tr><tr><td>Noise-chasing</td><td>Median vs best comparison</td><td>Use median, not best</td></tr><tr><td>Reward hacking</td><td>Timing function isolation</td><td>Verify computation not shortcut</td></tr><tr><td>Test set leakage</td><td>Test data hash verification</td><td>Assert data unchanged</td></tr></tbody></table>`,15)])])}const u=i(h,[["render",n]]);export{E as __pageData,u as default};

View File

@ -1 +1 @@
import{c as i,Q as a,j as t,m as e}from"./chunks/framework.BPKcPtvA.js";const E=JSON.parse('{"title":"L7a: Autoresearch Loop","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l7-autoresearch.md","filePath":"labs/l7-autoresearch.md","lastUpdated":null}'),h={name:"labs/l7-autoresearch.md"};function n(l,s,k,r,p,o){return a(),t("div",null,[...s[0]||(s[0]=[e("",15)])])}const u=i(h,[["render",n]]);export{E as __pageData,u as default};
import{c as i,Q as a,j as t,m as e}from"./chunks/framework.BPKcPtvA.js";const E=JSON.parse('{"title":"L7a: Autoresearch Loop","description":"","frontmatter":{},"headers":[],"relativePath":"labs/l7-autoresearch.md","filePath":"labs/l7-autoresearch.md","lastUpdated":1780488246000}'),h={name:"labs/l7-autoresearch.md"};function n(l,s,k,r,p,o){return a(),t("div",null,[...s[0]||(s[0]=[e("",15)])])}const u=i(h,[["render",n]]);export{E as __pageData,u as default};

Some files were not shown because too many files have changed in this diff Show More