No matter how well you write your prompts, one problem remains: you have to type that well-crafted instruction again every time you open a new session. As I covered in LLMs meet you for the first time every session, an LLM doesn’t remember previous sessions. It’s like repeating the same explanation to someone you’re meeting for the first time, every single time.
Go one step further and the question changes. Not “what should I say this time,” but “what should I build so I never have to say this again.” That’s harness engineering.
There are three main devices that do this job.
A skill writes an entire task procedure into a file, ready to be called up whenever needed. For example, the blog-brief skill I used to write this post has this in its frontmatter:
---
model: opus
description: Takes a seed file, sets the angle, message, and outline, and promotes it to brief status. Human approval is a required checkpoint.
allowed-tools: Bash(find:*), Bash(grep:*), Read, Edit, Glob, AskUserQuestion
---
With allowed-tools listing exactly the tools needed, I don’t have to re-explain “find the files, read them, edit them, ask the human” every time I call this skill. The procedure itself is already structured into the file.
CLAUDE.md is a file that pins project conventions and constraints at the project root. Even when a fresh session opens, this file rides along automatically. For example:
## Project map (for cross-project awareness — one-line index; details live in each repo and the second wiki)
- **second** (`~/Library/...`) — LLM knowledge wiki / second brain. ⭐ This path is the single source of truth (SSOT) for the second wiki root
I never have to explain that line again in a new session. Pin it in CLAUDE.md, and even if the location changes, fixing this one line makes every skill follow.
Commands and hooks automate recurring triggers outright — when the condition is met, they run without being asked. This is an actual hook from my settings.json:
"hooks": {
"PreToolUse": [{
"matcher": "Skill",
"hooks": [{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR/scripts/hook_digest_guard.sh\"",
"timeout": 20,
"statusMessage": "Secret pre-scan (scrub guard)"
}]
}]
}
I don’t have to say “check for secrets first” every time a skill runs. The moment the Skill tool is invoked, the check fires automatically.
If prompt engineering is doing “what should I say this time” well, harness engineering is the work of making it so you don’t have to say it at all. However good an instruction is, if it only lives inside a conversation, it’s bound to that session. The moment the session closes, it vanishes with it, and the next session starts from zero again. Harness engineering solves this problem with structure. Pull the instruction out of the conversation and move it into structures like skills, CLAUDE.md, and hooks, and it stays put no matter how many new sessions you open. A solution that was trapped in a single conversation becomes an asset that lives outside the session. That’s the harness.