feat: filled gaps - instructor bio, email capture, free preview, deeper M7, better mock responses, realistic lab data

This commit is contained in:
artale 2026-06-03 15:05:06 +02:00
parent c378e326b0
commit dce30b50a3
73 changed files with 482 additions and 233 deletions

View File

@ -1,5 +1,17 @@
This is a test file for Lab 1.7: Your First Agent.
It contains sample data for the agent to read and summarize.
Line 1: Hello world
Line 2: The quick brown fox jumps over the lazy dog
Line 3: 42 is the answer to everything
This is a sample log file from a production agent system running on 2026-05-15.
It contains session traces, tool calls, and timing data.
Session ID: sess_abc123
Date: 2026-05-15T14:30:00Z
Model: claude-sonnet-4-20260501
[14:30:01] AGENT INITIALIZED — Task: "Analyze the latest deployment log"
[14:30:02] TOOL CALL: read_file(path="logs/deploy-2026-05-15.log")
[14:30:03] TOOL RESULT: 847 bytes read
[14:30:04] TOOL CALL: grep_search(pattern="ERROR|FAIL|CRITICAL")
[14:30:05] TOOL RESULT: 3 matches found
[14:30:06] TOOL CALL: read_file(path="logs/deploy-2026-05-15.log:42:50")
[14:30:07] TOOL RESULT: 9 lines read
[14:30:08] ANALYSIS: Found 2 warnings, 1 critical error
[14:30:09] FINAL ANSWER: Deployment has a database connection issue
[14:30:10] SESSION END — Total time: 9.2s, Total cost: $0.042

View File

@ -0,0 +1,26 @@
{
"app_name": "AgentMonitor",
"version": "2.4.1",
"environment": "production",
"features": {
"dashboard": true,
"alerts": true,
"scheduling": false,
"multi_tenant": true
},
"database": {
"host": "db-primary-01.example.com",
"port": 5432,
"pool_size": 20,
"timeout_ms": 5000
},
"api_keys": [
{ "service": "openai", "key": "sk-...prod...", "quota": 1000000 },
{ "service": "anthropic", "key": "sk-ant-...prod...", "quota": 500000 }
],
"logging": {
"level": "INFO",
"format": "json",
"sink": "cloudwatch"
}
}

View File

@ -133,9 +133,17 @@ def _generate_text_response(prompt: str) -> str:
prompt_lower = prompt.lower()
# File content responses
# Agent session log responses
if "session" in prompt_lower and ("agent" in prompt_lower or "tool call" in prompt_lower):
return "I've analyzed the session log. Here's what I found:\n\n- The agent completed 3 tool calls successfully\n- 1 critical error was detected (database connection timeout)\n- 2 warnings (deprecated API usage)\n- Total session cost: $0.042\n- Recommendation: Check the database connection pool settings"
# File content responses - extract what the file is about
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?"
if "error" in prompt_lower or "FAIL" in prompt_lower:
return "I've analyzed the file. It contains session trace data from a production agent deployment. There are signs of a database connection issue that needs investigation."
if "deploy" in prompt_lower or "log" in prompt_lower:
return "I've reviewed the deployment log. The system ran 3 tool calls successfully with one critical error. The root cause appears to be a database timeout."
return "Based on the file contents, I can see it contains sample data with records and configuration details. The key patterns I identified are structured around standard formats."
# Search result responses
if "search" in prompt_lower and ("result" in prompt_lower or "found" in prompt_lower):

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{R as p}from"./chunks/theme.DOzU43nI.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.C5-KOWho.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

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

View File

