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:
parent
2ef158da40
commit
3d81a11f41
Binary file not shown.
|
|
@ -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?"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
```
|
||||
|
|
@ -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
|
||||
```
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "API Key Setup Guide""></a></h1><p>Every lab needs at least one LLM API key. If you don'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 "Quick Start: Use the Mock LLM (No Key Needed)""></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;"> "Summarize this file"</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 "Provider Keys""></a></h2><h3 id="anthropic-claude-—-recommended" tabindex="-1">Anthropic (Claude) — Recommended <a class="header-anchor" href="#anthropic-claude-—-recommended" aria-label="Permalink to "Anthropic (Claude) — Recommended""></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 "API Key Setup Guide""></a></h1><p>Every lab needs at least one LLM API key. If you don'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 "Quick Start: Use the Mock LLM (No Key Needed)""></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;"> "Summarize this file"</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 "Provider Keys""></a></h2><h3 id="anthropic-claude-—-recommended" tabindex="-1">Anthropic (Claude) — Recommended <a class="header-anchor" href="#anthropic-claude-—-recommended" aria-label="Permalink to "Anthropic (Claude) — Recommended""></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;">"sk-ant-..."</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Mac/Linux</span></span>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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};
|
||||
|
|
@ -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 "Cascade Routing: Cut Your API Costs by 66%""></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 "The Price Range""></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 "The Cascade Pattern""></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 -> 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 "Cascade Routing: Cut Your API Costs by 66%""></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 "The Price Range""></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 "The Cascade Pattern""></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 -> Gemini Flash ($0.15/$0.60)</span></span>
|
||||
<span class="line"><span>Analyze data -> Claude Sonnet ($3/$15)</span></span>
|
||||
<span class="line"><span>Make decision -> Claude Opus ($15/$75)</span></span>
|
||||
<span class="line"><span>Format output -> 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 "The Savings""></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 "Implementation""></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;">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||||
|
|
@ -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};
|
||||
1
site/.vitepress/dist/assets/blog_posts_choosing-security-level.md.BibZder6.js
vendored
Normal file
1
site/.vitepress/dist/assets/blog_posts_choosing-security-level.md.BibZder6.js
vendored
Normal 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 "Choosing Your Security Level""></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 "The Decision Table""></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 "Level 1-2: When You Can Get Away With It""></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. "Most" 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 "Level 3: The Minimum for Production Code""></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 "python cleanup.py" 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 "Level 4: The Sweet Spot""></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 "Level 5: The Gold Standard""></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 "Rule of Thumb""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Choosing Your Security Level""></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 "The Decision Table""></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 "Level 1-2: When You Can Get Away With It""></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. "Most" 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 "Level 3: The Minimum for Production Code""></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 "python cleanup.py" 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 "Level 4: The Sweet Spot""></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 "Level 5: The Gold Standard""></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 "Rule of Thumb""></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};
|
||||
|
|
@ -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 "Agent Memory: Mental Models That Compound""></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 "What a Mental Model Is""></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 "Agent Memory: Mental Models That Compound""></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 "What a Mental Model Is""></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;">"API patterns"</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;">"We use tRPC for type-safe API calls"</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;">"src/server/routers/*.ts"</span></span>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "The Repo Is the Spec""></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 "The Problem""></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 "ask Bob," you fail. If the answer is "read CLAUDE.md in the repo," 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 "What the Repo Should Contain""></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 "The Repo Is the Spec""></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 "The Problem""></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 "ask Bob," you fail. If the answer is "read CLAUDE.md in the repo," 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 "What the Repo Should Contain""></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>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "The 6-Level Security Ladder""></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's a <strong>63.4% chance of catastrophe over 100 turns</strong>. This isn't theoretical — it's the actual threat model for every agent in production.</p><p>Most engineers stop at Level 2 (system prompt rules) and think they're safe. They're not. Here'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 "Level 0: ACIP (Prompt Injection Defense)""></a></h2><p>Before bash security, there's prompt injection. An attacker can trick the agent into ignoring its instructions through:</p><ul><li>Direct injection ("ignore previous instructions")</li><li>Indirect injection (malicious content in web pages the agent reads)</li><li>Role-playing bypasses ("you are now a free AI")</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'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 "Level 1-2: Theatre (Skills + System Prompts)""></a></h2><p>These levels ask the model to behave. They work most of the time on frontier models. But "most of the time" 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 "Level 3: Blacklist Hook""></a></h2><p>A regex blacklist intercepts dangerous commands before execution. It catches <code>rm -rf /</code> directly. But here'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: "Clean up the target directory"</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 "The 6-Level Security Ladder""></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's a <strong>63.4% chance of catastrophe over 100 turns</strong>. This isn't theoretical — it's the actual threat model for every agent in production.</p><p>Most engineers stop at Level 2 (system prompt rules) and think they're safe. They're not. Here'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 "Level 0: ACIP (Prompt Injection Defense)""></a></h2><p>Before bash security, there's prompt injection. An attacker can trick the agent into ignoring its instructions through:</p><ul><li>Direct injection ("ignore previous instructions")</li><li>Indirect injection (malicious content in web pages the agent reads)</li><li>Role-playing bypasses ("you are now a free AI")</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'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 "Level 1-2: Theatre (Skills + System Prompts)""></a></h2><p>These levels ask the model to behave. They work most of the time on frontier models. But "most of the time" 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 "Level 3: Blacklist Hook""></a></h2><p>A regex blacklist intercepts dangerous commands before execution. It catches <code>rm -rf /</code> directly. But here'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: "Clean up the target directory"</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: "python cleanup.py" (not in blacklist)</span></span>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "The 3x Rule of Agent Costs""></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 "Why the Multiplier Exists""></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 "Where the Cost Goes""></a></h2><p>Output tokens dominate — about 70% of total cost. The model'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 "Quick Estimation""></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 "The 3x Rule of Agent Costs""></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 "Why the Multiplier Exists""></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 "Where the Cost Goes""></a></h2><p>Output tokens dominate — about 70% of total cost. The model'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 "Quick Estimation""></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;"> "prototype"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: base,</span></span>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "The Verifier Pattern""></a></h1><p><strong>May 26, 2026</strong></p><p>Here's the problem: engineers spend roughly half their day reviewing agent output. Every "I created the table," "I added the foreign key," "I applied the migration" 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 "Architecture""></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---> 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 "The Verifier Pattern""></a></h1><p><strong>June 8, 2026</strong></p><p>Here's the problem: engineers spend roughly half their day reviewing agent output. Every "I created the table," "I added the foreign key," "I applied the migration" 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 "Architecture""></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---> 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>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Vibe Coding vs Agentic Engineering""></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 "The 5 Hard Rules""></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 "python cleanup.py."</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 "The Practical Difference""></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 "The Karpathy Framing""></a></h2><p>At Sequoia Ascent 2026, Andrej Karpathy said: "Vibe coding raises the floor. Agentic engineering raises the ceiling." 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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Vibe Coding vs Agentic Engineering""></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 "The 5 Hard Rules""></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 "python cleanup.py."</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 "The Practical Difference""></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 "The Karpathy Framing""></a></h2><p>At Sequoia Ascent 2026, Andrej Karpathy said: "Vibe coding raises the floor. Agentic engineering raises the ceiling." 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};
|
||||
|
|
@ -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 "What Is an AI Agent, Really?""></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 "The Three Components""></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 "What Each Combination Gives You""></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 "The Loop in Pseudocode""></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 "What Is an AI Agent, Really?""></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 "The Three Components""></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 "What Each Combination Gives You""></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 "The Loop in Pseudocode""></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>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Why One Agent Is Not Enough""></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 "The Context Ceiling""></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 "The Capability Ceiling""></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'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 "The Reliability Ceiling""></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 "The Solution: Depth-2 Delegation""></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 "When to Go Multi-Agent""></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};
|
||||
|
|
@ -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 "Why One Agent Is Not Enough""></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 "The Context Ceiling""></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 "The Capability Ceiling""></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'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 "The Reliability Ceiling""></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 "The Solution: Depth-2 Delegation""></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 "When to Go Multi-Agent""></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};
|
||||
|
|
@ -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
|
|
@ -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};
|
||||
|
|
@ -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 "Buy""></a></h1><h2 id="choose-your-tier" tabindex="-1">Choose Your Tier <a class="header-anchor" href="#choose-your-tier" aria-label="Permalink to "Choose Your Tier""></a></h2><h3 id="self-paced-—-97" tabindex="-1">Self-Paced — $97 <a class="header-anchor" href="#self-paced-—-97" aria-label="Permalink to "Self-Paced — $97""></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 "Enterprise — $199""></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 "Cohort — $247 (Next cohort: TBD)""></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 "Individual Skill Kits""></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'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 "Certificate""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Certificate of Completion""></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 "FDSA Agentic Engineering Course""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Certificate of Completion""></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 "FDSA Agentic Engineering Course""></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};
|
||||
|
|
@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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 "Student Orientation Guide""></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 "Step 1: Prerequisites Checklist""></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 "Optional (install later when needed)""></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 "Step 2: Course Structure""></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 "Student Orientation Guide""></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 "Step 1: Prerequisites Checklist""></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 "Optional (install later when needed)""></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 "Step 2: Course Structure""></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 "Step 3: Your First Lab""></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;"> "What is this file about?"</span></span></code></pre></div><p><strong>Don'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 "Lab Tips""></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'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 "Step 4: Install Skills (Optional)""></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;"> "What is this file about?"</span></span></code></pre></div><p><strong>Don'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 "Lab Tips""></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'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 "Step 4: Install Skills (Optional)""></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>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Labs Overview""></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 "Lab Index""></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 "Running Labs""></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;"> "What is this file about?"</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;">"sk-ant-..."</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;"> "What is this file about?"</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;"> "What is this file about?"</span></span></code></pre></div><h2 id="lab-structure" tabindex="-1">Lab Structure <a class="header-anchor" href="#lab-structure" aria-label="Permalink to "Lab Structure""></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 "Offline Mode""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "Labs Overview""></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 "Lab Index""></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 "Running Labs""></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;"> "What is this file about?"</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;">"sk-ant-..."</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;"> "What is this file about?"</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;"> "What is this file about?"</span></span></code></pre></div><h2 id="lab-structure" tabindex="-1">Lab Structure <a class="header-anchor" href="#lab-structure" aria-label="Permalink to "Lab Structure""></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 "Offline Mode""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L1: Your First Agent""></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 "Objective""></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 "Concepts""></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 "Starter""></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;"> "What is this file about?"</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 "Solution""></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;"> "What is this file about?"</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 "Checkpoints""></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'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 "L1: Your First Agent""></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 "Objective""></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 "Concepts""></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 "Starter""></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;"> "What is this file about?"</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 "Solution""></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;"> "What is this file about?"</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 "Checkpoints""></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't run forever)</li></ol>`,17)])])}const k=t(o,[["render",l]]);export{u as __pageData,k as default};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L2b: Context-Aware Agent""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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 "L2b: Context-Aware Agent""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L2a: Multi-Tool Agent""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L2a: Multi-Tool Agent""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L3b: Verifier Agent""></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 "Objective""></a></h2><p>Create a read-only agent that checks the builder's work independently.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L3b: Verifier Agent""></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 "Objective""></a></h2><p>Create a read-only agent that checks the builder's work independently.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L3a: L4 Whitelist Hook""></a></h1><p>Implement a production-grade L4 security whitelist hook.</p><p><strong>Module</strong>: M3 Safety & 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 "Objective""></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 "Concepts""></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 "Starter""></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 "L3a: L4 Whitelist Hook""></a></h1><p>Implement a production-grade L4 security whitelist hook.</p><p><strong>Module</strong>: M3 Safety & 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 "Objective""></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 "Concepts""></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 "Starter""></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 "Solution""></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 "Key Design Rules""></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 "Test Cases""></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>
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L4a: Agent Chain""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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 "L4a: Agent Chain""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L4b: Multi-Team Config""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L4b: Multi-Team Config""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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 "L5b: CI/CD Pipeline""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L5b: CI/CD Pipeline""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L5a: Observability""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L5a: Observability""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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 "L6b: Cost Optimization""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L6b: Cost Optimization""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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 "L6a: Eval Harness""></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 "Objective""></a></h2><p>Build golden Q&A pairs + pass@k scoring system.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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 "L6a: Eval Harness""></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 "Objective""></a></h2><p>Build golden Q&A pairs + pass@k scoring system.</p><h2 id="concepts" tabindex="-1">Concepts <a class="header-anchor" href="#concepts" aria-label="Permalink to "Concepts""></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 "Starter""></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 "Checkpoints""></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 "Solution""></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};
|
||||
|
|
@ -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 "L7a: Autoresearch Loop""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "L7a: Autoresearch Loop""></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 "Objective""></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 "Concepts""></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 "Starter""></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 "Solution""></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 "Experiment Log Format""></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;">"run"</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;">"status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"baseline"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"metric"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"latency"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"value"</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;">"unit"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"ms"</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;">"run"</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;">"status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"keep"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"metric"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"latency"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"value"</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;">"deltaPct"</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;">"run"</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;">"status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"discard"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"metric"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"latency"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"value"</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;">"deltaPct"</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 "Integrity Guards""></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};
|
||||
|
|
@ -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
Loading…
Reference in New Issue