Building an OpenClaw Agent Like Miessler’s PAI
Building a Personal AI Agent
Daniel Miessler’s central argument is that the raw model is not the main product. The real product is the system wrapped around the model: context management, skills, hooks, steering rules, and a feedback loop that helps the assistant improve over time. In his current PAI writeup, he explicitly says the model matters, but the scaffolding matters more. (danielmiessler.com)
That is the right mental model for OpenClaw too.
Who is Daniel Miessler? Cybersecurity / AI engineer and founder based out of the San Francisco Bay.
What is PAI? Personal AI Infrastructure.
If you want OpenClaw to feel like an actual engineering partner instead of a fancy autocomplete tool, you need to build four layers around it:
- Context management so it knows who the user is and what matters.
- Skills so it has reusable domain knowledge and procedures.
- Hooks so the system reacts automatically at the right moments.
- AI steering rules so behavior is consistent, safe, and tailored.
Miessler’s recent PAI material also adds an important fifth idea: the agent should not just help; it should learn from feedback, failures, and verification outcomes so that future behavior improves. (GitHub)
Below is a developer tutorial that goes deeper explanation and turns Miessler’s ideas into something you can actually build into OpenClaw.
1. The mental model
A normal AI assistant works like this:
User asks → AI replies → everyone hopes it’s right.
Miessler’s “Algorithm” reframes that into a more verifiable process: Observe, Think, Plan, Build, Execute, Verify, Learn. In PAI v2.4, he describes it as a structured 7-phase approach to problem solving, and later versions add more rigor and persistence around constraints and verification. (GitHub)
For OpenClaw, that means this:
User request
↓
Load the right context
↓
Select the right skill(s)
↓
Apply steering rules
↓
Run the task
↓
Verify the result
↓
Store lessons learned
That is the difference between a chatbot and an agentic AI system.
2. Context management
What it is?
Miessler defines context as everything the system knows about you: who you are, what you are trying to accomplish, what you’ve been working on, what has worked, and what has not. He also says this is where a PAI (Personal AI Infrastructure) becomes fundamentally different from a chatbot: without context you have a tool; with context you have an assistant that knows you. (danielmiessler.com)
So for OpenClaw, context is not just “chat history”. It should include:
- identity
- preferences
- goals
- active projects
- recent work state
- past failures
- past wins
- coding standards
- tool preferences
- ongoing constraints
Why it matters
Without context, OpenClaw starts from zero every time. That means it re-asks questions, repeats mistakes, and gives generic answers.
With context, it can do things like:
- recognize the repo pattern you prefer
- remember your testing style
- avoid tools that failed last time
- continue a half-finished task from yesterday
- choose output style based on your preferences
Miessler’s recent PAI article organizes memory into three tiers: session memory, work memory, and learning memory. Session memory keeps recent conversations, work memory tracks the state of active efforts and artifacts, and learning memory stores accumulated lessons, failures, and signals. (danielmiessler.com)
What that should look like in OpenClaw
A practical OpenClaw memory layout could look like this:
openclaw/
context/
identity/
user_profile.md
preferences.md
goals.md
projects/
project-alpha.md
project-beta.md
active_work/
task-2026-03-13-router-bug/
meta.json
criteria.json
notes.md
artifacts/
verification/
learnings/
failures/
success_patterns/
prompts/
coding_patterns/
tool_observations/
ratings.jsonl
Recommended context layers
Layer 1: Identity context
This is stable information about the user.
Example:
# user_profile.md
Name: Samuel
Role: Software engineer and entrepreneur
Preferred response style:
- direct
- practical
- evidence-based
- challenge weak assumptions
Main goals:
- build useful software
- save money
- create income-generating ideas
Preferred development stack:
- React
- Next.js
- TypeScript
Layer 2: Project context
This is project-specific information.
Example:
# project-alpha.md
Project: OpenClaw customization
Purpose: Build an agentic AI coding assistant
Important constraints:
- deterministic workflows where possible
- store learning over time
- developer-friendly architecture
- minimize unnecessary token usage
Layer 3: Active work memory
This is the current task state. Miessler’s work memory stores things like metadata, criteria, research, agent outputs, and verification evidence. That pattern is extremely useful. (danielmiessler.com)
Example:
{
"task_id": "router-push-fix-001",
"status": "in_progress",
"goal": "Fix failing test caused by router.push mock",
"constraints": [
"Do not break other tests",
"Keep fix minimal",
"Prefer test-local mocking"
],
"attempts": [
{
"timestamp": "2026-03-13T10:00:00Z",
"action": "replaced push with jest.fn",
"result": "partial success"
}
]
}
Layer 4: Learning memory
Miessler’s learning memory includes failures, synthesis, and ratings/signals. That is the right idea for OpenClaw as well. (danielmiessler.com)
Store entries like:
{
"type": "failure",
"topic": "Next.js router mocks",
"symptom": "TypeError: router.push is not a function",
"root_cause": "mock missing push function",
"fix_pattern": "return push: jest.fn() from useRouter mock",
"confidence": 0.94,
"verified": true
}
How to load context efficiently
This will also help you to reduce cost. Do not dump all context into every session. That will bloat tokens and lower quality.
Instead, do selective context loading:
- Load core identity and steering rules at session start.
- Detect which project the request belongs to.
- Load only the related project file.
- Load active work state if the task is ongoing.
- Load relevant learning entries based on keywords or embeddings.
Pseudo-implementation:
async function loadContextForTask(task: string) {
const base = await readFiles([
"context/identity/user_profile.md",
"context/identity/preferences.md",
"rules/system.md",
"rules/user.md"
]);
const project = await classifyProject(task);
const projectContext = project
? await readFile(`context/projects/${project}.md`)
: "";
const activeWork = await findActiveWork(task);
const learnings = await searchLearnings(task, { limit: 5 });
return [base, projectContext, activeWork, learnings].join("\n\n");
}
The “why”
If you skip this, OpenClaw stays stateless and generic.
If you do it right, OpenClaw becomes personal, consistent, and able to resume work naturally. That is exactly the direction Miessler is pushing with PAI’s context system and session priming pipeline. (danielmiessler.com)
3. Skills
What they are
Miessler describes skills as encoded domain expertise, and in his current PAI writeup he shows skills as directories containing a SKILL.md, workflows, and tools. He also notes that his system had 67 skills and 333 workflows in one version, and that skills are the foundation of personalization. (danielmiessler.com)
A skill is not just a prompt. It is a reusable package containing:
- when to use it
- how to think about the task
- step-by-step workflows
- optional tools/scripts
- examples
- constraints
- verification steps
Why they matter
Without skills, the agent improvises too much.
That causes:
- inconsistent output
- repeated reasoning mistakes
- poor reuse
- black-box behavior
- hard debugging
Miessler also argues in another article that reliable agents need composable pipelines, not one giant monolithic “do everything” agent. That maps directly to skills and workflows. (danielmiessler.com)
What a skill should contain
For OpenClaw, each skill should have:
skills/
frontend-testing/
SKILL.md
workflows/
write-test.md
debug-flaky-test.md
mock-router.md
tools/
parse-jest-output.ts
run-targeted-test.ts
examples/
next-router-mock.md
Example SKILL.md
# Skill: Frontend Testing
## Purpose
Help OpenClaw write, debug, and improve frontend tests for React and Next.js projects.
## Use when
- the user asks to write tests
- a test is failing
- mocking browser/router behavior is needed
- coverage improvement is requested
## Inputs
- component code
- failing test output
- framework details
- existing test patterns
## Workflow
1. Identify framework and test runner.
2. Read existing tests in the repo first.
3. Match local project conventions.
4. Reproduce the failure.
5. Apply the smallest correct fix.
6. Re-run targeted tests.
7. Summarize root cause and final fix.
## Rules
- never invent imports that are not in the repo
- prefer local patterns over generic internet examples
- explain mock shape when mocking complex hooks
## Verification
- test passes
- no obvious regression in neighboring tests
- final explanation includes root cause
## Output shape
- root cause
- minimal fix
- updated test code
- verification notes
Skill routing
Miessler says skills are loaded into the system prompt at startup and then requests are routed based on matching triggers. (danielmiessler.com)
For OpenClaw, you can do something similar, but I would recommend metadata-based routing instead of dumping every skill into the prompt.
Use a registry:
{
"skill": "frontend-testing",
"triggers": [
"test failed",
"jest",
"vitest",
"router.push is not a function",
"mock useRouter"
],
"priority": 90
}
Router example:
function selectSkills(task: string, registry: SkillMeta[]): SkillMeta[] {
return registry
.map(skill => ({
...skill,
score: skill.triggers.reduce(
(acc, trigger) => acc + (task.toLowerCase().includes(trigger) ? 1 : 0),
0
)
}))
.filter(skill => skill.score > 0)
.sort((a, b) => b.score - a.score)
.slice(0, 3);
}
SYSTEM + USER layering
One of Miessler’s smarter ideas is letting shared skills be extended with user-specific customizations rather than edited directly. In the PAI article he shows EXTEND.yaml files that add personal preferences on top of a shared skill. (danielmiessler.com)
You should copy that pattern.
Example:
skill: frontend-testing
extends:
- user-preferences.md
- repo-testing-conventions.md
merge_strategy: deep_merge
enabled: true
That gives you:
- shared team skill
- personal overrides
- cleaner upgrades
- fewer merge headaches
The “why”
Skills turn “AI guessing” into “AI following a proven playbook”.
That makes behavior easier to test, easier to improve, and easier to trust.
4. Hooks
What they are
Miessler calls hooks the “nervous system” of PAI. In his article on the AI nervous system, he says hooks are scripts wired into lifecycle events before, during, and after every algorithm run. They give the system senses, memory, and reflexes. (danielmiessler.com)
In the PAI article, he shows hook events like:
SessionStartUserPromptSubmitPreToolUsePostToolUseStopSubagentStop
and examples like LoadContext, FormatReminder, ExplicitRatingCapture, ImplicitSentimentCapture, SecurityValidator, and StopOrchestrator. (danielmiessler.com)
Why they matter
Without hooks, the agent only reacts when directly asked.
With hooks, the system can automatically:
- load context
- classify the request
- capture ratings
- block dangerous commands
- log tool outcomes
- store learning after completion
- summarize sub-agent results
That is the difference between “assistant” and “operating system”.
Hook events OpenClaw should support
Here is a clean lifecycle for OpenClaw:
onSessionStart
onUserMessage
beforePlan
afterPlan
beforeToolUse
afterToolUse
beforeResponse
afterResponse
onTaskSuccess
onTaskFailure
onSessionEnd
onSubagentComplete
Hook examples
1. onSessionStart
Load base context, steering rules, and active work.
export async function onSessionStart(ctx: SessionCtx) {
ctx.systemContext = await loadBaseContext();
ctx.activeWork = await loadActiveWork();
ctx.rules = await loadRules();
}
2. onUserMessage
Detect the task type and select skills.
export async function onUserMessage(ctx: SessionCtx, message: string) {
ctx.intent = await classifyIntent(message);
ctx.skills = await selectRelevantSkills(message);
}
3. beforeToolUse
Validate command safety.
export async function beforeToolUse(toolCall: ToolCall) {
if (containsPathTraversal(toolCall) || containsDangerousShellPattern(toolCall)) {
throw new Error("Blocked by security policy");
}
}
Miessler’s PAI uses a SecurityValidator hook before every tool execution to block prompt injection, command injection, and path traversal attempts. (danielmiessler.com)
4. afterToolUse
Record outputs, failures, and useful facts.
export async function afterToolUse(ctx: SessionCtx, result: ToolResult) {
await appendJsonl("logs/tool-events.jsonl", {
timestamp: new Date().toISOString(),
tool: result.tool,
success: result.success,
summary: summarizeToolResult(result)
});
}
5. onTaskFailure
Capture failure context for later learning.
export async function onTaskFailure(ctx: SessionCtx, failure: FailureInfo) {
await writeFailureRecord({
task: ctx.task,
skills: ctx.skills,
error: failure.error,
lastActions: ctx.trace.slice(-10),
repo: ctx.repo,
verified: false
});
}
6. onTaskSuccess
Store the pattern if it looks reusable.
export async function onTaskSuccess(ctx: SessionCtx, result: TaskResult) {
if (result.verified && result.reusablePattern) {
await saveLearning(result.reusablePattern);
}
}
The most important hook: LoadContext
Miessler’s session-start context priming pipeline is especially worth copying. In his article, the LoadContext hook checks whether SKILL.md needs rebuilding, loads context files, loads relationship context, checks for active work, and injects everything before the first user message. (danielmiessler.com)
OpenClaw should do the same in spirit:
export async function loadContextPipeline(task?: string) {
const core = await readFiles([
"rules/system.md",
"rules/user.md",
"context/identity/user_profile.md",
"context/identity/preferences.md"
]);
const active = await getActiveWork();
const related = task ? await getRelatedProjectContext(task) : "";
const learnings = task ? await getRelatedLearnings(task) : "";
return [core, active, related, learnings].join("\n\n");
}
The “why”
Hooks let your agent behave like a living system instead of a one-shot prompt. They automate the boring but essential parts: loading memory, capturing signals, enforcing safety, and preserving lessons.
5. AI Steering Rules
What they are
Miessler describes AI Steering Rules as behavioral guardrails. In the PAI article, he separates them into two layers:
- SYSTEM rules: universal and mandatory
- USER rules: personal customizations based on observed failures and preferences
He gives examples like “Verify before claiming completion”, “Ask before destructive actions”, and “Read before modifying”. He also notes that user rules were derived from analyzing low-rating events. (danielmiessler.com)
Why they matter
Without steering rules, the agent is inconsistent.
It might:
- claim success too early
- skip verification
- modify code before reading enough context
- over-explain or under-explain
- ignore user preferences
- repeat a known bad behavior
Steering rules are what turn a model’s general capability into a reliable working style.
How to structure them in OpenClaw
Use two files:
rules/
system.md
user.md
Example system.md
# System Steering Rules
1. Read before modifying.
2. Verify before claiming completion.
3. Ask for approval before destructive actions.
4. Prefer the smallest correct change.
5. Cite evidence when external facts are used.
6. Distinguish verified facts from assumptions.
7. Preserve project conventions unless the user requests otherwise.
Example user.md
# User Steering Rules
1. Be direct and practical.
2. Do not invent missing details.
3. Challenge weak assumptions instead of agreeing automatically.
4. Prefer solutions that can save time or generate income.
5. Keep recommendations implementation-focused.
6. Use examples when explaining abstractions.
How rules should be used
Rules should be injected into planning and execution, not just stored on disk.
Example:
function buildSystemPrompt(ctx: SessionCtx) {
return `
You are OpenClaw, an agentic engineering assistant.
SYSTEM RULES:
${ctx.systemRules}
USER RULES:
${ctx.userRules}
ACTIVE CONTEXT:
${ctx.activeContext}
SELECTED SKILLS:
${ctx.selectedSkills}
`;
}
Rules should come from failures too
Miessler’s strongest idea here is not just “write some rules”. It is “derive some rules from patterns in past failures”. In the PAI article, he says steering rules are fed by captured signals and that the system literally learns from mistakes. (danielmiessler.com)
That means OpenClaw should periodically synthesize new candidate rules.
Example failure pattern:
- 12 failed sessions because the agent claimed completion without running tests.
Derived rule:
Always run the narrowest relevant verification step before saying a fix is complete.
The “why”
Steering rules are how you make behavior predictable and improvable. They are the constitution of your agent.
6. Complete OpenClaw agent architecture
Here is the recommend architecture.
High-level design
┌─────────────────────────┐
│ User Input │
└────────────┬────────────┘
│
onUserMessage Hook
│
┌────────────▼────────────┐
│ Intent / Task Router │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Context Loader │
│ identity + project + │
│ active work + learnings │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Skill Selector │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Planner / Algorithm │
│ Observe Think Plan ... │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Tool Execution Layer │
│ shell/fs/git/test/web │
└────────────┬────────────┘
│
before/after tool hooks + logging
│
┌────────────▼────────────┐
│ Verification Layer │
│ tests, lints, checks, │
│ diff review, screenshots│
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Learning Capture Layer │
│ signals, failures, │
│ synthesized rules │
└─────────────────────────┘
Recommended folders
openclaw/
core/
agent.ts
router.ts
planner.ts
verifier.ts
prompt-builder.ts
context/
identity/
projects/
active_work/
learnings/
rules/
system.md
user.md
generated/
skills/
frontend-testing/
backend-debugging/
repo-exploration/
architecture-review/
writing/
hooks/
onSessionStart.ts
onUserMessage.ts
beforeToolUse.ts
afterToolUse.ts
onTaskSuccess.ts
onTaskFailure.ts
onSessionEnd.ts
memory/
vector/
signals/
failures/
synthesis/
tools/
run-tests.ts
grep-code.ts
collect-diff.ts
verify-build.ts
config/
skills.json
hooks.json
models.json
Request lifecycle
Step 1: Boot
Load base rules, identity, recent work, and available skills.
Step 2: Route
Classify the request:
- debugging
- feature build
- architecture advice
- code review
- research
- documentation
Step 3: Select context
Pull only the relevant project, active work, and recent learnings.
Step 4: Select skills
Pick the best-matching skills for the request.
Step 5: Plan
Run a structured planning phase before acting.
This is where Miessler’s Algorithm idea is useful: build criteria before trying to solve. (GitHub)
Step 6: Execute
Use tools, files, git, tests, shell, and external integrations.
Step 7: Verify
Never say “done” without evidence.
Step 8: Learn
Capture:
- success pattern
- failure pattern
- verification result
- user sentiment/rating if available
Optional multi-agent architecture
Miessler describes a three-tier agent system in PAI: task subagents, named agents, and custom agents. (danielmiessler.com)
For OpenClaw, I would adapt that as:
Tier 1: Utility subagents
Small focused workers:
- repo explorer
- test runner
- code summarizer
- dependency auditor
Tier 2: Specialist named agents
Persistent personas for major roles:
- Architect
- Engineer
- QA
- Security reviewer
Tier 3: Dynamic agents
Spawned for parallel work:
- 5 repo researchers
- 3 implementation candidates
- 2 competing verification strategies
That is useful when tasks can be decomposed safely and merged later.
7. How to build a self-improving AI engineer agent
This is the part most people get wrong.
They say they want a “self-improving agent”, but what they really build is an agent that stores random notes. That is not enough.
Miessler’s better idea is signal capture + failure analysis + rule updates + workflow refinement. His GitHub and article both emphasize that PAI captures ratings, sentiment, verification outcomes, and uses those to reinforce successes, analyze failures, and evolve skills and behavior. (GitHub)
What “self-improving” should mean
A self-improving AI engineer agent should get better at:
- choosing the right workflow
- asking fewer unnecessary questions
- avoiding repeated mistakes
- selecting better tools
- matching repo conventions
- verifying more reliably
- explaining solutions more clearly
The feedback loop
Task
↓
Plan
↓
Execute
↓
Verify
↓
Capture outcome
↓
Analyze what worked / failed
↓
Update memory / rules / skills
↓
Perform better next time
The minimum viable self-improvement system
1. Capture every meaningful signal
Miessler’s PAI captures explicit ratings, implicit sentiment, and failure contexts. (danielmiessler.com)
For OpenClaw, capture:
- user rating if given
- success/failure
- tests passed
- lints passed
- retries needed
- time to completion
- user correction frequency
- which skills were used
- which tools were used
- whether verification matched reality
Example:
{
"task": "fix router.push mock",
"skills": ["frontend-testing"],
"tools": ["read-file", "edit-file", "run-test"],
"verified": true,
"user_rating": 9,
"sentiment": "positive",
"corrections_required": 0
}
2. Capture failures with full context
If a task fails, store:
- the prompt
- selected skills
- plan
- tool trace
- final error
- why verification failed
- what the user corrected
This matters because vague “failure notes” are useless.
3. Synthesize patterns regularly
Every N tasks, run a synthesis job:
- Which failure causes repeat?
- Which skill combinations produce best outcomes?
- Which tool sequences are unstable?
- Which rules are being violated often?
Example synthesized insight:
{
"pattern": "premature completion claims",
"frequency": 11,
"root_cause": "verification skipped for small fixes",
"recommended_rule": "Run at least one narrow verification step before final answer"
}
4. Update steering rules
Add or revise rules based on strong patterns.
5. Update skills
If a fix pattern repeats, add it to the relevant skill workflow.
Example:
- repeated Next.js router mock failures
- update
frontend-testing/workflows/mock-router.md
6. Update routing
If certain requests are commonly misrouted, update trigger metadata.
7. Reward verified success
Track which workflow produced the best verified result.
That can improve future skill ranking.
Self-improvement pipeline example
async function learnFromTask(result: TaskResult) {
await appendSignal(result);
if (!result.verified || result.userRating <= 3) {
await storeFailure(result);
}
if (result.verified && result.reusablePattern) {
await storeSuccessPattern(result.reusablePattern);
}
const trends = await analyzeRecentSignals();
if (trends.newRuleCandidates.length) {
await updateGeneratedRules(trends.newRuleCandidates);
}
if (trends.skillPatches.length) {
await queueSkillPatch(trends.skillPatches);
}
}
Verification is the gate
One of Miessler’s strongest themes in the Algorithm releases is rigor: constraints should be extracted, success should be defined, and verification should be evidence-based rather than vibes-based. In v3.0 he explicitly frames the change as moving from intuition to mechanical rigor. (GitHub)
So for OpenClaw, do not learn from unverified success claims.
Only promote a pattern when one of these is true:
- tests passed
- build passed
- expected output matched
- user confirmed success
- independent check validated it
Otherwise you risk training the agent on its own hallucinations.
What a good self-improving coding agent eventually does
A mature OpenClaw engineer agent should learn things like:
- “This repo prefers integration tests over unit tests.”
- “This user hates large refactors without approval.”
- “When TypeScript path aliases fail, inspect tsconfig and test runner config together.”
- “This class of shell command is risky; prefer native APIs.”
- “When touching auth code, always run the auth regression suite.”
That is real improvement.
8. A concrete implementation plan for OpenClaw
Phase 1: Foundation
Build:
- context store
- skill registry
- hook framework
- steering rule loader
Do not try to build self-improvement first.
Phase 2: Core engineering skills
Implement 4–6 strong skills first:
- repo exploration
- debugging failing tests
- code modification
- verification
- code review
- architecture summary
Phase 3: Verification system
Add:
- targeted tests
- lint checks
- file diff summaries
- build checks
- screenshot/browser checks where relevant
Phase 4: Signal capture
Add:
- task outcomes
- ratings
- sentiment
- failure snapshots
- verification outcomes
Phase 5: Learning synthesis
Build a periodic job that proposes:
- new steering rules
- skill refinements
- routing improvements
Phase 6: Subagents
Add parallel workers for:
- repo search
- alternative fixes
- code review
- verification
That sequence is safer than building a “smart” multi-agent system on day one.
9. Common mistakes to avoid
Mistake 1: storing everything as memory
Not all history deserves promotion into context. Most of it is noise.
Mistake 2: giant prompts instead of architecture
If your solution is “just add a bigger system prompt”, you are building a demo, not a platform.
Mistake 3: no verification layer
An engineering agent without verification is just a confident guesser.
Mistake 4: no failure capture
If you only store successes, the system will not actually improve much.
Mistake 5: no distinction between rules and skills
Rules govern behavior. Skills govern capability. Mixing them creates chaos.
Mistake 6: monolithic agent logic
Miessler’s composable pipeline point is dead right: giant all-in-one agents are hard to debug and hard to improve. (danielmiessler.com)
10. References to Miessler’s work
These are the most relevant sources for the concepts above:
- Building a Personal AI Infrastructure (PAI) — the main overview of scaffolding, context, skills, hooks, steering rules, orchestration, and memory tiers. (danielmiessler.com)
- Anatomy of an AI Nervous System — the clearest explanation of hooks as the agent’s senses, memory, and reflexes. (danielmiessler.com)
- PAI v2.4.0 — The Algorithm — the 7-phase structure: Observe, Think, Plan, Build, Execute, Verify, Learn. (GitHub)
- PAI v3.0.0 — The Algorithm Matures — stronger focus on extracting constraints, reducing drift, and improving verification rigor. (GitHub)
- Why AI Agents Need Composable Pipelines — useful support for building small, focused, debuggable workflows instead of one giant agent. (danielmiessler.com)
- Personal_AI_Infrastructure GitHub repo — useful for the current framing of signal capture, learning from feedback, and system evolution. (GitHub)
Final takeaway
The most important idea here is this:
Do not try to make OpenClaw smarter by only changing the model. Make it smarter by improving the system around the model.
That means:
- better context loading
- better skills
- better hooks
- better steering rules
- better verification
- better learning from outcomes
That is the real lesson from Miessler’s PAI work. The model is only one part. The infrastructure is where the leverage is. (danielmiessler.com)
메타데이터
- post_id
- bbd8de0f90e0
- slug
- building-an-openclaw-agent-like-miesslers-pai-bbd8de0f90e0
- url
- https://medium.com/@samueldeveloper/building-an-openclaw-agent-like-miesslers-pai-bbd8de0f90e0
- canonical_url
- https://medium.com/@samueldeveloper/building-an-openclaw-agent-like-miesslers-pai-bbd8de0f90e0
- author_url
- https://medium.com/@samueldeveloper
- status
- ok
- fetched_at
- 2026-06-12 18:14:10