@ -0,0 +1,3 @@
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Free Preview: Lesson 1.1 — What Makes an Agent?","description":"","frontmatter":{},"headers":[],"relativePath":"free-preview.md","filePath":"free-preview.md","lastUpdated":null}'),o={name:"free-preview.md"};function i(r,t,d,l,h,c){return a(),s("div",null,[...t[0]||(t[0]=[n(`<h1 id="free-preview-lesson-1-1-—-what-makes-an-agent" tabindex="-1">Free Preview: Lesson 1.1 — What Makes an Agent? <a class="header-anchor" href="#free-preview-lesson-1-1-—-what-makes-an-agent" aria-label="Permalink to &quot;Free Preview: Lesson 1.1 — What Makes an Agent?&quot;"></a></h1><p>This is a sample lesson from <strong>Module 1: Foundations</strong> of the FDSA Agentic Engineering Course. Full course includes 65 lessons, 13 labs, and 20 skill kits.</p><hr><h2 id="lesson-1-1-what-makes-an-agent" tabindex="-1">Lesson 1.1: What Makes an Agent? <a class="header-anchor" href="#lesson-1-1-what-makes-an-agent" aria-label="Permalink to &quot;Lesson 1.1: What Makes an Agent?&quot;"></a></h2><p><strong>Definition</strong>: An AI agent = LLM + Tools + Loop. Without any one of these three, it&#39;s not an agent.</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>Agent = LLM (reasoning engine)</span></span>
<span class="line"><span> + Tools (capability surface)</span></span>
<span class="line"><span> + Loop (autonomous decision cycle)</span></span></code></pre></div><ul><li>A single LLM call with no tools = chatbot</li><li>An LLM with tools but no loop = augmented inference</li><li>Tools + loop + LLM = agent (it can decide what to do next)</li></ul><h3 id="the-three-components" tabindex="-1">The Three Components <a class="header-anchor" href="#the-three-components" aria-label="Permalink to &quot;The Three Components&quot;"></a></h3><p><strong>LLM</strong> The reasoning engine. Given context + available tools, it decides which tool to call and with what parameters. The LLM is NOT the agent it&#39;s the brain of the agent. Different models have different reasoning capabilities, but the core function is the same: given a situation and available actions, decide what to do.</p><p><strong>Tools</strong> The capability surface. Functions the agent can call: read files, run commands, search the web, query databases, call APIs. Each tool has a name, description, and input schema. The tool surface defines what the agent CAN do everything outside this surface is something the agent cannot do, no matter how smart the LLM is.</p><p><strong>Loop</strong> The autonomous decision cycle. Think (LLM decides) Act (tool executes) Observe (result comes back) Repeat. The loop is what makes it autonomous. Without a loop, you have a single decision. With a loop, you have an agent that can work toward a goal across multiple steps.</p><h3 id="why-this-matters" tabindex="-1">Why This Matters <a class="header-anchor" href="#why-this-matters" aria-label="Permalink to &quot;Why This Matters&quot;"></a></h3><p>This definition is not academic. Every production agent failure I&#39;ve seen traces back to one of these three:</p><table tabindex="0"><thead><tr><th>Failure</th><th>Root Cause</th></tr></thead><tbody><tr><td>Agent does something unexpected</td><td>Loop didn&#39;t terminate correctly</td></tr><tr><td>Agent can&#39;t do the task</td><td>Tools are insufficient for the task</td></tr><tr><td>Agent makes bad decisions</td><td>LLM doesn&#39;t have enough context</td></tr><tr><td>Agent costs too much</td><td>Loop runs too many iterations</td></tr></tbody></table><p>If you understand these three components and how they interact, you can debug any agent system. If you don&#39;t, you&#39;re guessing.</p><hr><h2 id="what-you-ll-learn-in-the-full-course" tabindex="-1">What You&#39;ll Learn in the Full Course <a class="header-anchor" href="#what-you-ll-learn-in-the-full-course" aria-label="Permalink to &quot;What You&#39;ll Learn in the Full Course&quot;"></a></h2><table tabindex="0"><thead><tr><th>Module</th><th>Topic</th><th>Lessons</th><th>Labs</th></tr></thead><tbody><tr><td>M1</td><td>Foundations</td><td>8 lessons</td><td>1 lab</td></tr><tr><td>M2</td><td>Agent Architecture</td><td>7 lessons</td><td>2 labs</td></tr><tr><td>M3</td><td>Safety &amp; Security</td><td>7 lessons</td><td>2 labs</td></tr><tr><td>M4</td><td>Multi-Agent Orchestration</td><td>11 lessons</td><td>2 labs</td></tr><tr><td>M5</td><td>Production Systems</td><td>10 lessons</td><td>2 labs</td></tr><tr><td>M6</td><td>Model Economics</td><td>7 lessons</td><td>2 labs</td></tr><tr><td>M7</td><td>Advanced Patterns</td><td>8 lessons</td><td>2 labs</td></tr><tr><td>M8</td><td>Capstone Project</td><td></td><td>Build &amp; deploy</td></tr></tbody></table><p><a href="/buy">Enroll Now $97</a> · <a href="/modules/curriculum">View Full Curriculum</a></p><p><em>Note: This preview shows approximately 30% of a single lesson. Full lessons include code examples, diagrams, quiz questions, and lab exercises.</em></p>`,20)])])}const g=e(o,[["render",i]]);export{p as __pageData,g as default};

