{"id":6123,"date":"2026-07-30T16:11:55","date_gmt":"2026-07-30T16:11:55","guid":{"rendered":"https:\/\/jonjones.ai\/uncategorized\/claude-code-hooks-operator-guide-2026\/"},"modified":"2026-07-30T16:11:55","modified_gmt":"2026-07-30T16:11:55","slug":"%e5%85%8b%e5%8b%9e%e5%be%b7%e4%bb%a3%e7%a2%bc%e9%89%a4%e5%ad%90%e6%93%8d%e4%bd%9c%e5%93%a1%e6%8c%87%e5%8d%97-2026","status":"publish","type":"post","link":"https:\/\/jonjones.ai\/zh\/%e4%ba%ba%e5%b7%a5%e6%99%ba%e6%85%a7\/%e5%85%8b%e5%8b%9e%e5%be%b7%e4%bb%a3%e7%a2%bc%e9%89%a4%e5%ad%90%e6%93%8d%e4%bd%9c%e5%93%a1%e6%8c%87%e5%8d%97-2026\/","title":{"rendered":"\u514b\u52de\u5fb7\u4ee3\u78bc\u9264\u5b50\uff1a\u904b\u71df\u5546\u5982\u4f55\u4e00\u591c\u4e4b\u9593\u5c07\u7de8\u78bc\u52a9\u624b\u8b8a\u6210\u503c\u5f97\u4fe1\u8cf4\u7684\u4ee3\u7406\u5546\uff082026\uff09"},"content":{"rendered":"<p>It&#8217;s 2am in Taipei. I&#8217;m asleep. Inside a Docker container on my VPS, a Claude Code agent wakes up on a cron schedule, writes a 2,600-word blog post, generates seven images, publishes it to WordPress, updates three Airtable tables, and files an Asana task &mdash; then goes back to sleep. Nobody watches it happen. That only works because of one feature most people treat as a coding convenience: <strong>Claude Code hooks<\/strong>. Hooks are the difference between <em>hoping<\/em> an unattended agent behaves and <em>enforcing<\/em> that it does.<\/p>\n\n<p>Search &#8220;claude code hooks&#8221; and every result teaches you the same thing: auto-format your files, tidy your commits, get a desktop ping when Claude needs input. All useful. All framed for a developer sitting at the keyboard. But if you run agents the way I do &mdash; headless, on a schedule, doing real business work while you sleep &mdash; hooks are something bigger. They&#8217;re the guardrail-and-audit layer that makes an autonomous business agent safe enough to leave alone. This guide reframes hooks for operators, not just coders.<\/p>\n\n<h2>What Claude Code Hooks Actually Are<\/h2>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-s1-20260731.jpg\" alt=\"claude code hooks\" \/><\/figure>\n\n<p>Claude Code hooks are user-defined handlers &mdash; shell commands, HTTP endpoints, or short LLM prompts &mdash; that Claude Code runs automatically at specific points in its lifecycle. Think of them like git hooks, but for your AI agent instead of your repository. When an event fires, Claude Code hands your handler a JSON payload describing what&#8217;s happening (which tool, which file, which command), your handler inspects it, and it can take action or return a decision that Claude must obey.<\/p>\n\n<p>The critical word is <strong>automatic<\/strong>. A hook is not something the model chooses to invoke. It fires because the event happened, full stop. For a command hook, the event context arrives on <code>stdin<\/code>; for an HTTP hook, it arrives as the POST body. Your handler exits with a status code &mdash; or returns a small JSON object &mdash; and Claude Code respects it. A <code>PreToolUse<\/code> hook that returns a &#8220;block&#8221; decision stops the tool call before it ever runs. That&#8217;s not a suggestion the model weighs against its other instincts. It&#8217;s a gate.<\/p>\n\n<p>There are three flavours of handler, and it&#8217;s worth knowing which is which. A <strong>command hook<\/strong> runs a shell command or script &mdash; the workhorse, and where you&#8217;ll spend 90% of your time. An <strong>HTTP hook<\/strong> POSTs the event to an endpoint and reads the response, useful when the decision logic lives in a shared service. And a <strong>prompt hook<\/strong> hands the decision to a fast Claude model when the check needs judgment rather than a hard rule &mdash; &#8220;does this commit message actually describe the change?&#8221; is a prompt-hook question; &#8220;is this command <code>rm -rf \/<\/code>?&#8221; is a command-hook question. Start with command hooks; graduate to the others only when a real need appears.<\/p>\n\n<p>This is worth sitting with, because it inverts how most people think about controlling an AI. You don&#8217;t control an agent by writing better instructions and hoping it listens. You control it by wrapping deterministic checks around the exact moments where it could do damage &mdash; and hooks are those checks. If you&#8217;re brand new to the tool, our <a href=\"https:\/\/jonjones.ai\/ai-automation\/claude-code-tutorial-for-beginners-2\/\">Claude Code tutorial for beginners<\/a> covers the basics of getting a first session running before you start bolting guardrails onto it.<\/p>\n\n<h2>Why Rules Aren&#8217;t Enough &mdash; and Claude Code Hooks Are<\/h2>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-s2-20260731.jpg\" alt=\"A polite rule versus a hard-stop hook, illustrated\" \/><\/figure>\n\n<p>Here&#8217;s the uncomfortable truth every operator learns the first time an agent goes off-script: your <code>CLAUDE.md<\/code> is a polite request. So is every &#8220;IMPORTANT: never do X&#8221; you type into a prompt. The model reads them, usually respects them, and then one night &mdash; new context, a weird edge case, a confidently wrong plan &mdash; it does the thing you explicitly told it not to. I&#8217;ve watched Claude reformat files I never touched, run commands I&#8217;d have vetoed, and declare a job &#8220;done&#8221; when it plainly wasn&#8217;t.<\/p>\n\n<p>The distinction that matters is <strong>probably versus always<\/strong>. If you tell Claude in your <code>CLAUDE.md<\/code> not to write to <code>.env<\/code>, it will probably comply. If you set a <code>PreToolUse<\/code> hook that blocks writes to <code>.env<\/code>, it <em>always<\/em> blocks them &mdash; this session, next session, on a night when the model is having an off run. For anyone operating in production, or running an agent unattended on a schedule, that gap between &#8220;probably&#8221; and &#8220;always&#8221; is the entire ballgame.<\/p>\n\n<p>Rules live inside the model&#8217;s judgment. Hooks live outside it. When you&#8217;re sitting at the keyboard, the model&#8217;s judgment plus your eyes on the screen is usually enough. When you&#8217;re asleep and the agent is three tool calls into something you didn&#8217;t anticipate, only the hook is still awake. That&#8217;s why I treat hooks not as a nice-to-have but as the precondition for trusting an agent to run without me. The same logic is why I never launch a build without <a href=\"https:\/\/jonjones.ai\/ai\/claude-code-planning-mode-operator-guide-2026\/\">Claude Code planning mode<\/a> either &mdash; you scope with planning, and you enforce with hooks.<\/p>\n\n<h2>The Lifecycle Events Worth Knowing First<\/h2>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-s3-20260731.jpg\" alt=\"The Claude Code hook lifecycle events on a timeline\" \/><\/figure>\n\n<p>Claude Code exposes a lot of lifecycle events, and the reference docs list every one. But you don&#8217;t need all of them to run a safe agent. You need a handful, understood in operator terms &mdash; what each one is <em>for<\/em> when your goal is an autonomous system, not a tidy coding session.<\/p>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Event<\/th><th>When it fires<\/th><th>What an operator uses it for<\/th><\/tr><\/thead><tbody>\n<tr><td><strong>SessionStart<\/strong><\/td><td>Once, when a session begins<\/td><td>Inject fresh context &mdash; pull the day&#8217;s config, load a secret, stamp a run ID into the log.<\/td><\/tr>\n<tr><td><strong>UserPromptSubmit<\/strong><\/td><td>Each time a prompt is submitted<\/td><td>Validate or annotate the incoming task before the agent touches it; reject malformed instructions.<\/td><\/tr>\n<tr><td><strong>PreToolUse<\/strong><\/td><td>Before every tool call in the loop<\/td><td>The guard rail. Inspect the command or file path and <em>block<\/em> anything dangerous before it runs.<\/td><\/tr>\n<tr><td><strong>PostToolUse<\/strong><\/td><td>After every tool call completes<\/td><td>The audit trail. Append what just happened to a log you read over coffee the next morning.<\/td><\/tr>\n<tr><td><strong>Stop \/ StopFailure<\/strong><\/td><td>When the agent tries to finish<\/td><td>Verify the work is actually done; force the agent to keep going, or fire your completion alert.<\/td><\/tr>\n<tr><td><strong>SessionEnd<\/strong><\/td><td>Once, when the session closes<\/td><td>Clean up temp files, flush the log, send the end-of-run summary.<\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n<p>Two cadences matter here. <code>SessionStart<\/code> and <code>SessionEnd<\/code> fire once per run. <code>PreToolUse<\/code> and <code>PostToolUse<\/code> fire on <em>every single tool call<\/em> &mdash; which is exactly why they&#8217;re the right place to enforce discipline and capture an audit trail. If you learn only three events, learn <code>PreToolUse<\/code> (block), <code>PostToolUse<\/code> (log), and <code>Stop<\/code> (verify and notify). Everything else is refinement.<\/p>\n\n<p>Here&#8217;s why the <em>timing<\/em> is the whole point. A <code>PreToolUse<\/code> hook fires <em>before<\/em> the action, so it can prevent it &mdash; that&#8217;s the only moment you can stop <code>rm -rf<\/code> from actually deleting anything. A <code>PostToolUse<\/code> hook fires <em>after<\/em>, so it can&#8217;t undo, but it can record what happened for later. Get those two backwards and your &#8220;guardrail&#8221; is really just a post-mortem. Matchers refine this further: attach the guard to the <code>Bash<\/code> tool specifically, or to file-writing tools, so it only runs when there&#8217;s something worth checking and never adds friction to a harmless read.<\/p>\n\n<style>#kt-layout-idnl_mid_HOOKS > .kt-row-column-wrap{align-content:start;}:where(#kt-layout-idnl_mid_HOOKS > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}#kt-layout-idnl_mid_HOOKS > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);padding-top:var( --global-kb-row-default-top, 25px );padding-bottom:var( --global-kb-row-default-bottom, 25px );padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px;grid-template-columns:repeat(2, minmax(0, 1fr));}#kt-layout-idnl_mid_HOOKS{border-top-left-radius:16px;border-top-right-radius:16px;border-bottom-right-radius:16px;border-bottom-left-radius:16px;overflow:clip;isolation:isolate;}#kt-layout-idnl_mid_HOOKS > .kt-row-layout-overlay{border-top-left-radius:16px;border-top-right-radius:16px;border-bottom-right-radius:16px;border-bottom-left-radius:16px;}#kt-layout-idnl_mid_HOOKS{background-color:#0e2f34;}#kt-layout-idnl_mid_HOOKS > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){#kt-layout-idnl_mid_HOOKS > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){#kt-layout-idnl_mid_HOOKS > .kt-row-column-wrap{grid-template-columns:repeat(2, minmax(0, 1fr));}}<\/style>\n<div class=\"wp-block-kadence-rowlayout alignnone\">\n<style>.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col{border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col,.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col{flex-direction:column;}.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col:before{opacity:0.3;}.kadence-columnnl_mid_img_HOOKS{position:relative;}@media all and (max-width: 1024px){.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-columnnl_mid_img_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column inner-column-1\"><div class=\"kt-inside-inner-col\">\n\n<figure class=\"wp-block-image size-medium\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/06\/newsletter-cta-ai-playbook.jpg\" alt=\"Free AI automation playbook\" \/><\/figure>\n\n<\/div><\/div>\n\n<style>.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col{border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col,.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;}.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col:before{opacity:0.3;}.kadence-columnnl_mid_txt_HOOKS{position:relative;}@media all and (max-width: 1024px){.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-columnnl_mid_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column inner-column-2\"><div class=\"kt-inside-inner-col\">\n\n<h3 class=\"wp-block-heading has-text-color\" style=\"color:#ffffff\">Steal My AI Automation Playbook<\/h3>\n\n\n<p class=\"has-text-color\" style=\"color:#cfe8ea\">The exact systems I use to run autonomous business agents while I sleep &mdash; hooks, guardrails, and the receipts. Free, straight to your inbox.<\/p>\n\n<div class='fluentform ff-default fluentform_wrapper_8 ffs_default_wrap'><form data-form_id=\"8\" id=\"fluentform_8\" class=\"frm-fluent-form fluent_form_8 ff-el-form-top ff_form_instance_8_1 ff-form-loading ffs_default\" data-form_instance=\"ff_form_instance_8_1\" method=\"POST\" ><fieldset  style=\"border: none!important;margin: 0!important;padding: 0!important;background-color: transparent!important;box-shadow: none!important;outline: none!important; min-inline-size: 100%;\">\n                    <legend class=\"ff_screen_reader_title\" style=\"display: block; margin: 0!important;padding: 0!important;height: 0!important;text-indent: -999999px;width: 0!important;overflow:hidden;\">Lead Magnet - AI Playbook<\/legend><input type='hidden' name='__fluent_form_embded_post_id' value='6123' \/><input type=\"hidden\" id=\"_fluentform_8_fluentformnonce\" name=\"_fluentform_8_fluentformnonce\" value=\"144a403346\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/zh\/wp-json\/wp\/v2\/posts\/6123\" \/><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"email\" name=\"email\" id=\"ff_8_email\" class=\"ff-el-form-control\" placeholder=\"Your email address\" data-name=\"email\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><div class='ff-el-group ff-text-left ff_submit_btn_wrapper ff_submit_btn_wrapper_custom'><button class=\"ff-btn ff-btn-submit ff-btn-md ff_btn_style wpf_has_custom_css\" type=\"submit\" name=\"custom_submit_button-8_1\" data-name=\"custom_submit_button-8_1\"  aria-label=\"GET THE PLAYBOOK\">GET THE PLAYBOOK<\/button><style>form.fluent_form_8 .wpf_has_custom_css.ff-btn-submit { background-color:#00ff88;border-color:#00ff88;color:#0a0a14;min-width:100%; }form.fluent_form_8 .wpf_has_custom_css.ff-btn-submit:hover { background-color:#00cc6a;border-color:#00cc6a;color:#0a0a14;min-width:100%; } <\/style><\/div><\/fieldset><\/form><div id='fluentform_8_errors' class='ff-errors-in-stack ff_form_instance_8_1 ff-form-loading_errors ff_form_instance_8_1_errors'><\/div><\/div>            <script type=\"text\/javascript\">\n                window.fluent_form_ff_form_instance_8_1 = {\"id\":\"8\",\"settings\":{\"layout\":{\"labelPlacement\":\"top\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"asteriskPlacement\":\"asterisk-right\"},\"restrictions\":{\"denyEmptySubmission\":{\"enabled\":false}}},\"form_instance\":\"ff_form_instance_8_1\",\"form_id_selector\":\"fluentform_8\",\"rules\":{\"email\":{\"required\":{\"value\":true,\"message\":\"This field is required\"},\"email\":{\"value\":true,\"message\":\"Please enter a valid email address\"}}},\"debounce_time\":300};\n                            <\/script>\n            \n\n<\/div><\/div>\n\n<\/div>\n\n\n<h2>The Three Hooks Every Autonomous Agent Needs<\/h2>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-s4-20260731.jpg\" alt=\"Three guardian hooks protecting an autonomous agent\" \/><\/figure>\n\n<p>Strip away the 20-odd events and the clever tricks, and an unattended agent needs exactly three hooks to be trustworthy. These are the ones running on every container in my fleet.<\/p>\n\n<p><strong>1. Block dangerous actions (PreToolUse).<\/strong> A single hook inspects every Bash command and every file write before it executes. If the command matches a dangerous pattern &mdash; <code>rm -rf<\/code> on anything outside a scratch dir, a <code>curl &hellip; | bash<\/code>, a write to a protected path like <code>.env<\/code> or your production config &mdash; the hook returns a block, and Claude gets an error explaining why instead of executing it. This is what lets you run with broad autonomy without praying. You get the speed of a hands-off agent and a hard floor under it.<\/p>\n\n<p><strong>2. Audit-log every tool call (PostToolUse).<\/strong> After each tool runs, a hook appends a one-line record &mdash; timestamp, tool, target, result &mdash; to a per-run log. The next morning, &#8220;what did my agent actually do last night?&#8221; is a two-second read, not an investigation. When something looks off, the log is your black box recorder. No audit trail, no trust; it&#8217;s that simple.<\/p>\n\n<p><strong>3. Notify on completion (Stop \/ Notification).<\/strong> When a skill finishes, a hook pings Telegram with a one-line summary: what ran, whether it succeeded, the published URL. I don&#8217;t check dashboards; the agents text me. I wrote a whole piece on why <a href=\"https:\/\/jonjones.ai\/ai-automation\/daily-tip-tuesday-agent-heartbeat-2026-07-28\/\">every AI agent should text you when it&#8217;s done<\/a> &mdash; that heartbeat is a hook, and it&#8217;s how a fleet of agents stays legible to one operator.<\/p>\n\n<p>Block, log, notify. That&#8217;s the minimum viable trust layer. Everything fancier &mdash; self-verifying <code>Stop<\/code> hooks, HTTP hooks calling an external policy service &mdash; is built on top of those three. If wiring this up for your own stack sounds like exactly the kind of unglamorous plumbing you&#8217;d rather not spend a weekend on, <a href=\"https:\/\/jonjones.ai\/book-a-meeting\/\">book an automation strategy session<\/a> and I&#8217;ll map the guardrails your agents actually need.<\/p>\n\n<h2>A Real JonOps Hook Setup, Walked Through<\/h2>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-s5-20260731.jpg\" alt=\"An operator asleep while guarded autonomous agents run safely\" \/><\/figure>\n\n<p>Hooks are configured in a <code>settings.json<\/code> file &mdash; project-level, user-level, or both. You add a <code>hooks<\/code> block, name the event, optionally add a matcher so the hook only fires for certain tools, and point it at your handler. Here&#8217;s the shape of the guardrail I never run a container without, simplified to the essentials:<\/p>\n\n<pre class=\"wp-block-code\"><code>{\n  \"hooks\": {\n    \"PreToolUse\": [\n      { \"matcher\": \"Bash\",\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"python3 .claude\/hooks\/guard.py\" }\n        ]\n      }\n    ],\n    \"PostToolUse\": [\n      { \"matcher\": \"*\",\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"python3 .claude\/hooks\/audit.py\" }\n        ]\n      }\n    ],\n    \"Stop\": [\n      { \"hooks\": [\n          { \"type\": \"command\", \"command\": \"bash telegram-alert.sh\" }\n        ]\n      }\n    ]\n  }\n}<\/code><\/pre>\n\n<p>The <code>guard.py<\/code> handler reads the tool payload from <code>stdin<\/code>, checks the proposed command against a deny-list, and exits non-zero with a message if it&#8217;s a hit &mdash; that non-zero exit is the block. The <code>audit.py<\/code> handler appends a line to today&#8217;s log and exits clean so it never interferes. The <code>Stop<\/code> hook fires the Telegram summary. Three small scripts, and the container goes from &#8220;trust me&#8221; to &#8220;verify me.&#8221;<\/p>\n\n<p>One detail trips people up: <em>where<\/em> the settings file lives determines its scope. A <code>.claude\/settings.json<\/code> committed to the project applies to anyone (or any container) that runs the agent there &mdash; that&#8217;s how I ship the same guardrails to every brand in the fleet without re-configuring each one. A user-level settings file layers your personal defaults on top. When both define a hook for the same event, they stack rather than overwrite, so the project&#8217;s block rule and your personal logging rule both fire. Keep the non-negotiable guards in the project file; keep conveniences in your user file.<\/p>\n\n<p>The deeper discipline underneath this is <strong>read-versus-write separation<\/strong>. My agents read freely &mdash; that&#8217;s cheap and safe. Writes and shell commands run the gauntlet of the <code>PreToolUse<\/code> guard, because a write is where an agent can actually hurt you. That&#8217;s a policy I enforce with a hook rather than a paragraph in a config file, precisely because I&#8217;m not there to catch it if the model forgets. Once you&#8217;re running more than one agent, this discipline is also what keeps a whole <a href=\"https:\/\/jonjones.ai\/ai\/claude-code-agent-teams-operator-guide-2026\/\">Claude Code agent team<\/a> from stepping on each other or on your production data.<\/p>\n\n<style>#kt-layout-idcta_dfy_HOOKS > .kt-row-column-wrap{align-content:start;}:where(#kt-layout-idcta_dfy_HOOKS > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}#kt-layout-idcta_dfy_HOOKS > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);padding-top:var( --global-kb-row-default-top, 25px );padding-bottom:var( --global-kb-row-default-bottom, 25px );padding-top:36px;padding-right:36px;padding-bottom:36px;padding-left:36px;grid-template-columns:repeat(2, minmax(0, 1fr));}#kt-layout-idcta_dfy_HOOKS{border-top-left-radius:12px;border-top-right-radius:12px;border-bottom-right-radius:12px;border-bottom-left-radius:12px;overflow:clip;isolation:isolate;}#kt-layout-idcta_dfy_HOOKS > .kt-row-layout-overlay{border-top-left-radius:12px;border-top-right-radius:12px;border-bottom-right-radius:12px;border-bottom-left-radius:12px;}#kt-layout-idcta_dfy_HOOKS{background-color:#123f45;}#kt-layout-idcta_dfy_HOOKS > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){#kt-layout-idcta_dfy_HOOKS > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){#kt-layout-idcta_dfy_HOOKS > .kt-row-column-wrap{grid-template-columns:repeat(2, minmax(0, 1fr));}}<\/style>\n<div class=\"wp-block-kadence-rowlayout alignnone\">\n<style>.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col{border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col,.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col{flex-direction:column;}.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col:before{opacity:0.3;}.kadence-columncta_dfy_img_HOOKS{position:relative;}@media all and (max-width: 1024px){.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-columncta_dfy_img_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column inner-column-1\"><div class=\"kt-inside-inner-col\">\n\n<figure class=\"wp-block-image size-medium\"><a href=\"https:\/\/jonjones.ai\/book-a-meeting\/\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-featured-20260731.jpg\" alt=\"Done-for-you autonomous agent guardrails\" \/><\/a><\/figure>\n\n<\/div><\/div>\n\n<style>.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col{border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col,.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;}.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col:before{opacity:0.3;}.kadence-columncta_dfy_txt_HOOKS{position:relative;}@media all and (max-width: 1024px){.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-columncta_dfy_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column inner-column-2\"><div class=\"kt-inside-inner-col\">\n\n<h3 class=\"wp-block-heading has-text-color\" style=\"color:#ffffff\">Want Agents You Can Actually Leave Alone?<\/h3>\n\n\n<p class=\"has-text-color\" style=\"color:#cfe8ea\">I build the hook-and-guardrail layer that lets solopreneurs and small teams run Claude Code agents unattended &mdash; block, log, notify, done. If you&#8217;d rather have it wired for you than wire it yourself, let&#8217;s talk.<\/p>\n\n<style>.wp-block-kadence-advancedbtn.kb-btnscta_dfy_btn_HOOKS{gap:var(--global-kb-gap-xs, 0.5rem );justify-content:center;align-items:center;}.kt-btnscta_dfy_btn_HOOKS .kt-button{font-weight:normal;font-style:normal;}.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0{margin-right:5px;}.wp-block-kadence-advancedbtn.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0 .kt-button{color:#555555;border-color:#555555;}.wp-block-kadence-advancedbtn.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0 .kt-button:hover, .wp-block-kadence-advancedbtn.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0 .kt-button:focus{color:#ffffff;border-color:#444444;}.wp-block-kadence-advancedbtn.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0 .kt-button::before{display:none;}.wp-block-kadence-advancedbtn.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0 .kt-button:hover, .wp-block-kadence-advancedbtn.kt-btnscta_dfy_btn_HOOKS .kt-btn-wrap-0 .kt-button:focus{background:#444444;}<\/style>\n<div class=\"wp-block-kadence-advancedbtn kt-btn-wrap-cta_dfy_btn_HOOKS\">\n<style>ul.menu .wp-block-kadence-advancedbtn .kb-btncta_dfy_btn_s_HOOKS.kb-button{width:initial;}.wp-block-kadence-advancedbtn .kb-btncta_dfy_btn_s_HOOKS.kb-button{color:#0e2f34;background:#5ad1c8;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;padding-top:12px;padding-right:32px;padding-bottom:12px;padding-left:32px;}<\/style><a class=\"kb-button kt-button button kb-btncta_dfy_btn_s_HOOKS kt-btn-size-standard kt-btn-width-type-auto kb-btn-global-fill  kt-btn-has-text-true kt-btn-has-svg-false  wp-block-kadence-singlebtn\" href=\"https:\/\/jonjones.ai\/book-a-meeting\/\"><span class=\"kt-btn-inner-text\">Book an automation strategy session<\/span><\/a>\n<\/div>\n\n<\/div><\/div>\n\n<\/div>\n\n\n<h2>Hooks + Planning Mode + Permissions = The Trust Stack<\/h2>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-s6-20260731.jpg\" alt=\"The layered trust stack around an autonomous agent\" \/><\/figure>\n\n<p>Hooks are one leg of a tripod. On their own they block and log, but real, sleep-through-the-night trust comes from stacking three layers so each covers the others&#8217; blind spots.<\/p>\n\n<p><strong>Planning mode scopes the work before it starts.<\/strong> You force the agent to lay out its plan, you read it, you approve it. That&#8217;s your cheapest risk control &mdash; catching a bad approach before a single tool call runs. It&#8217;s the front door.<\/p>\n\n<p><strong>Permissions set the coarse boundaries.<\/strong> Claude Code&#8217;s allow and deny lists decide which tools and paths are even on the table. It&#8217;s the fence around the yard &mdash; broad, static, and easy to reason about.<\/p>\n\n<p><strong>Hooks enforce the fine-grained, dynamic rules.<\/strong> Permissions can say &#8220;Bash is allowed&#8221;; only a hook can say &#8220;Bash is allowed <em>unless<\/em> the command matches this dangerous pattern, and by the way, log every one that runs.&#8221; Hooks are where judgment turns into code.<\/p>\n\n<p>Picture a real night. A content skill wakes on cron, submits its task, and starts working. Planning already scoped it that morning, so the approach is sound. It reaches for Bash to run an image script &mdash; the <code>PreToolUse<\/code> guard checks the command, sees nothing dangerous, waves it through, and <code>PostToolUse<\/code> logs it. Later it tries to write to a path outside its lane; the guard blocks it, Claude reads the error, adjusts, and moves on. When the skill finishes, the <code>Stop<\/code> hook texts me a one-line summary with the published URL. I read it over coffee. At no point was I awake, and at no point was the agent unsupervised &mdash; the supervision was just code instead of me.<\/p>\n\n<p>Together &mdash; plan, then permission, then hook &mdash; you get defense in depth. A bad idea gets caught at planning. A wrong tool gets caught at permissions. A dangerous specific action gets caught at the hook, and whatever does run gets logged for the morning review. That&#8217;s the trust stack, and it&#8217;s why my containers can operate for weeks without me touching them. Security-minded operators should pair this with a hard look at what the agent can reach in the first place &mdash; a topic worth its own guide on running Claude Code safely.<\/p>\n\n<h2>Claude Code Hooks FAQ and Final Thoughts<\/h2>\n\n<h3>Do hooks slow Claude Code down?<\/h3>\n<p>Barely, if you keep handlers lean. A <code>PreToolUse<\/code> guard that runs a quick pattern check adds milliseconds. The trap is a <code>PostToolUse<\/code> hook that reformats files on every edit &mdash; each change sends a system reminder back into context and eats your window. The fix is to batch heavy work: format on a <code>Stop<\/code> hook at the end rather than after every single edit.<\/p>\n\n<h3>Can a hook block the agent entirely?<\/h3>\n<p>Yes &mdash; that&#8217;s the point. A <code>PreToolUse<\/code> hook that returns a block decision stops that specific tool call cold and hands Claude the reason. You can also use a <code>Stop<\/code> hook to <em>prevent<\/em> the agent from finishing, forcing it to keep working until conditions are met. Used well, that&#8217;s how an agent verifies its own work; used carelessly, it&#8217;s how you create an infinite loop, so add a sane exit condition.<\/p>\n\n<h3>Do hooks run on headless and cron sessions?<\/h3>\n<p>They do, and this is precisely where they earn their keep. A desktop notification hook is a nicety when you&#8217;re at the keyboard; a block-log-notify stack is essential when the session is running unattended at 2am with no human in the loop. Hooks are configured the same way regardless of how the session was launched.<\/p>\n\n<h3>Bash hook or HTTP hook &mdash; which should I use?<\/h3>\n<p>Start with command (bash or Python) hooks. They&#8217;re simplest, run locally, and cover the vast majority of guardrails. Reach for an HTTP hook when the decision lives elsewhere &mdash; a shared policy service across many agents, or a check that needs data your local script doesn&#8217;t have. Most operators never need more than command hooks. If you&#8217;re wiring hooks into external tools, our guide to <a href=\"https:\/\/jonjones.ai\/ai\/claude-code-mcp-guide-2026\/\">Claude Code and MCP<\/a> covers the connective tissue.<\/p>\n\n<h3>Final thoughts<\/h3>\n<p>The internet will keep selling you Claude Code hooks as a way to auto-format your code. Fine &mdash; but that&#8217;s the smallest thing they do. Their real job is to convert an AI assistant that&#8217;s usually right into an agent you can actually walk away from, because the guardrails don&#8217;t depend on the model&#8217;s mood. Rules are a hope. Hooks are a contract. If you want to run autonomous systems and not just play with them, that&#8217;s the line you have to cross.<\/p>\n\n<p>Start with three: block, log, notify. Add planning mode in front and permissions around the outside. That&#8217;s the whole trust stack, and it&#8217;s the same setup running under every brand in my fleet right now. When you&#8217;re ready to build your first real agent to point this at, our guide on <a href=\"https:\/\/jonjones.ai\/ai\/how-to-build-ai-agent-solopreneur-guide-2026\/\">how to build an AI agent<\/a> is the natural next step &mdash; then come back and wrap it in hooks before you ever leave it alone.<\/p>\n\n<style>#kt-layout-idnl_end_HOOKS > .kt-row-column-wrap{align-content:start;}:where(#kt-layout-idnl_end_HOOKS > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}#kt-layout-idnl_end_HOOKS > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);padding-top:var( --global-kb-row-default-top, 25px );padding-bottom:var( --global-kb-row-default-bottom, 25px );padding-top:36px;padding-right:36px;padding-bottom:36px;padding-left:36px;grid-template-columns:repeat(2, minmax(0, 1fr));}#kt-layout-idnl_end_HOOKS{border-top-left-radius:16px;border-top-right-radius:16px;border-bottom-right-radius:16px;border-bottom-left-radius:16px;overflow:clip;isolation:isolate;}#kt-layout-idnl_end_HOOKS > .kt-row-layout-overlay{border-top-left-radius:16px;border-top-right-radius:16px;border-bottom-right-radius:16px;border-bottom-left-radius:16px;}#kt-layout-idnl_end_HOOKS{background-color:#0e2f34;}#kt-layout-idnl_end_HOOKS > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){#kt-layout-idnl_end_HOOKS > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){#kt-layout-idnl_end_HOOKS > .kt-row-column-wrap{grid-template-columns:repeat(2, minmax(0, 1fr));}}<\/style>\n<div class=\"wp-block-kadence-rowlayout alignnone\">\n<style>.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col{border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col,.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col{flex-direction:column;}.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col:before{opacity:0.3;}.kadence-columnnl_end_img_HOOKS{position:relative;}@media all and (max-width: 1024px){.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-columnnl_end_img_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column inner-column-1\"><div class=\"kt-inside-inner-col\">\n\n<figure class=\"wp-block-image size-medium\"><img decoding=\"async\" src=\"https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/06\/newsletter-cta-ai-playbook.jpg\" alt=\"Free AI automation playbook\" \/><\/figure>\n\n<\/div><\/div>\n\n<style>.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col{border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col,.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;}.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col:before{opacity:0.3;}.kadence-columnnl_end_txt_HOOKS{position:relative;}@media all and (max-width: 1024px){.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-columnnl_end_txt_HOOKS > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column inner-column-2\"><div class=\"kt-inside-inner-col\">\n\n<h3 class=\"wp-block-heading has-text-color\" style=\"color:#ffffff\">Get the Playbook I Run My Fleet On<\/h3>\n\n\n<p class=\"has-text-color\" style=\"color:#cfe8ea\">One operator, a stack of autonomous agents, real receipts. Join the list and I&#8217;ll send you the systems &mdash; hooks, guardrails, and the automations that publish while I sleep.<\/p>\n\n<div class='fluentform ff-default fluentform_wrapper_8 ffs_default_wrap'><form data-form_id=\"8\" id=\"fluentform_8\" class=\"frm-fluent-form fluent_form_8 ff-el-form-top ff_form_instance_8_2 ff-form-loading ffs_default\" data-form_instance=\"ff_form_instance_8_2\" method=\"POST\" ><fieldset  style=\"border: none!important;margin: 0!important;padding: 0!important;background-color: transparent!important;box-shadow: none!important;outline: none!important; min-inline-size: 100%;\">\n                    <legend class=\"ff_screen_reader_title\" style=\"display: block; margin: 0!important;padding: 0!important;height: 0!important;text-indent: -999999px;width: 0!important;overflow:hidden;\">Lead Magnet - AI Playbook<\/legend><input type='hidden' name='__fluent_form_embded_post_id' value='6123' \/><input type=\"hidden\" id=\"_fluentform_8_fluentformnonce\" name=\"_fluentform_8_fluentformnonce\" value=\"144a403346\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/zh\/wp-json\/wp\/v2\/posts\/6123\" \/><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"email\" name=\"email\" id=\"ff_8_2_email\" class=\"ff-el-form-control\" placeholder=\"Your email address\" data-name=\"email\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><div class='ff-el-group ff-text-left ff_submit_btn_wrapper ff_submit_btn_wrapper_custom'><button class=\"ff-btn ff-btn-submit ff-btn-md ff_btn_style wpf_has_custom_css\" type=\"submit\" name=\"custom_submit_button-8_1\" data-name=\"custom_submit_button-8_1\"  aria-label=\"GET THE PLAYBOOK\">GET THE PLAYBOOK<\/button><style>form.fluent_form_8 .wpf_has_custom_css.ff-btn-submit { background-color:#00ff88;border-color:#00ff88;color:#0a0a14;min-width:100%; }form.fluent_form_8 .wpf_has_custom_css.ff-btn-submit:hover { background-color:#00cc6a;border-color:#00cc6a;color:#0a0a14;min-width:100%; } <\/style><\/div><\/fieldset><\/form><div id='fluentform_8_errors' class='ff-errors-in-stack ff_form_instance_8_2 ff-form-loading_errors ff_form_instance_8_2_errors'><\/div><\/div>            <script type=\"text\/javascript\">\n                window.fluent_form_ff_form_instance_8_2 = {\"id\":\"8\",\"settings\":{\"layout\":{\"labelPlacement\":\"top\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"asteriskPlacement\":\"asterisk-right\"},\"restrictions\":{\"denyEmptySubmission\":{\"enabled\":false}}},\"form_instance\":\"ff_form_instance_8_2\",\"form_id_selector\":\"fluentform_8\",\"rules\":{\"email\":{\"required\":{\"value\":true,\"message\":\"This field is required\"},\"email\":{\"value\":true,\"message\":\"Please enter a valid email address\"}}},\"debounce_time\":300};\n                            <\/script>\n            \n\n<\/div><\/div>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u73fe\u5728\u662f\u53f0\u5317\u6642\u9593\u51cc\u6668\u5169\u9ede\u3002\u6211\u7761\u8457\u4e86\u3002\u5728\u6211\u7684VPS\u4f3a\u670d\u5668\u4e0a\u7684\u4e00\u500bDocker\u5bb9\u5668\u88e1\uff0c\u4e00\u500bClaude Code\u4ee3\u7406\u7a0b\u5f0f\u6309\u7167\u5b9a\u6642\u4efb\u52d9\u555f\u52d5\uff0c\u64b0\u5beb\u4e00\u7bc72600\u5b57\u7684\u90e8\u843d\u683c\u6587\u7ae0\uff0c\u7522\u751f\u4e03\u5f35\u5716\u7247\uff0c\u7136\u5f8c\u5c07\u5176\u767c\u4f48\u5230WordPress\u2026<\/p>","protected":false},"author":2,"featured_media":6117,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[28,44,64],"tags":[87,66,142,53,141],"class_list":["post-6123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-ai-automation","category-software-development","tag-ai-agents","tag-ai-automation","tag-autonomous-business","tag-claude-code-2","tag-claude-code-hooks"],"taxonomy_info":{"category":[{"value":28,"label":"AI"},{"value":44,"label":"AI Automation"},{"value":64,"label":"Software Development"}],"post_tag":[{"value":87,"label":"ai agents"},{"value":66,"label":"ai automation"},{"value":142,"label":"autonomous business"},{"value":53,"label":"claude code"},{"value":141,"label":"claude code hooks"}]},"featured_image_src_large":["https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/07\/cch-featured-20260731.jpg",1344,752,false],"author_info":{"display_name":"Jon Jones","author_link":"https:\/\/jonjones.ai\/zh\/author\/jonjonjones-ai\/"},"comment_info":0,"category_info":[{"term_id":28,"name":"AI","slug":"ai","term_group":0,"term_taxonomy_id":28,"taxonomy":"category","description":"","parent":0,"count":55,"filter":"raw","cat_ID":28,"category_count":55,"category_description":"","cat_name":"AI","category_nicename":"ai","category_parent":0},{"term_id":44,"name":"AI Automation","slug":"ai-automation","term_group":0,"term_taxonomy_id":44,"taxonomy":"category","description":"","parent":0,"count":96,"filter":"raw","cat_ID":44,"category_count":96,"category_description":"","cat_name":"AI Automation","category_nicename":"ai-automation","category_parent":0},{"term_id":64,"name":"Software Development","slug":"software-development","term_group":0,"term_taxonomy_id":64,"taxonomy":"category","description":"","parent":0,"count":5,"filter":"raw","cat_ID":64,"category_count":5,"category_description":"","cat_name":"Software Development","category_nicename":"software-development","category_parent":0}],"tag_info":[{"term_id":87,"name":"ai agents","slug":"ai-agents","term_group":0,"term_taxonomy_id":87,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"},{"term_id":66,"name":"ai automation","slug":"ai-automation","term_group":0,"term_taxonomy_id":66,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"},{"term_id":142,"name":"autonomous business","slug":"autonomous-business","term_group":0,"term_taxonomy_id":142,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":53,"name":"claude code","slug":"claude-code-2","term_group":0,"term_taxonomy_id":53,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"},{"term_id":141,"name":"claude code hooks","slug":"claude-code-hooks","term_group":0,"term_taxonomy_id":141,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/posts\/6123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/comments?post=6123"}],"version-history":[{"count":0,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/posts\/6123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/media\/6117"}],"wp:attachment":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/media?parent=6123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/categories?post=6123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/tags?post=6123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}