<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://lockdraft.com/</id>
  <title type="text">LockDraft</title>
  <subtitle type="text">AI, automation &amp; agents — practical, no hype.</subtitle>
  <updated>2026-09-19T00:00:00.000Z</updated>
  <author><name>LockDraft</name></author>
  <link rel="alternate" href="https://lockdraft.com/"/>
  <link rel="self" href="https://lockdraft.com/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://lockdraft.com/posts/react-vs-plan-and-execute/</id>
      <title type="text">ReAct vs. Plan-and-Execute: Two Patterns for AI Agents</title>
      <published>2026-09-16T00:00:00.000Z</published>
      <updated>2026-09-16T00:00:00.000Z</updated>
      <author><name>LockDraft</name></author>
      <link rel="alternate" href="https://lockdraft.com/posts/react-vs-plan-and-execute/"/>
      <summary type="text">Two of the most common agent loop patterns, what each one is actually good at, and when picking the wrong one will hurt you.</summary>
      <content type="html"><![CDATA[<p>Most “AI agent” frameworks are a thin wrapper around one of two loop patterns. Knowing which one you’re building — and why — saves you from a lot of debugging later.</p>
<section><h2>ReAct: reason, act, observe, repeat<a href="#react-reason-act-observe-repeat"><span>#</span></a></h2><p>ReAct (Reason + Act) interleaves thinking and tool calls one step at a time: the model reasons about what to do next, calls a tool, observes the result, and reasons again. There’s no fixed plan — the next step is decided fresh each time, informed by what just happened.</p><p><strong>Good for:</strong> tasks where the right next step genuinely depends on what you just learned — debugging, research, exploring an unfamiliar API, anything where step 3 can’t be known until you see the result of step 1.</p><p><strong>Weak spot:</strong> it has no persistent plan, so on long tasks it can lose the thread, repeat work, or wander off course without anyone noticing until the end.</p></section>
<section><h2>Plan-and-Execute: plan once, then work the plan<a href="#plan-and-execute-plan-once-then-work-the-plan"><span>#</span></a></h2><p>This pattern splits planning from execution: the model first produces an explicit multi-step plan, then a (possibly separate, cheaper) executor works through the steps, only going back to re-plan if something breaks the plan.</p><p><strong>Good for:</strong> tasks with a knowable shape up front — “migrate these 12 files,” “run this checklist,” “generate this report” — where the value of a stable plan outweighs the cost of occasionally being wrong about step 4 before you get there.</p><p><strong>Weak spot:</strong> if the environment is more dynamic than expected, the agent either stubbornly follows a stale plan or has to re-plan so often that you’re paying the planning cost repeatedly anyway.</p></section>
<section><h2>Picking one<a href="#picking-one"><span>#</span></a></h2><p>A rough heuristic: if you could write the steps yourself before starting, use plan-and-execute. If you’d genuinely need to see step 1’s result before knowing what step 2 is, use ReAct. Most production agents end up as a hybrid — a loose plan for structure, with ReAct-style reasoning inside each step.</p><p>The mistake to avoid is picking a pattern because a framework defaults to it, then fighting the framework when your task doesn’t fit. Name the pattern you’re using on purpose, and it gets a lot easier to reason about why an agent is misbehaving.</p></section>]]></content>
    </entry>
    <entry>
      <id>https://lockdraft.com/posts/reading-ai-model-announcements/</id>
      <title type="text">How to Read an AI Model Announcement Without Getting Fooled by Benchmarks</title>
      <published>2026-09-19T00:00:00.000Z</published>
      <updated>2026-09-19T00:00:00.000Z</updated>
      <author><name>LockDraft</name></author>
      <link rel="alternate" href="https://lockdraft.com/posts/reading-ai-model-announcements/"/>
      <summary type="text">Model release posts are marketing documents first. Here&apos;s what to actually check before deciding a new model changes anything for you.</summary>
      <content type="html"><![CDATA[<p>Every few weeks there’s a new model release post with a chart showing it beating everything else on a handful of benchmarks. Some of that signal is real. A lot of it isn’t. Here’s what’s worth checking before a benchmark chart changes how you work.</p>
<section><h2>Check what the benchmark actually measures<a href="#check-what-the-benchmark-actually-measures"><span>#</span></a></h2><p>“State of the art on coding” can mean anything from “solves competitive programming puzzles” to “correctly edits a real codebase across multiple files.” These are barely related skills. Before a benchmark result matters to you, check what the tasks in that benchmark actually look like — most benchmark papers publish sample tasks, and reading three of them tells you more than the headline number.</p></section>
<section><h2>Check who ran the eval<a href="#check-who-ran-the-eval"><span>#</span></a></h2><p>A model provider reporting its own model’s score on its own chosen benchmarks, using its own prompting setup, is not the same evidence as a third party running a standard eval with a fixed harness. Neither is worthless, but they deserve different amounts of trust. Independent leaderboards that publish their methodology are worth more than a bar chart in a blog post.</p></section>
<section><h2>Check if the comparison is fair<a href="#check-if-the-comparison-is-fair"><span>#</span></a></h2><p>Watch for mismatched conditions: comparing a model with tool use enabled against one without, comparing different prompting strategies, or comparing against an old version of a competitor that’s since been updated. These aren’t always deliberate, but they’re common enough to check for.</p></section>
<section><h2>Check if the benchmark matches your actual task<a href="#check-if-the-benchmark-matches-your-actual-task"><span>#</span></a></h2><p>A model can be genuinely better at math olympiad problems and no better — or worse — at the specific thing you need, like following your codebase’s conventions or handling your particular data format. General benchmarks are a filter for “worth trying,” not a substitute for testing on your own task.</p></section>
<section><h2>The practical version<a href="#the-practical-version"><span>#</span></a></h2><p>Before switching models based on a release post: read one or two real example tasks from the cited benchmark, find one independent evaluation if you can, and — this is the part people skip — run your own small eval on the task you actually care about. It takes an hour and it’s worth more than any chart in the announcement.</p></section>]]></content>
    </entry>
    <entry>
      <id>https://lockdraft.com/posts/prompt-engineering-basics/</id>
      <title type="text">Prompt Engineering Basics: Structure Beats Cleverness</title>
      <published>2026-09-18T00:00:00.000Z</published>
      <updated>2026-09-18T00:00:00.000Z</updated>
      <author><name>LockDraft</name></author>
      <link rel="alternate" href="https://lockdraft.com/posts/prompt-engineering-basics/"/>
      <summary type="text">The handful of structural habits that improve prompt output more reliably than any &apos;magic phrase.&apos;</summary>
      <content type="html"><![CDATA[<p>Most prompt advice you’ll find online is either a “magic phrase” (“act as an expert…”) or vague (“be specific”). Neither tells you what to actually do. Here’s what reliably moves the needle, in order of impact.</p>
<section><h2>1. Say what “done” looks like<a href="#1-say-what-done-looks-like"><span>#</span></a></h2><p>Models are much better at hitting a target you’ve described than at guessing one. Instead of “summarize this,” say “summarize this in 3 bullet points, each under 20 words, focused on decisions made rather than discussion.” The output format is part of the task, not an afterthought.</p></section>
<section><h2>2. Give it the constraints you’d give a person<a href="#2-give-it-the-constraints-youd-give-a-person"><span>#</span></a></h2><p>If a colleague would need to know a constraint to do the task right — a deadline, an audience, a length limit, a thing to avoid — the model needs it too. “Don’t use marketing language” is a more useful instruction than “make it good.”</p></section>
<section><h2>3. Show, don’t just tell, when the format matters<a href="#3-show-dont-just-tell-when-the-format-matters"><span>#</span></a></h2><p>If you want a specific output shape (a particular JSON structure, a specific tone), one example is often worth several sentences of description. This is few-shot prompting, and it’s the single highest-leverage technique for format-sensitive tasks.</p></section>
<section><h2>4. Separate instructions from content clearly<a href="#4-separate-instructions-from-content-clearly"><span>#</span></a></h2><p>Use headers, delimiters, or XML-ish tags to mark where your instructions end and the content to work on begins:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Summarize the text between the tags below.</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>&lt;text&gt;</span></div></div><div><div><div>4</div></div><div><span>{{content}}</span></div></div><div><div><div>5</div></div><div><span>&lt;/text&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>This prevents the model from confusing instructions in the content with instructions from you — especially important once your prompts get long or the content is user-supplied.</p></section>
<section><h2>5. Ask for the harder thing directly<a href="#5-ask-for-the-harder-thing-directly"><span>#</span></a></h2><p>“List the 3 most important risks” beats “tell me about risks” — models default to the safe, generic answer unless you ask for the specific, opinionated one. If you want judgment, ask for judgment explicitly.</p></section>
<section><h2>What doesn’t matter as much as people think<a href="#what-doesnt-matter-as-much-as-people-think"><span>#</span></a></h2><p>Politeness (“please”, “thank you”) has negligible effect on output quality. Elaborate role-play personas (“You are a world-renowned expert with 30 years of experience…”) help less than a clear task description with real constraints. Spend your effort on structure, not framing.</p><p>Every prompt in the <a href="/prompts/">Prompts library</a> on this site follows these five habits — worth a look for concrete examples of the structure in practice.</p></section>]]></content>
    </entry>
    <entry>
      <id>https://lockdraft.com/posts/first-n8n-workflow/</id>
      <title type="text">Building Your First n8n Workflow: A Practical Walkthrough</title>
      <published>2026-09-17T00:00:00.000Z</published>
      <updated>2026-09-17T00:00:00.000Z</updated>
      <author><name>LockDraft</name></author>
      <link rel="alternate" href="https://lockdraft.com/posts/first-n8n-workflow/"/>
      <summary type="text">Set up n8n and build a real, working automation — a webhook that filters, transforms, and forwards data — instead of a toy example.</summary>
      <content type="html"><![CDATA[<p>Most n8n tutorials build a workflow that does nothing useful — a trigger connected straight to a “Set” node. Here’s one that actually filters and routes real data, the shape most first real workflows take.</p>
<section><h2>What we’re building<a href="#what-were-building"><span>#</span></a></h2><p>A webhook receives form submissions. The workflow:</p><ol>
<li>Validates that a required field is present</li>
<li>Filters out submissions marked as spam</li>
<li>Transforms the data into a clean shape</li>
<li>Sends valid submissions to a Slack channel (or any HTTP endpoint)</li>
</ol></section>
<section><h2>1. The trigger<a href="#1-the-trigger"><span>#</span></a></h2><p>Add a <strong>Webhook</strong> node. Set the HTTP method to <code>POST</code> and give it a memorable path (e.g. <code>/form-submit</code>). n8n gives you a test URL immediately — use it to send a sample payload with <code>curl</code> before building anything else, so you know exactly what shape of data you’re working with.</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-X</span><span> </span><span>POST</span><span> </span><span>https://your-n8n-instance/webhook-test/form-submit</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>-H</span><span> </span><span>"Content-Type: application/json"</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>-d</span><span> </span><span>'{"email": "user@example.com", "message": "hello", "honeypot": ""}'</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>2. Validate required fields<a href="#2-validate-required-fields"><span>#</span></a></h2><p>Add an <strong>IF</strong> node right after the webhook. Condition: <code>{{$json.email}}</code> is not empty. Route the “false” branch to a <strong>NoOp</strong> node (or a Respond-to-Webhook node returning a 400) so incomplete submissions stop here instead of propagating.</p></section>
<section><h2>3. Filter spam<a href="#3-filter-spam"><span>#</span></a></h2><p>Add a second <strong>IF</strong> node checking your honeypot field: <code>{{$json.honeypot}}</code> is empty. Bots that fill in every field get routed to a dead end; real users, who never see the honeypot field, pass through.</p></section>
<section><h2>4. Transform the data<a href="#4-transform-the-data"><span>#</span></a></h2><p>Add a <strong>Set</strong> node to shape the output into exactly what your downstream system expects — don’t forward the raw payload. This is also the right place to strip anything you don’t want to store or transmit further, like the honeypot field itself.</p></section>
<section><h2>5. Send it somewhere<a href="#5-send-it-somewhere"><span>#</span></a></h2><p>Add an <strong>HTTP Request</strong> node (or the Slack node if you’re using Slack) as the final step, pointing at your destination.</p></section>
<section><h2>Why this shape matters<a href="#why-this-shape-matters"><span>#</span></a></h2><p>This IF → IF → Set → HTTP Request shape — validate, filter, transform, deliver — covers the large majority of “someone submits something, we need to act on it” automations. Once you’ve built this once, you can swap the trigger (form, email, database row) and destination (Slack, email, another API) and reuse the same skeleton.</p><p>Next in this series: adding retries and error notifications so a failed delivery doesn’t silently disappear.</p></section>]]></content>
    </entry>
</feed>