View File

@ -0,0 +1 @@
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Free Preview: Lesson 1.1 — What Makes an Agent?","description":"","frontmatter":{},"headers":[],"relativePath":"free-preview.md","filePath":"free-preview.md","lastUpdated":null}'),o={name:"free-preview.md"};function i(r,t,d,l,h,c){return a(),s("div",null,[...t[0]||(t[0]=[n("",20)])])}const g=e(o,[["render",i]]);export{p as __pageData,g as default};

View File

@ -1,4 +1,4 @@
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(p,s,h,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="module-7-advanced-topics" tabindex="-1">Module 7: Advanced Topics <a class="header-anchor" href="#module-7-advanced-topics" aria-label="Permalink to &quot;Module 7: Advanced Topics&quot;"></a></h1><h2 id="lesson-7-1-autoresearch" tabindex="-1">Lesson 7.1: Autoresearch <a class="header-anchor" href="#lesson-7-1-autoresearch" aria-label="Permalink to &quot;Lesson 7.1: Autoresearch&quot;"></a></h2><h3 id="the-core-loop" tabindex="-1">The Core Loop <a class="header-anchor" href="#the-core-loop" aria-label="Permalink to &quot;The Core Loop&quot;"></a></h3><p>Agents that improve themselves. The experiment loop:</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>1. Run: Execute the agent with current configuration</span></span>
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(h,s,p,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="module-7-advanced-topics" tabindex="-1">Module 7: Advanced Topics <a class="header-anchor" href="#module-7-advanced-topics" aria-label="Permalink to &quot;Module 7: Advanced Topics&quot;"></a></h1><h2 id="lesson-7-1-autoresearch" tabindex="-1">Lesson 7.1: Autoresearch <a class="header-anchor" href="#lesson-7-1-autoresearch" aria-label="Permalink to &quot;Lesson 7.1: Autoresearch&quot;"></a></h2><h3 id="the-core-loop" tabindex="-1">The Core Loop <a class="header-anchor" href="#the-core-loop" aria-label="Permalink to &quot;The Core Loop&quot;"></a></h3><p>Agents that improve themselves. The experiment loop:</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>1. Run: Execute the agent with current configuration</span></span>
<span class="line"><span>2. Measure: Collect metrics (latency, cost, success rate)</span></span>
<span class="line"><span>3. Log: Record experiment results to JSONL</span></span>
<span class="line"><span>4. Decide: Keep if improvement, discard if regression</span></span>
@ -50,4 +50,11 @@ import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Agent polls for sentinel pattern</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">poll</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> for</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;__DONE_abc123&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extract exit code from sentinel</span></span></code></pre></div><hr><h2 id="lesson-7-6-always-on-agents" tabindex="-1">Lesson 7.6: Always-On Agents <a class="header-anchor" href="#lesson-7-6-always-on-agents" aria-label="Permalink to &quot;Lesson 7.6: Always-On Agents&quot;"></a></h2><h3 id="voice-to-command-bridge" tabindex="-1">Voice-to-Command Bridge <a class="header-anchor" href="#voice-to-command-bridge" aria-label="Permalink to &quot;Voice-to-Command Bridge&quot;"></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>User speaks STT (faster-whisper) LLM transcribes to command Execute TTS response</span></span></code></pre></div><h3 id="job-server-pattern" tabindex="-1">Job Server Pattern <a class="header-anchor" href="#job-server-pattern" aria-label="Permalink to &quot;Job Server Pattern&quot;"></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Submit Queue Worker picks up Claude Code executes Result stored Check later</span></span></code></pre></div><h3 id="heartbeat-execution-from-paperclip" tabindex="-1">Heartbeat Execution (from Paperclip) <a class="header-anchor" href="#heartbeat-execution-from-paperclip" aria-label="Permalink to &quot;Heartbeat Execution (from Paperclip)&quot;"></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Timer fires Check for queued work Wake agent Agent executes Agent sleeps</span></span></code></pre></div><p>No continuous running. Agents wake, work, and sleep on a schedule.</p><hr><h2 id="lab-7-7-build-an-autoresearch-loop" tabindex="-1">Lab 7.7: Build an Autoresearch Loop <a class="header-anchor" href="#lab-7-7-build-an-autoresearch-loop" aria-label="Permalink to &quot;Lab 7.7: Build an Autoresearch Loop&quot;"></a></h2><p><strong>Objective</strong>: Agent runs experiment, measures result, logs it, decides keep/discard.</p><p><strong>Starter</strong>: <code>course/labs/L7-autoresearch/starter.py</code></p><p><strong>Checkpoints</strong>:</p><ol><li>Run code, measure baseline metric</li><li>Modify code (agent makes change)</li><li>Re-measure, compare, log</li><li>Discard if regression, keep if improvement</li><li>Include integrity guard (code hashing)</li></ol><h2 id="lab-7-8-meta-agent" tabindex="-1">Lab 7.8: Meta-Agent <a class="header-anchor" href="#lab-7-8-meta-agent" aria-label="Permalink to &quot;Lab 7.8: Meta-Agent&quot;"></a></h2><p><strong>Objective</strong>: Agent generates a new agent persona from documentation.</p><p><strong>Starter</strong>: <code>course/labs/L7-meta-agent/starter.py</code></p>`,52)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extract exit code from sentinel</span></span></code></pre></div><hr><h2 id="lesson-7-6-always-on-agents" tabindex="-1">Lesson 7.6: Always-On Agents <a class="header-anchor" href="#lesson-7-6-always-on-agents" aria-label="Permalink to &quot;Lesson 7.6: Always-On Agents&quot;"></a></h2><h3 id="voice-to-command-bridge" tabindex="-1">Voice-to-Command Bridge <a class="header-anchor" href="#voice-to-command-bridge" aria-label="Permalink to &quot;Voice-to-Command Bridge&quot;"></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>User speaks STT (faster-whisper) LLM transcribes to command Execute TTS response</span></span></code></pre></div><h3 id="job-server-pattern" tabindex="-1">Job Server Pattern <a class="header-anchor" href="#job-server-pattern" aria-label="Permalink to &quot;Job Server Pattern&quot;"></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Submit Queue Worker picks up Claude Code executes Result stored Check later</span></span></code></pre></div><h3 id="heartbeat-execution-from-paperclip" tabindex="-1">Heartbeat Execution (from Paperclip) <a class="header-anchor" href="#heartbeat-execution-from-paperclip" aria-label="Permalink to &quot;Heartbeat Execution (from Paperclip)&quot;"></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Timer fires Check for queued work Wake agent Agent executes Agent sleeps</span></span></code></pre></div><p>No continuous running. Agents wake, work, and sleep on a schedule.</p><h3 id="scheduling-strategies" tabindex="-1">Scheduling Strategies <a class="header-anchor" href="#scheduling-strategies" aria-label="Permalink to &quot;Scheduling Strategies&quot;"></a></h3><table tabindex="0"><thead><tr><th>Strategy</th><th>Pattern</th><th>Use Case</th></tr></thead><tbody><tr><td>Fixed interval</td><td>Every N minutes/hours/days</td><td>Brand monitoring, price tracking</td></tr><tr><td>Event-triggered</td><td>Webhook wake agent</td><td>CI/CD pipelines, PR reviews</td></tr><tr><td>Predictive</td><td>Learn optimal check times</td><td>Traffic monitoring, anomaly detection</td></tr><tr><td>Cascade</td><td>Agent A finishes Agent B starts</td><td>Data pipeline, ETL workflows</td></tr></tbody></table><h3 id="openclaw-the-always-on-employee" tabindex="-1">OpenClaw: The Always-On Employee <a class="header-anchor" href="#openclaw-the-always-on-employee" aria-label="Permalink to &quot;OpenClaw: The Always-On Employee&quot;"></a></h3><p>OpenClaw is a daemon-style agent that runs as a background service:</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:#6A737D;--shiki-dark:#6A737D;"># openclaw-config.yaml</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">agent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;brand-monitor&quot;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> heartbeat</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">300</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # every 5 minutes</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> max_sessions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> wake_command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;claude -p &#39;Check brand mentions since last run&#39;&quot;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> sleep_command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;pkill -f &#39;claude.*brand-monitor&#39;&quot;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> log_path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;/var/log/openclaw/brand-monitor.log&quot;</span></span></code></pre></div><p>It starts, checks for work, executes if needed, then goes back to sleep. No continuous billing, no context window overflow, no runaway loops. This is the pattern for production always-on agents.</p><h3 id="when-not-to-use-always-on" tabindex="-1">When NOT to Use Always-On <a class="header-anchor" href="#when-not-to-use-always-on" aria-label="Permalink to &quot;When NOT to Use Always-On&quot;"></a></h3><p>Always-on adds complexity. Before building one, verify you actually need it:</p><ul><li><strong>Batch jobs</strong> Cron is simpler and cheaper</li><li><strong>Real-time</strong> Event-driven architectures (webhooks, Kafka) outperform polling agents</li><li><strong>One-off</strong> Just run the agent once</li></ul><p>Always-on makes sense when you need adaptive scheduling, dynamic task generation, or autonomous decision-making about what to work on next.</p><hr><h2 id="lab-7-7-build-an-autoresearch-loop" tabindex="-1">Lab 7.7: Build an Autoresearch Loop <a class="header-anchor" href="#lab-7-7-build-an-autoresearch-loop" aria-label="Permalink to &quot;Lab 7.7: Build an Autoresearch Loop&quot;"></a></h2><p><strong>Objective</strong>: Agent runs experiment, measures result, logs it, decides keep/discard.</p><p><strong>Starter</strong>: <code>course/labs/L7-autoresearch/starter.py</code></p><p><strong>Checkpoints</strong>:</p><ol><li>Run code, measure baseline metric</li><li>Modify code (agent makes change)</li><li>Re-measure, compare, log</li><li>Discard if regression, keep if improvement</li><li>Include integrity guard (code hashing)</li></ol><h2 id="lab-7-8-meta-agent" tabindex="-1">Lab 7.8: Meta-Agent <a class="header-anchor" href="#lab-7-8-meta-agent" aria-label="Permalink to &quot;Lab 7.8: Meta-Agent&quot;"></a></h2><p><strong>Objective</strong>: Agent generates a new agent persona from documentation.</p><p><strong>Starter</strong>: <code>course/labs/L7-meta-agent/starter.py</code></p>`,62)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};

View File

@ -1 +1 @@
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(p,s,h,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",52)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(h,s,p,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",62)])])}const g=a(n,[["render",l]]);export{c 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

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

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

35
site/.vitepress/dist/free-preview.html vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"404.md":"BiCvjdaY","api-keys.md":"D2Kyj8T3","blog_index.md":"B5nL9faf","blog_posts_cascade-routing.md":"DvBM3TSf","blog_posts_choosing-security-level.md":"BYXRZEDN","blog_posts_mental-models.md":"BRY80gtq","blog_posts_repo-is-spec.md":"BxY1cXc_","blog_posts_security-ladder.md":"DQaqn6Yt","blog_posts_three-x-rule.md":"BHO6bhvz","blog_posts_verifier-pattern.md":"Gha_L_u5","blog_posts_vibe-vs-agentic.md":"7mduPfz1","blog_posts_what-is-an-agent.md":"BU2wUq_Y","blog_posts_why-multi-agent.md":"BVRIN2vH","buy.md":"CbIpCW5Y","certificate.md":"0V0n-TLl","getting-started.md":"Boo_V9xC","index.md":"BNS2TR1g","labs_index.md":"sAzXzfkI","labs_l1-first-agent.md":"BwU9yf-G","labs_l2-context.md":"BexGm8_s","labs_l2-multi-tool.md":"Bj3Mb-oj","labs_l3-verifier.md":"xilrGGap","labs_l3-whitelist-hook.md":"DJtbL66Y","labs_l4-agent-chain.md":"D89P8dwJ","labs_l4-multi-team.md":"DmSK8e2P","labs_l5-cicd.md":"Dz1Jl78z","labs_l5-observability.md":"BDpqVYjT","labs_l6-cost-optimization.md":"CabFK4GB","labs_l6-eval-harness.md":"CBwH6xOR","labs_l7-autoresearch.md":"BYlzPLYo","labs_l7-meta-agent.md":"iTswbOPg","modules_competitive-analysis.md":"BHMHacei","modules_curriculum.md":"D7UeKRfo","modules_debate.md":"DWctKMlA","modules_feynman.md":"DBw5sPBP","modules_field-manual.md":"hmt_NLf1","modules_m1-foundations.md":"DHFyTzWj","modules_m2-architecture.md":"Dp39xggp","modules_m3-safety.md":"CkKCTJdi","modules_m4-orchestration.md":"DFLcAKBv","modules_m5-production.md":"DTkLIrwQ","modules_m6-economics.md":"B6XI2-r7","modules_m7-advanced.md":"Cr3-rEV4","modules_m8-capstone.md":"D1AXKCqv","modules_non-technical.md":"BnvuUCRo","modules_reference-stack.md":"D9FXitvn","modules_software-factory.md":"C5Yf8Zwe","modules_tool-reference.md":"B40mlgZJ","public_certificate_template.md":"Cg1kPB1b","resources.md":"DcUu1NrK","skills.md":"BX3RBeCK","troubleshooting.md":"B6difx2I","verify.md":"Cl5ZMWNd"}
{"404.md":"BiCvjdaY","api-keys.md":"D2Kyj8T3","blog_index.md":"B5nL9faf","blog_posts_cascade-routing.md":"DvBM3TSf","blog_posts_choosing-security-level.md":"BYXRZEDN","blog_posts_mental-models.md":"BRY80gtq","blog_posts_repo-is-spec.md":"BxY1cXc_","blog_posts_security-ladder.md":"DQaqn6Yt","blog_posts_three-x-rule.md":"BHO6bhvz","blog_posts_verifier-pattern.md":"Gha_L_u5","blog_posts_vibe-vs-agentic.md":"7mduPfz1","blog_posts_what-is-an-agent.md":"BU2wUq_Y","blog_posts_why-multi-agent.md":"BVRIN2vH","buy.md":"CbIpCW5Y","certificate.md":"0V0n-TLl","free-preview.md":"D4lOIST7","getting-started.md":"Boo_V9xC","index.md":"BNS2TR1g","labs_index.md":"sAzXzfkI","labs_l1-first-agent.md":"BwU9yf-G","labs_l2-context.md":"BexGm8_s","labs_l2-multi-tool.md":"Bj3Mb-oj","labs_l3-verifier.md":"xilrGGap","labs_l3-whitelist-hook.md":"DJtbL66Y","labs_l4-agent-chain.md":"D89P8dwJ","labs_l4-multi-team.md":"DmSK8e2P","labs_l5-cicd.md":"Dz1Jl78z","labs_l5-observability.md":"BDpqVYjT","labs_l6-cost-optimization.md":"CabFK4GB","labs_l6-eval-harness.md":"CBwH6xOR","labs_l7-autoresearch.md":"BYlzPLYo","labs_l7-meta-agent.md":"iTswbOPg","modules_competitive-analysis.md":"BHMHacei","modules_curriculum.md":"D7UeKRfo","modules_debate.md":"DWctKMlA","modules_feynman.md":"DBw5sPBP","modules_field-manual.md":"hmt_NLf1","modules_m1-foundations.md":"DHFyTzWj","modules_m2-architecture.md":"Dp39xggp","modules_m3-safety.md":"CkKCTJdi","modules_m4-orchestration.md":"DFLcAKBv","modules_m5-production.md":"DTkLIrwQ","modules_m6-economics.md":"B6XI2-r7","modules_m7-advanced.md":"DoGMJ54l","modules_m8-capstone.md":"D1AXKCqv","modules_non-technical.md":"BnvuUCRo","modules_reference-stack.md":"D9FXitvn","modules_software-factory.md":"C5Yf8Zwe","modules_tool-reference.md":"B40mlgZJ","public_certificate_template.md":"Cg1kPB1b","resources.md":"DcUu1NrK","skills.md":"BX3RBeCK","troubleshooting.md":"B6difx2I","verify.md":"Cl5ZMWNd"}

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

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

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

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

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

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

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

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

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

File diff suppressed because one or more lines are too long

View File

@ -9,6 +9,7 @@
</div>
<div class="nav-links">
<a href="/modules/curriculum">Course</a>
<a href="/free-preview">Preview</a>
<a href="/labs/index">Labs</a>
<a href="/blog">Blog</a>
<a href="/buy" class="nav-cta">Enroll $97</a>
@ -27,7 +28,8 @@
<p class="hero-sub">65 lessons, 13 labs, 20 skill kits. Build production-grade multi-agent systems that are secure, cost-optimized, and always-on.</p>
<div class="hero-actions">
<a href="/buy" class="btn-p btn-primary">Enroll Now $97</a>
<a href="/modules/m1-foundations" class="btn-p btn-ghost">Start Learning Free</a>
<a href="/free-preview" class="btn-p btn-ghost">Free Preview</a>
<a href="/modules/m1-foundations" class="btn-p btn-ghost">View Curriculum</a>
</div>
</div>
<div class="term-widget">
@ -109,6 +111,37 @@
</div>
</section>
<!-- Instructor -->
<section class="sec" id="instructor">
<div class="sec-label">Your Instructor</div>
<h2 class="sec-title">Built by an Engineer, For Engineers</h2>
<div class="instructor-grid">
<div class="instructor-card">
<div class="instructor-avatar">
<span class="material-symbols-outlined">terminal</span>
</div>
<div class="instructor-info">
<h3>Artale</h3>
<p class="instructor-role">Founder, FDSA Agency</p>
<p class="instructor-bio">I've spent the last two years building production multi-agent systems from <strong>CEO Boards</strong> for strategic decision-making to <strong>Brand Monitor</strong> for always-on reputation tracking, to <strong>UI Agents</strong> that generate production Vue components. This course distills everything I learned shipping real agent systems, not toy demos.</p>
<p class="instructor-bio">Every pattern in this course the 6-level security ladder, P-threads, cascade routing, the verifier pattern came from building systems that had to work reliably in production. If it's in the course, it's been battle-tested.</p>
</div>
</div>
</div>
</section>
<!-- Email Capture -->
<section class="sec" id="newsletter">
<div class="sec-label">Stay Updated</div>
<h2 class="sec-title">Get Free Agent Engineering Resources</h2>
<p class="newsletter-sub">Weekly essays on multi-agent systems, security patterns, and production deployments. No spam, unsubscribe anytime.</p>
<form class="newsletter-form" action="https://gumroad.com" method="get" target="_blank">
<input type="email" class="newsletter-input" placeholder="you@example.com" required disabled value="Join waitlist — coming soon">
<button type="submit" class="btn-p btn-primary" disabled>Subscribe</button>
</form>
<p class="newsletter-note">Newsletter launching soon. Follow <a href="https://github.com/Artale" target="_blank">@Artale</a> for updates.</p>
</section>
<!-- Why FDSA -->
<section class="sec" id="why-fdsa">
<div class="sec-label">Compared To</div>
@ -382,6 +415,29 @@ onMounted(() => {
.compare-cons .material-symbols-outlined{color:#ef4444}
.compare-cons{color:var(--vp-c-text-2)}
/* Instructor */
.instructor-grid{max-width:720px;margin:0 auto}
.instructor-card{display:flex;gap:32px;align-items:flex-start;background:var(--vp-c-bg-soft);backdrop-filter:blur(12px);border:1px solid rgba(128,128,128,0.08);border-radius:16px;padding:36px}
.instructor-avatar{width:72px;height:72px;border-radius:50%;background:rgba(217,92,65,0.12);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.instructor-avatar .material-symbols-outlined{font-size:32px;color:var(--vp-c-brand-1)}
.instructor-info{flex:1}
.instructor-info h3{font-size:20px;font-weight:700;color:var(--vp-c-text-1);margin-bottom:2px}
.instructor-role{font-size:13px;color:var(--vp-c-text-2);margin-bottom:16px}
.instructor-bio{font-size:14px;line-height:1.7;color:var(--vp-c-text-2);margin-bottom:12px}
.instructor-bio:last-child{margin-bottom:0}
.instructor-bio strong{color:var(--vp-c-text-1)}
/* Newsletter */
.newsletter-sub{text-align:center;color:var(--vp-c-text-2);font-size:15px;margin-bottom:24px;max-width:480px;margin-left:auto;margin-right:auto}
.newsletter-form{display:flex;gap:12px;max-width:440px;margin:0 auto;justify-content:center}
.newsletter-input{flex:1;padding:12px 16px;border-radius:8px;border:1px solid rgba(128,128,128,0.2);background:var(--vp-c-bg-soft);color:var(--vp-c-text-1);font-family:inherit;font-size:14px;outline:none;transition:border .2s}
.newsletter-input:focus{border-color:var(--vp-c-brand-1)}
.newsletter-input:disabled{opacity:0.5;cursor:not-allowed}
.newsletter-form .btn-p{padding:12px 24px;font-size:14px;border:none;cursor:pointer}
.newsletter-form .btn-p:disabled{opacity:0.5;cursor:not-allowed}
.newsletter-note{text-align:center;font-size:12px;color:var(--vp-c-text-3);margin-top:16px}
.newsletter-note a{color:var(--vp-c-brand-1)}
/* Pricing */
.pricing-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;max-width:960px;margin:0 auto}
.price-card{background:var(--vp-c-bg-soft);backdrop-filter:blur(12px);border:1px solid rgba(128,128,128,0.08);border-radius:12px;padding:32px 24px;text-align:center;transition:all .3s;display:flex;flex-direction:column}

59
site/free-preview.md Normal file
View File

@ -0,0 +1,59 @@
# Free Preview: Lesson 1.1 — What Makes an Agent?
This is a sample lesson from **Module 1: Foundations** of the FDSA Agentic Engineering Course. Full course includes 65 lessons, 13 labs, and 20 skill kits.
---
## Lesson 1.1: What Makes an Agent?
**Definition**: An AI agent = LLM + Tools + Loop. Without any one of these three, it's not an agent.
```
Agent = LLM (reasoning engine)
+ Tools (capability surface)
+ Loop (autonomous decision cycle)
```
- A single LLM call with no tools = chatbot
- An LLM with tools but no loop = augmented inference
- Tools + loop + LLM = agent (it can decide what to do next)
### The Three Components
**LLM** — The reasoning engine. Given context + available tools, it decides which tool to call and with what parameters. The LLM is NOT the agent — it's the brain of the agent. Different models have different reasoning capabilities, but the core function is the same: given a situation and available actions, decide what to do.
**Tools** — The capability surface. Functions the agent can call: read files, run commands, search the web, query databases, call APIs. Each tool has a name, description, and input schema. The tool surface defines what the agent CAN do — everything outside this surface is something the agent cannot do, no matter how smart the LLM is.
**Loop** — The autonomous decision cycle. Think (LLM decides) → Act (tool executes) → Observe (result comes back) → Repeat. The loop is what makes it autonomous. Without a loop, you have a single decision. With a loop, you have an agent that can work toward a goal across multiple steps.
### Why This Matters
This definition is not academic. Every production agent failure I've seen traces back to one of these three:
| Failure | Root Cause |
|---------|-----------|
| Agent does something unexpected | Loop didn't terminate correctly |
| Agent can't do the task | Tools are insufficient for the task |
| Agent makes bad decisions | LLM doesn't have enough context |
| Agent costs too much | Loop runs too many iterations |
If you understand these three components and how they interact, you can debug any agent system. If you don't, you're guessing.
---
## What You'll Learn in the Full Course
| Module | Topic | Lessons | Labs |
|--------|-------|---------|------|
| M1 | Foundations | 8 lessons | 1 lab |
| M2 | Agent Architecture | 7 lessons | 2 labs |
| M3 | Safety & Security | 7 lessons | 2 labs |
| M4 | Multi-Agent Orchestration | 11 lessons | 2 labs |
| M5 | Production Systems | 10 lessons | 2 labs |
| M6 | Model Economics | 7 lessons | 2 labs |
| M7 | Advanced Patterns | 8 lessons | 2 labs |
| M8 | Capstone Project | — | Build & deploy |
[Enroll Now — $97](/buy) · [View Full Curriculum](/modules/curriculum)
*Note: This preview shows approximately 30% of a single lesson. Full lessons include code examples, diagrams, quiz questions, and lab exercises.*

View File

@ -165,6 +165,41 @@ Timer fires → Check for queued work → Wake agent → Agent executes → Agen
No continuous running. Agents wake, work, and sleep on a schedule.
### Scheduling Strategies
| Strategy | Pattern | Use Case |
|----------|---------|----------|
| Fixed interval | Every N minutes/hours/days | Brand monitoring, price tracking |
| Event-triggered | Webhook → wake agent | CI/CD pipelines, PR reviews |
| Predictive | Learn optimal check times | Traffic monitoring, anomaly detection |
| Cascade | Agent A finishes → Agent B starts | Data pipeline, ETL workflows |
### OpenClaw: The Always-On Employee
OpenClaw is a daemon-style agent that runs as a background service:
```yaml
# openclaw-config.yaml
agent:
name: "brand-monitor"
heartbeat: 300 # every 5 minutes
max_sessions: 1
wake_command: "claude -p 'Check brand mentions since last run'"
sleep_command: "pkill -f 'claude.*brand-monitor'"
log_path: "/var/log/openclaw/brand-monitor.log"
```
It starts, checks for work, executes if needed, then goes back to sleep. No continuous billing, no context window overflow, no runaway loops. This is the pattern for production always-on agents.
### When NOT to Use Always-On
Always-on adds complexity. Before building one, verify you actually need it:
- **Batch jobs** → Cron is simpler and cheaper
- **Real-time** → Event-driven architectures (webhooks, Kafka) outperform polling agents
- **One-off** → Just run the agent once
Always-on makes sense when you need adaptive scheduling, dynamic task generation, or autonomous decision-making about what to work on next.
---
## Lab 7.7: Build an Autoresearch Loop