{"id":10021364,"date":"2026-05-30T21:12:45","date_gmt":"2026-05-30T13:12:45","guid":{"rendered":"https:\/\/itmax.cn\/?p=10021364"},"modified":"2026-05-30T21:12:45","modified_gmt":"2026-05-30T13:12:45","slug":"claude-code-harness-%e5%b7%a5%e7%a8%8b%ef%bc%9a%e6%95%b0%e4%bb%93%e4%be%a7%e8%90%bd%e5%9c%b0%e6%96%b9%e6%a1%88%ef%bd%9c%e5%be%97%e7%89%a9%e6%8a%80%e6%9c%af","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10021364","title":{"rendered":"Claude Code Harness \u5de5\u7a0b\uff1a\u6570\u4ed3\u4fa7\u843d\u5730\u65b9\u6848\uff5c\u5f97\u7269\u6280\u672f"},"content":{"rendered":"<h2>\u4e00\u3001AI Coding \u73b0\u72b6\u4e0e\u75db\u70b9\uff1a\u4e3a\u4ec0\u4e48\u9700\u8981 Harness<\/h2>\n<h3>\u5f53\u524d\u4f7f\u7528\u60c5\u51b5<\/h3>\n<p>\u5f97\u7269\u79bb\u7ebf\u6570\u4ed3\u5404\u5c0f\u7ec4\u5df2\u57fa\u672c\u5b8c\u6210 AI Coding \u5de5\u5177\u7684\u8986\u76d6\uff0c\u4e3b\u529b\u5de5\u5177\u4e3a Claude Code\uff0c\u8f85\u4ee5\u6570\u636e\u5e73\u53f0\u7684 IDE \u63d2\u4ef6\uff0c\u5e94\u5bf9\u91cd\u590d\u6027\u5de5\u4f5c\u65f6\u6548\u7387\u63d0\u5347\u660e\u663e\u3002<\/p>\n<h3>\u6838\u5fc3\u75db\u70b9<\/h3>\n<p>\u5c3d\u7ba1\u6574\u4f53\u63d0\u6548\u5df2\u663e\u73b0\uff0c\u4f46\u56e2\u961f\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\u66b4\u9732\u51fa\u4e09\u7c7b\u7ed3\u6784\u6027\u75db\u70b9\u3002<\/p>\n<p><strong>\u75db\u70b9\u4e00<\/strong>\uff1aAI \u4e0d\u8bb0\u5f97\u4e0a\u4e0b\u6587\u7ea6\u675f\uff0c\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u53cd\u590d&#8221;\u5931\u5fc6&#8221;\u3002\u4f1a\u8bdd\u5f00\u59cb\u65f6\u544a\u77e5\u4e86&#8221;\u91d1\u989d\u5b57\u6bb5\u5355\u4f4d\u662f\u5343\u5143&#8221;\uff0c\u5bf9\u8bdd\u8fdb\u884c\u5230\u4e00\u534a\u540e AI \u5fd8\u4e86\uff0c\u751f\u6210\u7684 SQL \u628a\u5343\u5143\u5f53\u5143\u7528\uff0c\u5bfc\u81f4\u6570\u636e\u5dee\u4e86 1000 \u500d\u3002\u8fd9\u4e0d\u662f\u5076\u53d1\u95ee\u9898\uff0c\u800c\u662f Claude Code \u7684 context compact \u673a\u5236\uff08\u4e0a\u4e0b\u6587\u538b\u7f29\uff09\u7684\u7cfb\u7edf\u6027\u9650\u5236\uff1a\u5f53\u5bf9\u8bdd token \u63a5\u8fd1\u4e0a\u9650\uff08\u7ea6 95%\uff09\u65f6\uff0c\u5386\u53f2\u5185\u5bb9\u88ab\u81ea\u52a8\u538b\u7f29\u4e3a\u6458\u8981\uff0c\u4e34\u65f6\u53e3\u5934\u8bf4\u7684\u7ea6\u675f\u5168\u90e8\u4e22\u5931\u3002<\/p>\n<p><strong>\u75db\u70b9\u4e8c<\/strong>\uff1a\u89c4\u8303\u6267\u884c\u4e0d\u7a33\u5b9a\uff0c\u9760\u8bb0\u5fc6\u515c\u5e95\u7684\u90e8\u5206\u6700\u5bb9\u6613\u51fa\u95ee\u9898\u3002OneData \u547d\u540d\u89c4\u8303\u3001\u6ce8\u91ca\u4e09\u6bb5\u5f0f\u3001INSERT \u5fc5\u987b\u5e26 PARTITION \u5b50\u53e5\u2026\u2026\u8fd9\u4e9b\u89c4\u8303\u5927\u5bb6\u90fd\u77e5\u9053\u3002\u5728\u9879\u76ee\u5de5\u671f\u7d27\u5f20\u65f6\uff0c\u4eba\u5de5\u89c4\u8303\u9075\u5b88\u7387\u964d\u81f3 60%~70%\uff0cAI \u9760 prompt \u8bb0\u5fc6\u7684\u89c4\u8303\u9075\u5b88\u7387\u4e5f\u53ea\u6709 70%~80%\u3002\u771f\u6b63\u9700\u8981\u7684\u662f\uff1a\u628a\u89c4\u8303\u4ece&#8221;LLM \u8bb0\u5fc6\u4e2d\u7684\u6307\u5bfc\u6027\u5185\u5bb9&#8221;\u53d8\u6210&#8221;\u6bcf\u6b21\u6267\u884c\u65f6\u5f3a\u5236\u68c0\u67e5\u7684\u62a4\u680f&#8221;\u3002<\/p>\n<p><strong>\u75db\u70b9\u4e09<\/strong>\uff1a\u5927\u578b\u9700\u6c42\u5f00\u53d1\u4e2d\uff0ccontext \u5f88\u5feb\u88ab\u6491\u6ee1\uff0c\u8d8a\u5230\u540e\u671f AI \u8d8a\u4e0d\u53ef\u9760\u3002\u590d\u6742\u9700\u6c42\uff08\u5927\u578b\u5bbd\u8868\u3001\u5927\u91cf\u4e0b\u6e38\u8840\u7f18\uff09\u7684\u5178\u578b\u5f00\u53d1\u8fc7\u7a0b\uff1a<\/p>\n<pre><code>\u8840\u7f18\u67e5\u8be2\u7ed3\u679c\uff08500~3000 tokens\uff09 \u81ea\u6d4b 23 \u6761 SQL \u6267\u884c\u7ed3\u679c\uff085000~15000 tokens\uff09 SKILL \u89c4\u8303\u6587\u4ef6\u5185\u5bb9\uff08~10000 tokens\uff09 \u6570\u636e\u6bd4\u5bf9\u4e24\u8868\u6837\u672c\uff08\u5927\u91cf\u884c\uff09= context \u8fc5\u901f\u81a8\u80c0 \u2192 compact \u89e6\u53d1 \u2192 \u5173\u952e\u7ea6\u675f\u9057\u5fd8 \u2192 AI \u5f00\u59cb\u72af\u4f4e\u7ea7\u9519\u8bef<\/code><\/pre>\n<p>\u6838\u5fc3\u77db\u76fe\uff1a\u8d8a\u662f\u590d\u6742\u7684\u9700\u6c42\uff0c\u8d8a\u4f9d\u8d56 AI\uff1b\u4f46\u8d8a\u590d\u6742\u7684\u9700\u6c42\uff0ccontext \u8d8a\u5bb9\u6613\u6491\u6ee1\uff0cAI \u8d8a\u5bb9\u6613&#8221;\u5931\u5fc6&#8221;\u3002<\/p>\n<h3>\u4ece&#8221;\u968f\u624b\u95ee AI&#8221;\u5230&#8221;\u628a\u80fd\u529b\u5c01\u88c5\u8d77\u6765&#8221;<\/h3>\n<p>\u9488\u5bf9\u4e0a\u8ff0\u75db\u70b9\uff0c\u6211\u4eec\u6cbf\u7528\u4e86\u4e00\u6761\u53cd\u590d\u9a8c\u8bc1\u7684\u7ed3\u8bba\uff1a\u89c4\u8303\u6267\u884c\u662f\u4eba\u7684\u77ed\u677f\u3001AI \u7684\u957f\u677f\uff1b\u4e1a\u52a1\u5224\u65ad\u662f AI \u7684\u77ed\u677f\u3001\u4eba\u7684\u957f\u677f\u3002Harness \u5de5\u7a0b\u7684\u76ee\u6807\uff0c\u5c31\u662f\u628a&#8221;\u6267\u884c\u5c42&#8221;\u7684\u4e0d\u7a33\u5b9a\u56e0\u7d20\u7cfb\u7edf\u6027\u5730\u6d88\u6389\uff1a\u628a\u89c4\u8303\u5199\u8fdb hooks\uff0c\u4e0d\u518d\u9760 AI \u8bb0\u5fc6\uff0c\u6bcf\u6b21\u5199 SQL \u6587\u4ef6\u540e\u81ea\u52a8\u89e6\u53d1\u68c0\u67e5\uff1b\u628a\u8fed\u4ee3\u7ea6\u675f\u5199\u8fdb\u6301\u4e45\u5316\u6587\u4ef6\uff0ccompact \u540e\u81ea\u52a8\u91cd\u65b0\u6ce8\u5165\uff0c\u4e0d\u518d\u9760\u4e34\u65f6\u53e3\u5934\u8bf4\uff1b\u628a\u9ad8 token \u64cd\u4f5c\u9694\u79bb\u5230 subagent\uff0c\u4e3b context \u53ea\u63a5\u6536\u6458\u8981\uff0c\u4e0d\u88ab\u8fc7\u7a0b\u6570\u636e\u6491\u6ee1\u3002<\/p>\n<h2>\u4e8c\u3001\u5148\u641e\u6e05\u695a&#8221;Harness&#8221;\u662f\u4ec0\u4e48<\/h2>\n<p>\u5728 Claude Code \u7684 update-config skill \u63cf\u8ff0\u4e2d\u6709\u4e00\u53e5\u8bdd\uff1a&#8221;Automated behaviors require hooks configured in settings.json \u2014 the harness executes these, not Claude&#8221;\u3002<\/p>\n<p>Harness = Claude Code \u7684\u5bbf\u4e3b\u8fd0\u884c\u6846\u67b6\uff0c\u5373 Claude Code \u5ba2\u6237\u7aef\u672c\u8eab\u8fd9\u4e2a&#8221;\u5de5\u5177\u94fe\u5bb9\u5668&#8221;\u3002\u5b83\uff1a\u7ba1\u7406 context window \u751f\u547d\u5468\u671f\uff1b\u5728 LLM \u63a8\u7406\u5faa\u73af\u4e4b\u5916\u786e\u5b9a\u6027\u5730\u6267\u884c hooks\uff1b\u534f\u8c03 subagents \u7684\u751f\u547d\u5468\u671f\uff1b\u4e0d\u4f9d\u8d56\u6a21\u578b\u5224\u65ad\uff0c\u76f4\u63a5\u6267\u884c\u914d\u7f6e\u7684\u81ea\u52a8\u5316\u884c\u4e3a\u3002\u533a\u522b\u603b\u7ed3\uff1a<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782272\" alt=\"\" title=\"\"><\/p>\n<h2>\u4e09\u3001\u6838\u5fc3\u95ee\u9898\uff1acompact \u5230\u5e95\u4e22\u6389\u4ec0\u4e48\uff1f<\/h2>\n<p>\u6bcf\u6b21\u6570\u4ed3\u5f00\u53d1 context \u63a5\u8fd1\u6ee1\u65f6\uff0cauto-compact \u89e6\u53d1\uff08\u9ed8\u8ba4 95% \u65f6\u89e6\u53d1\uff09\uff0c\u4f1a\u628a\u6574\u4e2a\u5bf9\u8bdd\u5386\u53f2\u66ff\u6362\u4e3a\u4e00\u4efd\u6458\u8981\uff0ctoken \u7f29\u51cf\u5230\u539f\u6765\u7684\u7ea6 12%\u3002\u54ea\u4e9b\u5185\u5bb9 compact \u540e\u4e22\u5931\uff1a<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782273\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u6570\u4ed3\u573a\u666f\u6700\u75db\u7684\u70b9\uff1a\u5bf9\u8bdd\u4e2d\u8bf4\u7684&#8221;\u8fd9\u6b21\u7528 OVERWRITE \u6a21\u5f0f&#8221;\u3001&#8221;\u5148\u5ffd\u7565 field_a \u5b57\u6bb5&#8221; \u2192 compact \u540e\u5168\u5fd8\uff1bSKILL \u6587\u4ef6\u8bfb\u4e86\u4e00\u534a\uff0ccompact \u540e\u524d\u51e0\u4e2a step \u7684\u5185\u5bb9\u6ca1\u4e86 \u2192 Claude \u91cd\u590d\u8be2\u95ee\uff1b\u81ea\u6d4b\u8dd1\u51fa\u6765 50 \u884c\u7ed3\u679c\uff0c\u52a0\u4e0a\u8840\u7f18\u67e5\u8be2\u7684\u51e0\u5341\u884c\u8868\u7ed3\u6784 \u2192 context \u5f88\u5feb\u81a8\u80c0\u5230 compact \u9608\u503c\u3002<\/p>\n<h2>\u56db\u3001\u4e94\u5c42\u9632\u5fa1\u4f53\u7cfb\uff08\u4ece\u7b80\u5355\u5230\u590d\u6742\uff09<\/h2>\n<h3>\u7b2c\u4e00\u5c42\uff1a\u5199\u6b7b\u8fdb CLAUDE.md\uff08\u7acb\u5373\u53ef\u7528\uff09<\/h3>\n<p><strong>\u673a\u5236<\/strong>\uff1a\u9879\u76ee\u6839\u76ee\u5f55 .claude\/CLAUDE.md \u6bcf\u6b21 compact \u540e\u4ece\u78c1\u76d8\u91cd\u65b0\u6ce8\u5165\uff0c\u662f\u6700\u53ef\u9760\u7684\u6301\u4e45\u5316\u4f4d\u7f6e\u3002\u5c06\u5f53\u524d\u8fed\u4ee3\u7684\u5173\u952e\u4fe1\u606f\u5199\u5165\uff0c\u683c\u5f0f\u5efa\u8bae\uff1a<\/p>\n<pre><code># \u5f53\u524d\u8fed\u4ee3\u72b6\u6001\uff08\u6bcf\u6b21\u8fed\u4ee3\u624b\u52a8\u66f4\u65b0\uff09## \u6b63\u5728\u5f00\u53d1- \u8868\uff1adb_a.dws_table_a\n \u7248\u672c\uff1aV1.0\n node_id\uff1a1000000001\n \u72b6\u6001\uff1aETL\u5f00\u53d1\u9636\u6bb5\uff08Step 3\/8\uff09\n\n## \u672c\u6b21\u8fed\u4ee3\u7ea6\u675f- \u7981\u6b62\u4fee\u6539\uff1adwd_table_b\uff08\u5df2\u4e0a\u7ebf\uff0c\u53ea\u8bfb\uff09\n \u5206\u533a\u5b57\u6bb5\uff1apartition_dt\uff08\u683c\u5f0f yyyyMMdd\uff0c\u4e0d\u662f dt\uff09\n amount \u5b57\u6bb5\u5355\u4f4d\uff1a\u5343\u5143\uff08\u4e0d\u662f\u5143\uff09\n\n## \u6570\u4ed3\u5168\u5c40\u89c4\u8303\n \u5efa\u8868\uff1a\u5206\u533a\u5b57\u6bb5\u5fc5\u987b\u662f partition_dt string\n \u7981\u6b62\uff1aSELECT *\uff0cUPDATE\/DELETE \u65e0 WHERE\n \u91d1\u989d\u5b57\u6bb5\u7528 DECIMAL(20,4)\uff0c\u4e0d\u7528 DOUBLE\n INSERT \u5fc5\u987b\u5e26 PARTITION \u5b50\u53e5<\/code><\/pre>\n<p><strong>\u64cd\u4f5c\u89c4\u5219<\/strong>\uff1a\u8fdb\u5165\u65b0\u8fed\u4ee3\u65f6\uff0c\u66f4\u65b0&#8221;\u6b63\u5728\u5f00\u53d1&#8221;\u548c&#8221;\u672c\u6b21\u8fed\u4ee3\u7ea6\u675f&#8221;\u4e24\u8282\uff1b\u4e0a\u7ebf\u540e\u6e05\u7a7a&#8221;\u672c\u6b21\u8fed\u4ee3\u7ea6\u675f&#8221;\uff1b\u5168\u5c40\u89c4\u8303\u957f\u671f\u4fdd\u7559\uff0c\u63a7\u5236\u5728 100 \u884c\u4ee5\u5185\u3002<\/p>\n<h3>\u7b2c\u4e8c\u5c42\uff1aAuto Memory \u81ea\u52a8\u79ef\u7d2f\uff08\u5df2\u5728\u8fd0\u884c\uff09<\/h3>\n<p>\u673a\u5236\uff1aClaude \u81ea\u52a8\u5c06\u8de8\u4f1a\u8bdd\u53d1\u73b0\u5199\u5165 ~\/.claude\/projects\/&lt;project&gt;\/memory\/MEMORY.md\uff0c\u6bcf\u6b21 compact \u540e\u91cd\u65b0\u6ce8\u5165\u3002\u6570\u4ed3\u573a\u666f\u4e0b\u4e3b\u52a8\u89e6\u53d1 Claude \u5199\u8bb0\u5fc6\u7684\u65f6\u673a\uff1a&#8221;\u8fd9\u5f20\u8868\u7684 amount \u5b57\u6bb5\u5355\u4f4d\u662f\u5343\u5143\uff0c\u8bf7\u8bb0\u4f4f&#8221;\uff1b&#8221;field_a \u5728\u7279\u5b9a\u573a\u666f\u4e0b\u4f1a\u4e3a\u7a7a\uff0c\u8bf7\u8bb0\u4f4f\u8fd9\u4e2a\u8e29\u5751&#8221;\uff1b&#8221;\u672c\u6b21 V1.0 \u7684\u5173\u952e\u53d8\u66f4\u662f field_b \u903b\u8f91\u8c03\u6574\uff0c\u8bf7\u8bb0\u4f4f&#8221;\u3002Claude \u4f1a\u81ea\u52a8\u5199\u5165 MEMORY.md\uff0c\u4e0b\u6b21\u4f1a\u8bdd\u6216 compact \u540e\u81ea\u52a8\u6062\u590d\u3002<\/p>\n<h3>\u7b2c\u4e09\u5c42\uff1ahooks \u81ea\u52a8\u9a8c\u8bc1\uff08\u6838\u5fc3\u9632\u5fa1\uff0c\u89e3\u51b3&#8221;\u5fd8\u4e86\u68c0\u67e5&#8221;\u7684\u95ee\u9898\uff09<\/h3>\n<p>\u8fd9\u662f\u89e3\u51b3&#8221;\u6bcf\u6b21\u5199\u5b8c SQL \u81ea\u52a8\u68c0\u67e5&#8221;\u7684\u5173\u952e\u673a\u5236\u3002<\/p>\n<h4>\u914d\u7f6e\u6587\u4ef6\u4f4d\u7f6e<\/h4>\n<pre><code>\u6570\u4ed3\u9879\u76ee\u6839\u76ee\u5f55\/\n\u2514\u2500\u2500 .claude\/\n    \u251c\u2500\u2500 settings.json          \u2190 hooks \u5728\u8fd9\u91cc\u914d\u7f6e\n    \u251c\u2500\u2500 CLAUDE.md              \u2190 \u6570\u4ed3\u89c4\u8303\u4e0a\u4e0b\u6587\n    \u2514\u2500\u2500 hooks\/\n        \u251c\u2500\u2500 validate_sql.sh          \u2190 SQL \u89c4\u8303\u81ea\u52a8\u68c0\u67e5\n        \u251c\u2500\u2500 block_dangerous_ddl.sh   \u2190 \u5371\u9669 DDL \u62e6\u622a\n        \u2514\u2500\u2500 inject_context.sh        \u2190 compact \u540e\u91cd\u6ce8\u5165\u4e0a\u4e0b\u6587<\/code><\/pre>\n<h4>settings.json \u5b8c\u6574\u914d\u7f6e<\/h4>\n<pre><code>{&quot;hooks&quot;: {&quot;PostToolUse&quot;: [{&quot;matcher&quot;: &quot;Write|Edit&quot;,&quot;hooks&quot;: [{&quot;type&quot;: &quot;command&quot;,&quot;command&quot;: &quot;\/&quot;$CLAUDE_PROJECT_DIR\/&quot;\/.claude\/hooks\/validate_sql.sh&quot;,&quot;timeout&quot;: 60,&quot;statusMessage&quot;: &quot;\u68c0\u67e5 SQL \u89c4\u8303...&quot;}]}],&quot;PreToolUse&quot;: [{&quot;matcher&quot;: &quot;Bash&quot;,&quot;hooks&quot;: [{&quot;type&quot;: &quot;command&quot;,&quot;command&quot;: &quot;\/&quot;$CLAUDE_PROJECT_DIR\/&quot;\/.claude\/hooks\/block_dangerous_ddl.sh&quot;}]}],&quot;SessionStart&quot;: [{&quot;matcher&quot;: &quot;compact&quot;,&quot;hooks&quot;: [{&quot;type&quot;: &quot;command&quot;,&quot;command&quot;: &quot;cat \/&quot;$CLAUDE_PROJECT_DIR\/&quot;\/.claude\/context\/dw_conventions.md&quot;,&quot;statusMessage&quot;: &quot;\u91cd\u6ce8\u5165\u6570\u4ed3\u89c4\u8303...&quot;}]}],&quot;Stop&quot;: [{&quot;hooks&quot;: [{&quot;type&quot;: &quot;prompt&quot;,&quot;prompt&quot;: &quot;\u68c0\u67e5\u7528\u6237\u8981\u6c42\u7684\u6240\u6709\u4efb\u52a1\u662f\u5426\u90fd\u5df2\u5b8c\u6210\u3002\u5982\u679c\u8fd8\u6709\u672a\u5b8c\u6210\u9879\uff0c\u8fd4\u56de\u63d0\u793a\u4f46\u4e0d\u8981\u91cd\u65b0\u5f00\u59cb\u3002\u68c0\u67e5 stop_hook_active \u662f\u5426\u4e3a true\uff0c\u5982\u662f\u5219\u76f4\u63a5 exit\u3002&quot;,&quot;model&quot;: &quot;claude-haiku-4-5-20251001&quot;}]}]}}<\/code><\/pre>\n<h4>SQL \u89c4\u8303\u81ea\u52a8\u68c0\u67e5\u811a\u672c<\/h4>\n<p>.claude\/hooks\/validate_sql.sh\uff1a<\/p>\n<pre><code>#!\/bin\/bash\nINPUT=$(cat)\nFILE_PATH=$(echo&quot;$INPUT&quot; | python3 -c &quot;import sys,json; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('file_path',''))&quot; 2&gt;\/dev\/null)\n\n# \u53ea\u5904\u7406 .sql \u6587\u4ef6\n[[ &quot;$FILE_PATH&quot; != *.sql ]] &amp;&amp; exit 0\n[[ -z &quot;$FILE_PATH&quot; ]] &amp;&amp; exit 0\n\nSQL=$(cat &quot;$FILE_PATH&quot; 2&gt;\/dev\/null)\n[[ -z &quot;$SQL&quot; ]] &amp;&amp; exit 0\n\nERRORS=()\n\n# \u89c4\u83031\uff1a\u7981\u6b62 SELECT *echo &quot;$SQL&quot; | grep -iqE 'SELECT\/s+\/*' &amp;&amp; ERRORS+=(&quot;CRITICAL: \u53d1\u73b0 SELECT *\uff0c\u5fc5\u987b\u660e\u786e\u5217\u540d&quot;)\n\n# \u89c4\u83032\uff1aINSERT \u5fc5\u987b\u5e26 PARTITIONif echo &quot;$SQL&quot; | grep -iqE 'INSERT\/s+(INTO|OVERWRITE)'; thenecho &quot;$SQL&quot; | grep -iqE 'PARTITION\/s*\/(' || ERRORS+=(&quot;CRITICAL: INSERT \u7f3a\u5c11 PARTITION \u5b50\u53e5&quot;)\nfi# \u89c4\u83033\uff1aDOUBLE \u7c7b\u578b\u91d1\u989decho &quot;$SQL&quot; | grep -iqE '\/bDOUBLE\/b' &amp;&amp; ERRORS+=(&quot;WARNING: \u91d1\u989d\u5b57\u6bb5\u5efa\u8bae\u7528 DECIMAL(20,4)\uff0c\u4e0d\u7528 DOUBLE&quot;)\n\n# \u89c4\u83034\uff1aUPDATE\/DELETE \u5fc5\u987b\u6709 WHEREif echo &quot;$SQL&quot; | grep -iqE '\/b(UPDATE|DELETE)\/b'; thenecho &quot;$SQL&quot; | grep -iqE '\/bWHERE\/b' || ERRORS+=(&quot;CRITICAL: UPDATE\/DELETE \u7f3a\u5c11 WHERE \u6761\u4ef6&quot;)\nfiif [ ${#ERRORS[@]} -gt 0 ]; thenecho &quot;=== SQL \u89c4\u8303\u68c0\u67e5\u5931\u8d25\uff1a$FILE_PATH ===&quot; &gt;&amp;2\n  for err in&quot;${ERRORS[@]}&quot;; doecho &quot;  $err&quot; &gt;&amp;2\n  doneexit 2\nfiecho &quot;SQL \u89c4\u8303\u68c0\u67e5\u901a\u8fc7: $(basename $FILE_PATH)&quot; &gt;&amp;2\nexit 0<\/code><\/pre>\n<h3>\u5371\u9669 DDL \u62e6\u622a\u811a\u672c<\/h3>\n<p>.claude\/hooks\/block_dangerous_ddl.sh\uff1a<\/p>\n<pre><code>#!\/bin\/bash\nINPUT=$(cat)\nCMD=$(echo&quot;$INPUT&quot; | python3 -c &quot;import sys,json; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('command',''))&quot; 2&gt;\/dev\/null)\n\n# \u62e6\u622a\u751f\u4ea7\u8868 DROP\/TRUNCATE\uff08\u653e\u884c _dev\/_test\/_stg \u540e\u7f00\uff09if echo &quot;$CMD&quot; | grep -iqE '\/b(DROP\/s+TABLE|TRUNCATE\/s+TABLE)\/b'; thenif ! echo &quot;$CMD&quot; | grep -qiE '(_dev|_test|_stg)\/b'; thenecho &quot;BLOCKED: \u68c0\u6d4b\u5230\u751f\u4ea7\u8868 DROP\/TRUNCATE \u64cd\u4f5c\uff0c\u8bf7\u786e\u8ba4\u8868\u540d\u662f\u5426\u6b63\u786e&quot; &gt;&amp;2\n    exit 2\n  fifiexit 0<\/code><\/pre>\n<h4>hook \u901a\u4fe1\u534f\u8bae\u5173\u952e\u89c4\u5219<\/h4>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782274\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u5173\u952e\u9677\u9631\uff1a\u963b\u65ad\u5fc5\u987b\u7528 exit 2\uff0c\u7528 exit 1 \u4e0d\u4f1a\u963b\u6b62 Claude \u7ee7\u7eed\u6267\u884c\u3002<\/p>\n<h3>\u7b2c\u56db\u5c42\uff1asubagents \u505a\u4e0a\u4e0b\u6587\u9694\u79bb\uff08\u9632 context \u81a8\u80c0\uff09<\/h3>\n<p>\u6838\u5fc3\u539f\u5219\uff1a\u628a&#8221;\u9ad8 token \u6d88\u8017\u4f46\u7ed3\u679c\u53ea\u9700\u8981\u6458\u8981&#8221;\u7684\u64cd\u4f5c\u653e\u5230 subagent \u7684\u72ec\u7acb context \u4e2d\u6267\u884c\u3002<\/p>\n<p>\u6570\u4ed3\u573a\u666f\u9002\u5408\u4e0b\u653e subagent \u7684\u64cd\u4f5c<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782275\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<h4>\u521b\u5efa subagent \u6587\u4ef6<\/h4>\n<p>.claude\/agents\/sql-validator.md\uff08SQL \u8bed\u6cd5\u9a8c\u8bc1\uff09\uff1a<\/p>\n<pre><code>---\nname: sql-validator\ndescription: ODPS\/MaxCompute SQL \u8bed\u6cd5\u9a8c\u8bc1\u4e0e\u89c4\u8303\u68c0\u67e5\u4e13\u7528 agent\u3002\u5f53\u7528\u6237\u751f\u6210\u6216\u4fee\u6539 SQL \u6587\u4ef6\u540e\u9700\u8981\u9a8c\u8bc1\u65f6\u8c03\u7528\u3002\u5728\u72ec\u7acb context \u8fd0\u884c\uff0c\u9632\u6b62\u5927\u91cf\u9a8c\u8bc1\u65e5\u5fd7\u6c61\u67d3\u4e3b\u5bf9\u8bdd\u3002\ntools: Read, Bash, Grep, Glob\nmodel: haiku\npermissionMode: dontAsk\n---\n\n\u4f60\u662f\u6570\u4ed3 SQL \u89c4\u8303\u4e13\u5bb6\uff0c\u53ea\u505a\u9a8c\u8bc1\uff0c\u4e0d\u4fee\u6539\u6587\u4ef6\u3002\n\n\u9a8c\u8bc1\u9879\uff08\u6309\u4f18\u5148\u7ea7\uff09\uff1a\n1. SELECT * \u7981\u6b62\n2. INSERT \u5fc5\u987b\u5e26 PARTITION\n3. \u5b57\u6bb5\u7528 snake_case \u547d\u540d\n4. \u91d1\u989d\u5b57\u6bb5\u7528 DECIMAL \u4e0d\u7528 DOUBLE\n5. \u591a\u8868 JOIN \u5fc5\u987b\u6709 ON \u6761\u4ef6\n6. \u7b1b\u5361\u5c14\u79ef\u98ce\u9669\u68c0\u6d4b\n\n\u8f93\u51fa\u683c\u5f0f\uff1a\n- \u72b6\u6001\uff1aPASS \/ FAIL\n- \u95ee\u9898\u5217\u8868\uff08CRITICAL \/ WARNING \/ INFO\uff09\n- \u4fee\u6539\u5efa\u8bae\uff08\u5177\u4f53\u5230\u884c\u53f7\uff09\n\n\u4e0d\u8d85\u8fc7 50 \u884c\uff0c\u53ea\u8fd4\u56de\u7ed3\u6784\u5316\u62a5\u544a\u3002<\/code><\/pre>\n<p>.claude\/agents\/dw-explorer.md\uff08\u9632\u6b62\u8840\u7f18\u67e5\u8be2\u6491\u7206\u4e3b context\uff09\uff1a<\/p>\n<pre><code>\n---\nname: dw-explorer\ndescription: \u6570\u4ed3\u7ed3\u6784\u63a2\u7d22 agent\u3002\u5f53\u9700\u8981\u5927\u91cf\u8bfb\u53d6\u8868\u7ed3\u6784\u3001DDL\u3001\u5b57\u6bb5\u4fe1\u606f\u3001\u8840\u7f18\u5173\u7cfb\u65f6\u81ea\u52a8\u8c03\u7528\uff0c\u907f\u514d\u5927\u91cf\u6587\u4ef6\u5185\u5bb9\u6c61\u67d3\u4e3b context\u3002\u53ea\u8bfb\uff0c\u4e0d\u4fee\u6539\u4efb\u4f55\u6587\u4ef6\u3002\ntools: Read, Glob, Grep, Bash\nmodel: haiku\npermissionMode: dontAsk\n---\n\n\u4f60\u662f\u6570\u4ed3\u63a2\u7d22\u4e13\u5bb6\uff0c\u53ea\u8bfb\u64cd\u4f5c\u3002\n\n\u5f53\u88ab\u8c03\u7528\u65f6\uff1a\n1. \u8bfb\u53d6\u6307\u5b9a\u8868\u7684 DDL\u3001\u5b57\u6bb5\u4fe1\u606f\u3001\u5206\u533a\u7b56\u7565\n2. \u5206\u6790\u4e0a\u4e0b\u6e38\u8840\u7f18\uff08\u4e00\u5c42\uff09\n3. \u8bc6\u522b\u5173\u952e\u5b57\u6bb5\u53e3\u5f84\uff08\u91d1\u989d\u3001\u65e5\u671f\u3001\u72b6\u6001\u7c7b\u5b57\u6bb5\uff09\n\n\u8f93\u51fa\uff1a\u4e0d\u8d85\u8fc7 80 \u884c\u7684\u7ed3\u6784\u5316\u6458\u8981\uff0c\u5305\u542b\uff1a\n- \u8868\u57fa\u672c\u4fe1\u606f\uff08\u5c42\u7ea7\u3001\u7c92\u5ea6\u3001\u5206\u533a\u7b56\u7565\uff09\n- \u6838\u5fc3\u5b57\u6bb5\u5b9a\u4e49\uff08\u542b\u53e3\u5f84\u8bf4\u660e\uff09\n- \u4e0a\u4e0b\u6e38\u8840\u7f18\uff08\u53ea\u5217\u8868\u540d\uff0c\u4e0d\u5c55\u5f00\u5185\u5bb9\uff09\n- \u53d1\u73b0\u7684\u7279\u6b8a\u53e3\u5f84\u6216\u8e29\u5751\u70b9<\/code><\/pre>\n<h3>\u4f7f\u7528\u65b9\u5f0f<\/h3>\n<p>\u5728\u4e3b\u5bf9\u8bdd\u4e2d\u81ea\u7136\u89e6\u53d1\uff1a<\/p>\n<pre><code>\u7528 dw-explorer \u5206\u6790 db_a.dwd_table_a \u7684\u7ed3\u6784\n\n\u5bf9\u521a\u751f\u6210\u7684 insert_dws_table_a.sql \u7528 sql-validator \u9a8c\u8bc1<\/code><\/pre>\n<p>\u6216\u5f3a\u5236\u6307\u5b9a\uff08\u907f\u514d Claude \u81ea\u884c\u5224\u65ad\uff09\uff1a<\/p>\n<pre><code>@&quot;sql-validator (agent)&quot; \u9a8c\u8bc1 path\/to\/insert.sql<\/code><\/pre>\n<h3>\u7b2c\u4e94\u5c42\uff1aSKILL \u6587\u4ef6\u6539\u9020\uff08\u51cf\u5c11 context \u6d88\u8017\uff09<\/h3>\n<p>\u5f53\u524d\u7684\u95ee\u9898\uff1a\u6bcf\u6b21\u8c03\u7528 SKILL \u6587\u4ef6\uff0801~08.md\uff09\uff0c\u5185\u5bb9\u5168\u90e8\u52a0\u8f7d\u8fdb\u4e3b context\uff0c\u52a0\u901f compact \u89e6\u53d1\u3002<strong>\u6539\u9020\u65b9\u5411<\/strong>\uff1a\u628a SKILL \u6587\u4ef6\u7684&#8221;\u6267\u884c\u6b65\u9aa4&#8221;\u63d0\u70bc\u6210 subagent \u6307\u4ee4\uff0csubagent \u5185\u90e8\u8bfb\u5b8c\u6574 SKILL \u6587\u4ef6\uff0c\u4e3b context \u53ea\u63a5\u6536\u7ed3\u679c\u6458\u8981\uff1b\u7528 path-scoped rules \u66ff\u4ee3 SKILL \u6587\u4ef6\u4e2d\u7684\u89c4\u8303\u7ae0\u8282\uff0c\u6309\u9700\u52a0\u8f7d\uff1a<\/p>\n<pre><code>---\n# .claude\/rules\/etl-rules.md\npaths:\n  - &quot;**\/*insert*.sql&quot;\n  - &quot;**\/*_di.sql&quot;\n  - &quot;**\/*_df.sql&quot;\n---\n\n# ETL \u5f00\u53d1\u89c4\u8303\uff08\u6309\u6587\u4ef6\u8def\u5f84\u81ea\u52a8\u52a0\u8f7d\uff09\n- \u5fc5\u987b\u6709 partition_dt \u5206\u533a\n- INSERT OVERWRITE \u524d\u68c0\u67e5\u5206\u533a\u662f\u5426\u5df2\u5b58\u5728\n- \u4e0d\u5141\u8bb8\u8de8\u5e93 JOIN<\/code><\/pre>\n<p>SKILL \u6587\u4ef6\u4fdd\u6301\u73b0\u72b6\uff0c\u4f46\u6539\u53d8\u8c03\u7528\u65b9\u5f0f\uff1a\u4e0d\u8981\u5728\u4e3b\u5bf9\u8bdd\u4e2d\u76f4\u63a5\u89e6\u53d1\uff0c\u800c\u662f\u542f\u52a8\u4e00\u4e2a subagent \u6765\u8bfb SKILL \u6587\u4ef6\u6267\u884c ETL\uff0c\u4e3b\u5bf9\u8bdd\u53ea\u63a5\u6536\u6700\u7ec8\u4ea7\u51fa\u7684 SQL \u6587\u4ef6\u8def\u5f84\u3002<\/p>\n<h2>\u4e94\u3001\u53ef\u884c\u843d\u5730\u65b9\u6848\uff1a\u6570\u4ed3 Harness \u67b6\u6784<\/h2>\n<p>\u5148\u8ba9\u6211\u4eec\u770b\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u8bbe\u8ba1\uff08\u6574\u4f53\u67b6\u6784\u56fe\uff09\uff1a<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782276\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u8fd9\u5f20\u67b6\u6784\u56fe\u7684\u6838\u5fc3\u903b\u8f91\u662f<strong>\u804c\u8d23\u5206\u5c42<\/strong>\uff1a\u4e0d\u540c\u7c7b\u578b\u7684\u5de5\u4f5c\u4ea4\u7ed9\u6700\u5408\u9002\u7684\u673a\u5236\u53bb\u505a\uff0c\u800c\u4e0d\u662f\u5168\u90e8\u538b\u5728 Claude \u7684\u63a8\u7406\u5faa\u73af\u91cc\u3002<\/p>\n<p><strong>\u6301\u4e45\u5316\u5c42<\/strong>\u89e3\u51b3\u7684\u662f&#8221;\u5931\u5fc6&#8221;\u95ee\u9898\uff0c\u4efb\u4f55\u4e34\u65f6\u53e3\u5934\u8bf4\u7684\u7ea6\u675f\uff0ccompact \u540e\u90fd\u4f1a\u6d88\u5931\uff1b\u4f46\u5199\u8fdb .claude\/CLAUDE.md \u7684\u5185\u5bb9\uff0c\u6bcf\u6b21\u4f1a\u8bdd\u542f\u52a8\u548c compact \u540e\u90fd\u4f1a\u4ece\u78c1\u76d8\u91cd\u65b0\u6ce8\u5165\u2014\u2014\u8fd9\u662f\u6574\u5957\u65b9\u6848\u91cc\u6700\u7b80\u5355\u4e5f\u6700\u53ef\u9760\u7684\u4e00\u5c42\u3002<\/p>\n<p><strong>Harness \u5c42\uff08Hooks\uff09<\/strong> \u89e3\u51b3\u7684\u662f&#8221;\u89c4\u8303\u9760\u8bb0\u5fc6&#8221;\u7684\u95ee\u9898\uff0cPostToolUse hook \u5728\u6bcf\u6b21\u5199 .sql \u6587\u4ef6\u540e\u786e\u5b9a\u6027\u89e6\u53d1\uff0c\u4e0d\u4f9d\u8d56 Claude \u6709\u6ca1\u6709\u8bb0\u4f4f\u89c4\u8303\u8981\u6c42\uff1b\u8fdd\u89c4\u65f6 exit 2 \u5f3a\u5236\u963b\u65ad\uff0cClaude \u5fc5\u987b\u4fee\u6b63\u540e\u624d\u80fd\u7ee7\u7eed\uff0c\u89c4\u8303\u9075\u5b88\u7387\u4ece 70%80% \u63d0\u5347\u5230 95%+\u3002<\/p>\n<p><strong>Subagent \u5c42<\/strong>\u89e3\u51b3\u7684\u662f&#8221;context \u88ab\u6491\u6ee1&#8221;\u7684\u95ee\u9898\uff0c\u8840\u7f18\u67e5\u8be2\u300123 \u9879\u81ea\u6d4b\u3001\u6570\u636e\u6bd4\u5bf9\u8fd9\u7c7b\u64cd\u4f5c\u4f1a\u4ea7\u751f\u5927\u91cf token\uff0c\u653e\u5230\u72ec\u7acb context \u7684 subagent \u91cc\u6267\u884c\uff0c\u4e3b\u4f1a\u8bdd\u53ea\u63a5\u6536\u4e00\u4efd\u6458\u8981\uff0ccompact \u89e6\u53d1\u9891\u7387\u9884\u8ba1\u964d\u4f4e 50%70%\u3002<\/p>\n<p>\u4e09\u5c42\u673a\u5236\u5206\u5de5\u660e\u786e\uff0c\u4e92\u4e0d\u5e72\u6270\uff1aHooks \u5904\u7406&#8221;\u5199\u52a8\u4f5c\u89e6\u53d1\u7684\u89c4\u8303\u68c0\u67e5&#8221;\uff0csubagent \u5904\u7406&#8221;\u8bfb\u64cd\u4f5c\u7684 context \u9694\u79bb&#8221;\uff0cCLAUDE.md \u5904\u7406&#8221;\u8de8\u4f1a\u8bdd\u72b6\u6001\u6301\u4e45\u5316&#8221;\u3002\u4e3a\u4e86\u914d\u5408\u8fd9\u5957\u67b6\u6784\u843d\u5730\uff0c\u6570\u4ed3\u7684\u7814\u53d1\u6d41\u7a0b\u53ef\u4ee5\u62c6\u89e3\u4e3a 8 \u4e2a\u5927\u7684\u6b65\u9aa4\uff0c\u6d41\u7a0b\u56fe\u5982\u4e0b\uff1a<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782277\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u4ece Harness \u67b6\u6784\u7684\u89c6\u89d2\u6765\u770b\uff0c8 \u4e2a\u6b65\u9aa4\u53ef\u4ee5\u6309&#8221;\u5bf9 context \u7684\u5f71\u54cd&#8221;\u5206\u6210\u4e24\u7c7b\uff1a\u4e00\u7c7b\u662f<strong>\u76f4\u63a5\u5728\u4e3b\u4f1a\u8bdd\u5904\u7406<\/strong>\uff08\u5185\u5bb9\u91cf\u6709\u9650\uff0ccontext \u538b\u529b\u4f4e\uff09\uff1a\u9700\u6c42\u5206\u6790\uff08\u8bfb PRD\uff09\u3001\u6280\u672f\u8bbe\u8ba1\uff08\u5199\u89c4\u8303\u8bf4\u660e\uff09\u3001SR \u5bfc\u5165\uff08\u751f\u6210\u914d\u7f6e\uff09\u3001SLA\/DQC\uff08\u751f\u6210\u89c4\u5219\uff09\u3002\u53e6\u4e00\u7c7b<strong>\u5fc5\u987b\u901a\u8fc7 Harness \u673a\u5236\u5904\u7406<\/strong>\uff08\u5426\u5219\u4f1a\u52a0\u901f compact \u6216\u89c4\u8303\u5931\u63a7\uff09\uff1aETL \u5f00\u53d1\u6bcf\u6b21\u5199 .sql \u6587\u4ef6\uff0cPostToolUse hook \u81ea\u52a8\u89e6\u53d1\u89c4\u8303\u68c0\u67e5\uff0c\u4e0d\u4f9d\u8d56\u4eba\u5de5\u63d0\u9192\uff1b\u81ea\u6d4b\u65f6 23 \u6761 SQL \u7684\u6267\u884c\u7ed3\u679c\u4f53\u91cf\u5927\uff0c\u4ea4\u7ed9 data-quality-checker subagent \u9694\u79bb\uff0c\u4e3b\u4f1a\u8bdd\u53ea\u6536 PASS\/FAIL \u6458\u8981\uff1b\u6570\u636e\u6bd4\u5bf9\u65f6\u4e24\u8868\u6837\u672c\u6570\u636e\u91cf\u5927\uff0c\u4ea4\u7ed9 data-comparator subagent \u9694\u79bb\uff1b\u6027\u80fd\u4f18\u5316\u65f6\u8840\u7f18 + \u591a\u5c42 DDL \u6bcf\u6b21 500~3000 tokens\uff0c\u4ea4\u7ed9 dw-explorer subagent \u9694\u79bb\u3002\u8fd9\u79cd\u5206\u5de5\u4e0d\u662f\u628a\u6b65\u9aa4\u62c6\u5f00\u72ec\u7acb\u6267\u884c\uff0c\u800c\u662f\u5728\u540c\u4e00\u4e2a\u5de5\u4f5c\u6d41\u91cc\uff0c\u8ba9\u6bcf\u4e2a\u6b65\u9aa4\u4ee5\u6700\u5408\u9002\u7684\u65b9\u5f0f\u8fd0\u884c\u2014\u2014context \u538b\u529b\u5c0f\u7684\u6b65\u9aa4\u7559\u5728\u4e3b\u4f1a\u8bdd\u4fdd\u6301\u6d41\u7545\uff0ccontext \u538b\u529b\u5927\u7684\u6b65\u9aa4\u901a\u8fc7 subagent \u9694\u79bb\u4fdd\u6301\u5e72\u51c0\uff0c\u89c4\u8303\u68c0\u67e5\u901a\u8fc7 hook \u81ea\u52a8\u6267\u884c\u4e0d\u9700\u8981\u4eba\u5de5\u5e72\u9884\u3002<\/p>\n<h2>\u516d\u3001\u57fa\u4e8e SKILL \u89c4\u8303\u7684\u6570\u4ed3\u5de5\u4f5c\u6d41\u8bbe\u8ba1<\/h2>\n<p>\u6570\u4ed3 8 \u6b65 SKILL \u89c4\u8303\uff08\u9700\u6c42\u5206\u6790\u2192\u6280\u672f\u8bbe\u8ba1\u2192ETL\u2192\u81ea\u6d4b\u2192\u6570\u636e\u6bd4\u5bf9\u2192SR \u5bfc\u5165\u2192\u6027\u80fd\u4f18\u5316\u2192SLA\/DQC\uff09\u5929\u7136\u5bf9\u5e94 Harness \u7684\u4e09\u5c42\u673a\u5236\u3002\u6838\u5fc3\u601d\u8def\u662f\uff1aSKILL \u6587\u4ef6\u4e0d\u53d8\uff0c\u6539\u53d8\u8c03\u7528\u65b9\u5f0f\u2014\u2014\u4e3b\u5bf9\u8bdd\u53ea\u8bfb\u89c4\u8303\u7ed3\u8bba\uff0c\u5b9e\u9645\u6267\u884c\u7531 subagent \u6216 hook \u5b8c\u6210\u3002<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782278\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<h3>\u5404\u6b65\u9aa4\u63a8\u8350\u63d0\u793a\u8bcd\u4e0e\u5de5\u4f5c\u6d41<\/h3>\n<h4>Step 1\uff1a\u9700\u6c42\u5206\u6790<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff1a<\/p>\n<pre><code>\u7528 dw-explorer subagent \u5148\u8bfb\u53d6\u4e0a\u6e38\u8868\u7ed3\u6784\uff08\u53ea\u8fd4\u56de\u6458\u8981\uff09\uff0c\n\u7136\u540e\u6309\u9700\u6c42\u5206\u6790\u89c4\u8303\u751f\u6210\uff1a\n1. \u9700\u6c42\u6458\u8981\uff08\u22645\u884c\uff09\n2. \u8868\u5b57\u6bb5\u53e3\u5f84\u8349\u7a3f\n3. \u5f85\u786e\u8ba4\u95ee\u9898\u6e05\u5355\uff08\u6309\u4f18\u5148\u7ea7\u6392\u5e8f\uff09\n\u9700\u6c42\u6587\u6863 URL\uff1a[\u7c98\u8d34PRD\u94fe\u63a5]<\/code><\/pre>\n<p>Hook \u914d\u5408\uff1aSessionStart \u6ce8\u5165\u5f53\u524d\u8fed\u4ee3\u7ea6\u675f\uff08\u7248\u672c\u53f7\/\u8868\u540d\/\u7981\u6b62\u4fee\u6539\u7684\u8868\uff09\u3002<\/p>\n<h4>Step 2\uff1a\u6280\u672f\u8bbe\u8ba1<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff1a<\/p>\n<pre><code>\u57fa\u4e8e\u4e0a\u4e00\u6b65\u786e\u8ba4\u7684\u9700\u6c42\uff0c\u6309 OneData \u89c4\u8303\u5b8c\u6210\u6280\u672f\u8bbe\u8ba1\uff1a\n \u8868\u540d\uff1a[\u6309 \u5c42\u7ea7_\u57df_\u4e3b\u9898_\u7c92\u5ea6_\u5468\u671f \u683c\u5f0f\u547d\u540d]\n \u7c92\u5ea6\uff1a[\u63cf\u8ff0]\n \u5206\u533a\uff1apartition_dt string\uff08\u683c\u5f0f yyyyMMdd\uff09\n \u7981\u6b62\uff1a\u4efb\u4f55\u4e0e\u4e0a\u6e38\u4e0d\u4e00\u81f4\u7684\u5b57\u6bb5\u547d\u540d\n\u8f93\u51fa OneData \u5efa\u6a21\u8bf4\u660e\uff0c\u4e0d\u8d85\u8fc7 60 \u884c<\/code><\/pre>\n<p>CLAUDE.md \u5199\u5165\uff08\u8bbe\u8ba1\u5b8c\u6210\u540e\u624b\u52a8\u66f4\u65b0\uff09\uff1a<\/p>\n<pre><code>## \u5f53\u524d\u8fed\u4ee3\u6280\u672f\u8bbe\u8ba1\u51b3\u7b56- \u8868\u540d\uff1adb_a.dws_table_a\n- \u4e3b\u952e\uff1aorder_no + partition_dt\n- \u7279\u6b8a\u7ea6\u675f\uff1aamount \u5b57\u6bb5\u7ee7\u627f\u4e0a\u6e38\u5343\u5143\u5355\u4f4d\uff0c\u4e0d\u505a\u8f6c\u6362<\/code><\/pre>\n<h4>Step 3\uff1aETL \u5f00\u53d1<\/h4>\n<p>\u8fd9\u662f Harness \u5de5\u7a0b\u4ef7\u503c\u6700\u9ad8\u7684\u6b65\u9aa4\uff0cPostToolUse hook \u5728\u6bcf\u6b21 SQL \u6587\u4ef6\u4fdd\u5b58\u65f6\u81ea\u52a8\u89e6\u53d1\u3002<\/p>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff1a<\/p>\n<pre><code>\u6309 ETL \u5f00\u53d1\u89c4\u8303\u751f\u6210\u5efa\u8868 DDL + Insert SQL\uff1a\n- \u5efa\u8868\u6587\u4ef6\uff1addl_[\u8868\u540d].sql\n- \u63d2\u5165\u6587\u4ef6\uff1ainsert_[\u8868\u540d].sql\n- \u8981\u6c42\uff1aINSERT \u7528 OVERWRITE \u6a21\u5f0f\uff0cPARTITION \u5b50\u53e5\u5fc5\u987b\u5305\u542b partition_dt\n- \u91d1\u989d\u5b57\u6bb5\uff1aDECIMAL(20,4)\uff0c\u5355\u4f4d\u7ee7\u627f\u4e0a\u6e38\uff08\u5343\u5143\uff09\n\u751f\u6210\u5b8c\u6bd5\u540e\uff0c\u7528 sql-validator subagent \u9a8c\u8bc1\u4e24\u4e2a\u6587\u4ef6<\/code><\/pre>\n<p>Hook \u81ea\u52a8\u6267\u884c\uff08\u65e0\u9700\u624b\u52a8\u89e6\u53d1\uff09\uff1a\u6bcf\u6b21\u5199\u5165 .sql \u6587\u4ef6 \u2192 PostToolUse hook \u81ea\u52a8\u8fd0\u884c\u89c4\u8303\u68c0\u67e5\u3002\u82e5\u53d1\u73b0 SELECT * \u6216\u7f3a\u5c11 PARTITION \u2192 \u8fd4\u56de exit 2\uff0cClaude \u6536\u5230\u9519\u8bef\u81ea\u52a8\u4fee\u6b63\u3002<\/p>\n<h4>Step 4\uff1a\u81ea\u6d4b<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff08\u9632\u6b62\u81ea\u6d4b\u7ed3\u679c\u6491\u7206\u4e3b context\uff09\uff1a<\/p>\n<pre><code>\u7528 data-quality-checker subagent \u5bf9 [\u8868\u540d] \u6267\u884c 23 \u9879\u6807\u51c6\u81ea\u6d4b\uff0c\nbizdate = [\u65e5\u671f]\n\u8865\u5145\u53e3\u5f84\u7ea6\u675f\uff1a[\u5982&quot;is_perform=1 \u53ea\u53d6\u5c65\u7ea6\u8ba2\u5355&quot;]\n\u53ea\u8fd4\u56de\uff1aPASS\/FAIL \u6c47\u603b + FAIL \u9879\u8be6\u60c5\uff08\u226450\u884c\uff09\uff0c\u4e0d\u8fd4\u56de\u539f\u59cb SQL \u6267\u884c\u7ed3\u679c<\/code><\/pre>\n<p>\u6548\u679c\uff1a23 \u6761 SQL \u7684\u6267\u884c\u7ed3\u679c\u5168\u5728 subagent context \u91cc\uff0c\u4e3b\u5bf9\u8bdd\u53ea\u6536\u5230\u4e00\u4efd\u6458\u8981\u62a5\u544a\u3002<\/p>\n<h4>Step 5\uff1a\u6570\u636e\u6bd4\u5bf9<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff1a<\/p>\n<pre><code>\u7528 data-comparator subagent \u5bf9\u6bd4\uff1a\n \u65b0\u8868\uff1a[\u65b0\u8868\u540d] partition_dt = [\u65e5\u671f]\n \u53c2\u8003\u8868\uff1a[\u65e7\u8868\u540d\/\u7ebf\u4e0a\u8868]\n \u6bd4\u5bf9\u5b57\u6bb5\uff1a[\u6838\u5fc3\u91d1\u989d\u5b57\u6bb5\u5217\u8868]\n \u5bb9\u5dee\uff1a\u2264 0.01%\uff08\u91d1\u989d\u7c7b\uff09\n\u53ea\u8fd4\u56de\uff1a\u5dee\u5f02\u8d85\u8fc7\u5bb9\u5dee\u7684\u5b57\u6bb5\u5217\u8868 + \u5dee\u503c\uff0c\u4e0d\u8fd4\u56de\u5168\u91cf\u5bf9\u6bd4\u6570\u636e<\/code><\/pre>\n<h4>Step 6\uff1aSR\u6570\u636e\u5e93\u5bfc\u5165<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff08\u81ea\u52a8\u751f\u6210\u6700\u4f18\u6570\u636e\u5e93\u5efa\u8868\u53c2\u6570\uff09\uff1a<\/p>\n<pre><code>\u7528 dw-sr SKILL\u751f\u6210\u5efa\u8868\u4efb\u52a1\uff0c \u5148\u67e5\u4ee5\u4e0b\u8868\u7684 DDL \u548c\u4e00\u5c42\u4e0a\u4e0b\u6e38\u8840\u7f18\uff08\u53ea\u8fd4\u56de\u6458\u8981\uff09\uff1a\n- \u6e90\u8868\uff1a[ODPS\u8868\u540d]\n- \u76ee\u6807\u8868\uff1a[SR\u8868\u540d]\n\n\u7136\u540e\u57fa\u4e8e DDL \u6458\u8981\uff0c\u5206\u6790\u5f53\u524d SR \u540c\u6b65\u4efb\u52a1\u7684\u914d\u7f6e\u98ce\u9669\uff1a\n1. \u5b57\u6bb5\u7c7b\u578b\u662f\u5426\u6709\u7cbe\u5ea6\u4e22\u5931\u98ce\u9669\uff08DECIMAL\/DOUBLE \u2192 DECIMAL(38,18)\uff09\n2. Key \u5b57\u6bb5\u9009\u62e9\u662f\u5426\u5408\u7406\uff08\u91cd\u590d\u7387\u662f\u5426\u8fc7\u9ad8\u5bfc\u81f4 DUPLICATE KEY \u81a8\u80c0\uff09\n3. \u5206\u533a\u6570\u91cf\u662f\u5426\u5408\u7406\uff08partition_live_number \u4e0e\u4e0b\u6e38\u67e5\u8be2\u7a97\u53e3\u662f\u5426\u5339\u914d\uff09\n4. DISTRIBUTED BY HASH \u7684 bucket \u6570\u4e0e\u6570\u636e\u91cf\u662f\u5426\u5339\u914d\n5. \u662f\u5426\u6709 DATETIME \u5b57\u6bb5\u5728 SR \u4fa7\u7528\u4e86 VARCHAR \u5b58\u50a8\uff08\u4f1a\u5bfc\u81f4\u65f6\u95f4\u8fc7\u6ee4\u8d70\u5168\u8868\u626b\u63cf\uff09\n\n\u8f93\u51fa\u540c\u6b65\u4efb\u52a1\u914d\u7f6e\u5efa\u8bae\uff08\u6309\u98ce\u9669\u9ad8\u4f4e\u6392\u5e8f\uff09\uff0c\u4e0d\u8d85\u8fc7 20 \u884c\u3002\n\u6bcf\u6761\u683c\u5f0f\uff1a[\u98ce\u9669\u7b49\u7ea7 \u9ad8\/\u4e2d\/\u4f4e] \u95ee\u9898\u63cf\u8ff0 \u2192 \u5efa\u8bae\u4fee\u6539\u65b9\u5f0f<\/code><\/pre>\n<h4>Step 7\uff1a\u6027\u80fd\u4f18\u5316<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff08\u9632\u6b62\u8840\u7f18\u67e5\u8be2\u6491\u7206\u4e3b context\uff09\uff1a<\/p>\n<pre><code>\u7528 dw-explorer subagent \u5148\u67e5 [\u8868\u540d] \u7684\u4e00\u5c42\u4e0a\u4e0b\u6e38\u8840\u7f18\u548c DDL\uff08\u53ea\u8fd4\u56de\u6458\u8981\uff09\uff0c\n\u7136\u540e\u5206\u6790\u5f53\u524d Insert SQL \u7684\u6027\u80fd\u74f6\u9888\uff1a\n1. \u662f\u5426\u6709\u5168\u8868\u626b\u63cf\n2. \u662f\u5426\u6709\u7b1b\u5361\u5c14\u79ef\u98ce\u9669\n3. \u662f\u5426\u53ef\u4ee5\u7528 MAP JOIN \u66ff\u4ee3 HASH JOIN\n\u8f93\u51fa\u4f18\u5316\u5efa\u8bae\uff08\u6309\u6536\u76ca\u6392\u5e8f\uff09\uff0c\u4e0d\u8d85\u8fc7 30 \u884c<\/code><\/pre>\n<h4>Step 8\uff1aSLA\/DQC<\/h4>\n<p>\u63a8\u8350\u63d0\u793a\u8bcd\uff1a<\/p>\n<pre><code>\u6309 SLA\/DQC \u89c4\u8303\u4e3a [\u8868\u540d] \u751f\u6210 9 \u7c7b DQC \u89c4\u5219\uff1a\n \u5b8c\u6574\u6027\uff1a\u4e3b\u952e\u975e\u7a7a\u3001\u5206\u533a\u6570\u636e\u91cf\n \u51c6\u786e\u6027\uff1a\u6838\u5fc3\u91d1\u989d\u5b57\u6bb5\u4e0e\u4e0a\u6e38\u6bd4\u5bf9\uff08\u5bb9\u5dee 0.01%\uff09\n \u4e00\u81f4\u6027\uff1ais_perform \u4e0e perform_flag \u8054\u52a8\u903b\u8f91\n \u65f6\u6548\u6027\uff1a\u4ea7\u51fa\u65f6\u95f4 SLA \u2264 \u6b21\u65e5 8:00\n\u8f93\u51fa DQC \u914d\u7f6e JSON\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528<\/code><\/pre>\n<h3>SKILL \u8c03\u7528\u65b9\u5f0f\u6539\u9020\uff08\u51cf\u5c11\u4e3b context \u6d88\u8017\uff09<\/h3>\n<p>\u5f53\u524d\u95ee\u9898\uff1a\u89e6\u53d1 SKILL \u65f6\uff0cSKILL \u6587\u4ef6\u5168\u6587\uff08\u7ea6 10KB\uff09\u52a0\u8f7d\u8fdb\u4e3b context\uff0c\u52a0\u901f compact\u3002\u6539\u9020\u65b9\u5411\uff1a<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782279\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u6838\u5fc3\u539f\u5219\uff1a\u4e3b\u5bf9\u8bdd\u53ea\u63a5\u6536\u51b3\u7b56\u7ea7\u4fe1\u606f\uff08PASS\/FAIL\u3001\u5dee\u5f02\u5b57\u6bb5\u3001\u4f18\u5316\u65b9\u6848\uff09\uff0c\u4e0d\u63a5\u6536\u8fc7\u7a0b\u6570\u636e\uff08SQL \u6267\u884c\u7ed3\u679c\u3001\u539f\u59cb\u8840\u7f18\u5217\u8868\u3001\u5b8c\u6574 DDL \u5185\u5bb9\uff09\u3002<\/p>\n<h3>\u7cbe\u51c6\u5bf9\u8bdd\u6d41\u8bbe\u8ba1\uff1a\u63a7\u5236AI\u601d\u8003\u7684\u827a\u672f<\/h3>\n<p>\u6587\u7ae0\u4e2d\u591a\u6b21\u63d0\u5230 \/dw-etl\u3001\/dw-\u81ea\u6d4b \u7b49\u547d\u4ee4\uff0c\u8fd9\u662f\u6570\u4ed3\u7814\u53d1\u5168\u6d41\u7a0b SKILL \u5957\u4ef6\u7684\u6838\u5fc3\u89e6\u53d1\u8bcd\uff0c\u6bcf\u4e2a\u547d\u4ee4\u5bf9\u5e94\u4e00\u4e2a\u5c01\u88c5\u4e86\u89c4\u8303\u3001\u4ea7\u51fa\u683c\u5f0f\u548c\u5de5\u5177\u8c03\u7528\u7684\u6807\u51c6\u5316\u6267\u884c\u5355\u5143\u3002\u6838\u5fc3\u7406\u5ff5\uff1a\u628a\u6bcf\u6b21\u90fd\u8981\u91cd\u590d\u8bb2\u7684\u8981\u6c42\u5199\u8fdb SKILL\uff0c\u628a\u6bcf\u6b21\u90fd\u6015\u5fd8\u7684\u68c0\u67e5\u70b9\u5199\u8fdb SKILL\uff0c\u628a\u6bcf\u6b21\u90fd\u9700\u8981\u7684\u7ed3\u6784\u5316\u8f93\u51fa\u4e5f\u5199\u8fdb SKILL\u2014\u2014\u8fd9\u6837\u8c01\u6765\u505a\u9700\u6c42\u90fd\u884c\uff0c\u5e95\u5ea7\u662f\u4e00\u81f4\u7684\u3002<\/p>\n<h4>8 \u4e2a SKILL \u547d\u4ee4\u4e00\u89c8<\/h4>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782280\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u4ee5 \/dw-etl \u4e3a\u4f8b\uff1a\u4e00\u6761\u547d\u4ee4\u5c01\u88c5\u4e86\u4ec0\u4e48\uff1fETL \u5f00\u53d1\uff08Step 3\uff09\u662f Harness \u5de5\u7a0b\u4ef7\u503c\u6700\u9ad8\u7684\u6b65\u9aa4\uff0cSKILL \u6587\u4ef6\u5185\u5c01\u88c5\u4e86\uff1a\u2460 \u89c4\u8303\u5185\u5bb9\uff08\u5199\u6b7b\uff0c\u4e0d\u9760\u8bb0\u5fc6\uff09\uff1a\u5efa\u8868\u89c4\u8303\uff1a\u5206\u533a\u5b57\u6bb5\u5fc5\u987b\u662f partition_dt STRING\uff08\u683c\u5f0f YYYYMMDD\uff09\uff1b\u91d1\u989d\u5b57\u6bb5\uff1aDECIMAL(26,4)\uff0c\u4e0d\u7528 DOUBLE\uff1bINSERT \u6a21\u5f0f\uff1a\u5fc5\u987b\u4f7f\u7528 INSERT OVERWRITE\uff0c\u5fc5\u987b\u5e26 PARTITION \u5b50\u53e5\uff1b\u7981\u6b62\uff1aSELECT *\u3001\u8de8\u5e93 JOIN\uff08\u975e\u8840\u7f18\u5173\u7cfb\uff09\u3002\u2461 \u4ea7\u51fa\u683c\u5f0f\uff08\u7ed3\u6784\u5316\uff0c\u4e0d\u8d70\u6837\uff09\uff1a<\/p>\n<pre><code>\u8f93\u51fa\u6587\u4ef6\uff1a\n\u251c\u2500\u2500 ddl_[\u8868\u540d].sql      \u2190 ODPS \u5efa\u8868\u8bed\u53e5\uff08\u542b\u6ce8\u91ca\u4e09\u6bb5\u5f0f\u3001\u751f\u547d\u5468\u671f\u914d\u7f6e\uff09\n\u251c\u2500\u2500 insert_[\u8868\u540d].sql   \u2190 ODPS Insert SQL\uff08\u542b\u5206\u533a\u88c1\u526a\u3001JOIN \u89c4\u8303\uff09\n\u2514\u2500\u2500 ddl_sr_[\u8868\u540d].sql   \u2190 SR \u5efa\u8868\u8bed\u53e5\uff08Key \u5217\u987a\u5e8f\u3001DECIMAL \u7cbe\u5ea6\uff09<\/code><\/pre>\n<p>\u2462 \u81ea\u52a8\u62a4\u680f\uff08Hook \u914d\u5408\uff09\uff1a\u6bcf\u6b21 .sql \u6587\u4ef6\u5199\u5165\u540e\uff0cPostToolUse hook \u81ea\u52a8\u6267\u884c validate_sql.sh\uff1b\u53d1\u73b0 SELECT * \u6216\u7f3a\u5c11 PARTITION \u2192 exit 2 \u963b\u65ad\uff0cClaude \u5f3a\u5236\u4fee\u6b63\u3002\u2463 subagent \u5378\u8f7d\uff08\u9632 context \u81a8\u80c0\uff09\uff1a&#8221;\u751f\u6210\u5b8c\u6bd5\u540e\uff0c\u7528 sql-validator subagent \u9a8c\u8bc1\u4e24\u4e2a\u6587\u4ef6&#8221;\uff1b\u9a8c\u8bc1\u7ed3\u679c\u5168\u5728 subagent context \u91cc\uff0c\u4e3b\u5bf9\u8bdd\u53ea\u6536\u5230&#8221;PASS\/FAIL + \u95ee\u9898\u5217\u8868&#8221;\u3002\u7efc\u5408\u6548\u76ca\u6570\u636e\uff1a<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782281\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<h2>\u4e03\u3001\u843d\u5730\u6b65\u9aa4<\/h2>\n<p><strong>\u6b65\u9aa4\u4e00<\/strong>\uff1a\u9879\u76ee\u7ea7\u4e0a\u4e0b\u6587\u6301\u4e45\u5316\u3002\u5728\u6570\u4ed3\u9879\u76ee\u76ee\u5f55\u4e0b\u521b\u5efa .claude\/CLAUDE.md\uff0c\u5199\u5165\u5f53\u524d\u8fed\u4ee3\u72b6\u6001\u3002\u6bcf\u6b21\u65b0\u8fed\u4ee3\u5f00\u59cb\u65f6\u66f4\u65b0&#8221;\u6b63\u5728\u5f00\u53d1&#8221;\u548c&#8221;\u672c\u6b21\u8fed\u4ee3\u7ea6\u675f&#8221;\u4e24\u8282\uff0c\u4e0a\u7ebf\u540e\u6e05\u7a7a\u7ea6\u675f\u8282\u3002\u5168\u5c40\u89c4\u8303\u6c38\u4e45\u4fdd\u7559\uff0c\u63a7\u5236\u5728 100 \u884c\u4ee5\u5185\u3002<\/p>\n<p><strong>\u6b65\u9aa4\u4e8c<\/strong>\uff1a\u914d\u7f6e hooks \u81ea\u52a8\u9a8c\u8bc1\u3002\u521b\u5efa .claude\/settings.json + hooks\/ \u76ee\u5f55\uff0c\u914d\u7f6e PostToolUse hook\uff08\u6bcf\u6b21\u5199 .sql \u540e\u81ea\u52a8\u89c4\u8303\u68c0\u67e5\uff09\u548c PreToolUse hook\uff08\u62e6\u622a\u5371\u9669 DDL\uff09\u3002\u6548\u679c\uff1a\u4e0d\u9700\u8981\u6bcf\u6b21\u624b\u52a8\u8bf4&#8221;\u5e2e\u6211\u68c0\u67e5 SQL \u89c4\u8303&#8221;\uff0chook \u5728 Harness \u5c42\u81ea\u52a8\u89e6\u53d1\uff0c\u4e0d\u5360\u7528 Claude \u63a8\u7406\u8d44\u6e90\u3002<\/p>\n<p><strong>\u6b65\u9aa4\u4e09<\/strong>\uff1a\u521b\u5efa subagents \u9694\u79bb\u9ad8 token \u64cd\u4f5c\u3002\u521b\u5efa\u4e09\u4e2a\u6838\u5fc3 subagent \u6587\u4ef6\uff1asql-validator.md\u3001dw-explorer.md\u3001data-quality-checker.md\u3002\u5c06 Step 4\/5\/7 \u7684\u6267\u884c\u5168\u90e8\u4e0b\u653e\uff0c\u9884\u8ba1\u4e3b context compact \u9891\u7387\u964d\u4f4e 50%~70%\u3002<\/p>\n<h2>\u516b\u3001Harness \u5de5\u7a0b\u80fd\u89e3\u51b3\u7684\u6838\u5fc3\u95ee\u9898<\/h2>\n<p>\u8fd9\u4e00\u8282\u662f\u6574\u4e2a\u65b9\u6848\u7684\u51fa\u53d1\u70b9\uff0c\u4e5f\u662f\u5bf9&#8221;\u4e3a\u4ec0\u4e48\u8981\u8fd9\u4e48\u505a&#8221;\u7684\u76f4\u63a5\u56de\u7b54\u3002<\/p>\n<h3>\u6570\u4ed3 AI \u5f00\u53d1\u5f53\u524d\u7684\u672c\u8d28\u74f6\u9888\uff1a\u8bed\u4e49\u7406\u89e3<\/h3>\n<p>\u5728\u5b9e\u9645\u6570\u4ed3 AI \u5f00\u53d1\u4e2d\uff0c\u6280\u672f\u80fd\u529b\u4e0d\u662f\u74f6\u9888\uff0c\u8bed\u4e49\u7406\u89e3\u624d\u662f\u3002\u9700\u6c42\u7406\u89e3\u504f\u5dee\u5360\u603b\u8fd4\u5de5\u7684 40%\uff5e60%\uff0c\u5927\u7ea6 40%\uff5e50% \u7684\u5de5\u4f5c\u65f6\u95f4\u82b1\u5728\u7406\u89e3\u9700\u6c42\u548c\u4e0e\u4e1a\u52a1\u6838\u5bf9\u53e3\u5f84\u4e0a\u3002\u7cbe\u51c6\u8840\u7f18\u63a2\u67e5\uff1a\u51c6\u786e\u7387\u63d0\u5347\u663e\u8457\uff0c\u8fdc\u8d85\u4f20\u7edf\u65b9\u5f0f\u3002\u8fd9\u4e24\u4e2a\u89c2\u5bdf\u63ed\u793a\u4e86\u540c\u4e00\u4e2a\u95ee\u9898\uff1aAI \u5728\u6570\u4ed3\u573a\u666f\u7684\u4e0d\u51c6\u786e\uff0c\u6839\u672c\u539f\u56e0\u4e0d\u662f&#8221;\u4e0d\u4f1a\u5199 SQL&#8221;\uff0c\u800c\u662f&#8221;\u4e0d\u7406\u89e3\u4e1a\u52a1\u8bed\u4e49&#8221;\u2014\u2014\u4e0d\u77e5\u9053\u8fd9\u5f20\u8868\u7684 amount \u5355\u4f4d\u662f\u5343\u5143\u8fd8\u662f\u5143\uff0c\u4e0d\u77e5\u9053 is_perform=1 \u5728\u8fd9\u4e2a\u7248\u672c\u91cc\u610f\u5473\u7740\u4ec0\u4e48\uff0c\u4e0d\u77e5\u9053\u67d0\u5b57\u6bb5\u5728\u7279\u5b9a\u573a\u666f\u4e0b\u4f1a\u4e3a\u7a7a\u3002<\/p>\n<h3>\u8bed\u4e49 \u00d7 \u6570\u636e = \u51c6\u786e\u7387<\/h3>\n<p>\u6570\u4ed3 AI \u5f00\u53d1\u7684\u51c6\u786e\u7387\uff0c\u53ef\u4ee5\u7528\u4e00\u4e2a\u516c\u5f0f\u6765\u7406\u89e3\uff1a<\/p>\n<pre><code>\u51c6\u786e\u7387 = \u8bed\u4e49\u7406\u89e3\u6df1\u5ea6 \u00d7 \u6570\u636e\u89c4\u8303\u8986\u76d6\u5ea6<\/code><\/pre>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782282\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u7ed3\u8bba\uff1aHarness \u5de5\u7a0b\u7684\u672c\u8d28\uff0c\u662f\u628a&#8221;\u8bed\u4e49&#8221;\u548c&#8221;\u89c4\u8303&#8221;\u4ece\u4e0d\u53ef\u9760\u7684 LLM \u8bb0\u5fc6\u4e2d\uff0c\u8fc1\u79fb\u5230\u786e\u5b9a\u6027\u7684 hooks + \u6301\u4e45\u5316\u6587\u4ef6\u91cc\uff0c\u4ece\u800c\u8ba9 \u8bed\u4e49 \u00d7 \u89c4\u8303 = \u51c6\u786e\u7387 \u8fd9\u4e2a\u7b49\u5f0f\u4e24\u8fb9\u7684\u53d8\u91cf\u90fd\u53d8\u5f97\u7a33\u5b9a\u3002<\/p>\n<h3>\u5177\u4f53\u80fd\u89e3\u51b3\u7684\u56db\u7c7b\u95ee\u9898<\/h3>\n<h4>\u95ee\u9898\u4e00\uff1a\u5b57\u6bb5\u53e3\u5f84\u9057\u5fd8\u5bfc\u81f4\u7684\u8ba1\u7b97\u9519\u8bef<\/h4>\n<p>\u73b0\u72b6\uff1a\u5bf9\u8bdd\u5f00\u59cb\u65f6\u544a\u77e5\u4e86&#8221;amount \u5b57\u6bb5\u5355\u4f4d\u662f\u5343\u5143&#8221;\uff0ccompact \u540e Claude \u5fd8\u4e86\uff0c\u751f\u6210\u7684 SQL \u628a\u5343\u5143\u5f53\u5143\u7528\uff0c\u5bfc\u81f4\u6570\u636e\u5dee 1000 \u500d\u3002<strong>Harness \u89e3\u6cd5<\/strong>\uff1a\u5b57\u6bb5\u53e3\u5f84\u5199\u8fdb .claude\/CLAUDE.md\uff08compact \u540e\u91cd\u65b0\u6ce8\u5165\uff09\uff1b\u8e29\u5751\u7ecf\u9a8c\u5199\u8fdb Auto Memory\uff08\u8de8\u4f1a\u8bdd\u6301\u4e45\u5316\uff09\uff1b\u7ed3\u679c\uff1a\u8fd9\u7c7b\u9519\u8bef\u4ece&#8221;\u65f6\u5e38\u53d1\u751f&#8221;\u964d\u5230&#8221;\u57fa\u672c\u4e0d\u51fa\u73b0&#8221;\u3002<\/p>\n<h4>\u95ee\u9898\u4e8c\uff1a\u9700\u6c42\u7406\u89e3\u504f\u5dee\u5bfc\u81f4\u7684\u8fd4\u5de5<\/h4>\n<p>\u73b0\u72b6\uff1a\u9700\u6c42\u6587\u6863\u63cf\u8ff0\u7684\u662f&#8221;\u7528\u6237\u89c6\u89d2\u7684 GMV&#8221;\uff0c\u4f46 AI \u751f\u6210\u4e86&#8221;\u4ea4\u6613\u89c6\u89d2\u7684 GMV&#8221;\uff0c\u4e24\u8005\u53e3\u5f84\u4e0d\u540c\uff0c\u6570\u636e\u5bf9\u4e0d\u4e0a\uff0c\u9700\u8981\u8fd4\u5de5\u3002<strong>Harness \u89e3\u6cd5<\/strong>\uff1a\u9700\u6c42\u5206\u6790\u7684\u4ea7\u51fa\uff08\u53e3\u5f84\u8349\u7a3f + \u5f85\u786e\u8ba4\u95ee\u9898\u6e05\u5355\uff09\u5199\u8fdb CLAUDE.md \u7684\u8fed\u4ee3\u7ea6\u675f\u8282\uff1bStop hook \u68c0\u67e5\u4efb\u52a1\u5b8c\u6574\u6027\uff0c\u786e\u8ba4\u5f85\u786e\u8ba4\u95ee\u9898\u6e05\u5355\u5df2\u5168\u90e8\u660e\u786e\u540e\u624d\u653e\u884c\uff1b\u7ed3\u679c\uff1a\u9700\u6c42\u4e00\u6b21\u4ea4\u4ed8\u901a\u8fc7\u7387\u4ece\u7ea6 50% \u63d0\u5347\u5230 90%\u3002<\/p>\n<h4>\u95ee\u9898\u4e09\uff1aSQL \u89c4\u8303\u6267\u884c\u4e0d\u4e00\u81f4<\/h4>\n<p>\u73b0\u72b6\uff1a\u89c4\u8303\u6587\u6863\u5199\u4e86&#8221;INSERT \u5fc5\u987b\u5e26 PARTITION&#8221;\uff0c\u4f46 Claude \u6709\u65f6\u4f1a\u5fd8\uff0c\u6216\u5728 compact \u540e\u89c4\u8303\u5185\u5bb9\u88ab\u6e05\u9664\u540e\u751f\u6210\u4e0d\u5408\u89c4\u7684 SQL\u3002<strong>Harness \u89e3\u6cd5<\/strong>\uff1aPostToolUse hook \u5728\u6bcf\u6b21\u5199 .sql \u6587\u4ef6\u540e\u81ea\u52a8\u6267\u884c\u89c4\u8303\u68c0\u67e5\uff0c\u4e0d\u4f9d\u8d56 Claude \u8bb0\u5fc6\uff1b\u8fdd\u89c4\u65f6 exit 2 \u8fd4\u56de\u9519\u8bef\uff0cClaude \u5f3a\u5236\u4fee\u6b63\u540e\u624d\u80fd\u7ee7\u7eed\uff1b\u7ed3\u679c\uff1a\u89c4\u8303\u6267\u884c\u7387\u4ece&#8221;\u4f9d\u8d56 LLM \u8bb0\u5fc6\u7684 70%~80%&#8221;\u63d0\u5347\u5230&#8221;hook \u5f3a\u5236\u7684 95%+&#8221;\u3002<\/p>\n<h4>\u95ee\u9898\u56db\uff1a\u5927\u578b\u9700\u6c42\u5f00\u53d1\u4e2d\u7684 context \u8017\u5c3d<\/h4>\n<p>\u73b0\u72b6\uff1a\u590d\u6742\u9700\u6c42\uff08\u5927\u578b\u5bbd\u8868\u3001\u5927\u91cf\u4e0b\u6e38\u8840\u7f18\uff09\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u8840\u7f18\u67e5\u8be2 + \u81ea\u6d4b\u7ed3\u679c + SKILL \u6587\u4ef6\u5185\u5bb9\u5806\u6ee1 context\uff0ccompact \u89e6\u53d1\u540e\u4e22\u5931\u5173\u952e\u7ea6\u675f\uff0cClaude \u5f00\u59cb\u72af\u4f4e\u7ea7\u9519\u8bef\u3002<strong>Harness \u89e3\u6cd5<\/strong>\uff1a\u8840\u7f18\u67e5\u8be2 \u2192 dw-explorer subagent\uff08\u72ec\u7acb context\uff0c\u53ea\u8fd4\u56de\u6458\u8981\uff09\uff1b23 \u9879\u81ea\u6d4b \u2192 data-quality-checker subagent\uff08\u72ec\u7acb context\uff0c\u53ea\u8fd4\u56de PASS\/FAIL \u62a5\u544a\uff09\uff1bSKILL \u6587\u4ef6\u5185\u5bb9 \u2192 subagent \u5185\u90e8\u8bfb\u53d6\uff0c\u4e3b context \u53ea\u63a5\u6536\u4ea7\u51fa\u7684 SQL \u6587\u4ef6\u8def\u5f84\uff1b\u7ed3\u679c\uff1a\u4e3b context compact \u9891\u7387\u9884\u8ba1\u964d\u4f4e 50%~70%\u3002<\/p>\n<h3>\u4e0e\u4f20\u7edf\u6570\u4ed3 AI \u5f00\u53d1\u65b9\u5f0f\u7684\u5bf9\u6bd4<\/h3>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000047782283\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<h3>\u4ece&#8221;AI \u5e2e\u6211\u5199\u4ee3\u7801&#8221;\u5230&#8221;AI \u5d4c\u5165\u7814\u53d1\u6d41\u6c34\u7ebf&#8221;<\/h3>\n<p>Harness \u5de5\u7a0b\u7684\u6700\u7ec8\u76ee\u6807\uff0c\u4e0d\u662f\u8ba9 Claude \u66f4\u806a\u660e\uff0c\u800c\u662f\u8ba9\u6574\u4e2a\u7814\u53d1\u6d41\u6c34\u7ebf\u66f4\u53ef\u9760\u3002Claude\uff08LLM\uff09\u8d1f\u8d23\uff1a\u7406\u89e3\u9700\u6c42\u3001\u8bbe\u8ba1\u65b9\u6848\u3001\u751f\u6210\u4ee3\u7801\u2014\u2014\u8fd9\u4e9b\u9700\u8981\u8bed\u4e49\u7406\u89e3\u7684\u4e8b\uff1bHarness\uff08hooks\uff09\u8d1f\u8d23\uff1a\u89c4\u8303\u68c0\u67e5\u3001\u5371\u9669\u62e6\u622a\u3001\u4efb\u52a1\u5b8c\u6574\u6027\u9a8c\u8bc1\u2014\u2014\u8fd9\u4e9b\u9700\u8981\u786e\u5b9a\u6027\u6267\u884c\u7684\u4e8b\uff1bSubagents \u8d1f\u8d23\uff1a\u5927\u91cf\u6587\u4ef6\u8bfb\u53d6\u3001\u8840\u7f18\u67e5\u8be2\u3001\u81ea\u6d4b\u6267\u884c\u2014\u2014\u8fd9\u4e9b\u4f1a\u6d88\u8017\u5927\u91cf context \u7684\u4e8b\uff1bCLAUDE.md + Memory \u8d1f\u8d23\uff1a\u5b57\u6bb5\u53e3\u5f84\u3001\u8fed\u4ee3\u7ea6\u675f\u3001\u8e29\u5751\u7ecf\u9a8c\u2014\u2014\u8fd9\u4e9b\u9700\u8981\u8de8\u4f1a\u8bdd\u6301\u4e45\u5316\u7684\u4e8b\u3002\u8fd9\u56db\u5c42\u5206\u5de5\uff0c\u8ba9\u6570\u4ed3 AI \u5f00\u53d1\u4ece&#8221;\u5bf9\u8bdd\u9a71\u52a8\u7684\u4e00\u6b21\u6027\u8f85\u52a9&#8221;\u5347\u7ea7\u4e3a&#8221;\u89c4\u5219\u5d4c\u5165\u7684\u6d41\u6c34\u7ebf\u81ea\u52a8\u5316&#8221;\u3002<\/p>\n<h2>\u5f80\u671f\u56de\u987e<\/h2>\n<p>1.<a href=\"https:\/\/segmentfault.com\/a\/1190000047765568\" target=\"_blank\" rel=\"noopener noreferrer\">BP Claw \u7834\u89e3 AI \u7f16\u7801\u8f93\u5165\u96be\u9898 \u2014\u2014FlinkSpec \u9700\u6c42\u667a\u80fd\u5316\u5b9e\u8df5\uff5c\u5f97\u7269\u6280\u672f<\/a><\/p>\n<p>2.<a href=\"https:\/\/segmentfault.com\/a\/1190000047749452\" target=\"_blank\" rel=\"noopener noreferrer\">\u57fa\u4e8e Harness + SDD + \u591a\u4ed3\u7ba1\u7406\u6a21\u5f0f\u7684 AI \u5168\u6808\u5f00\u53d1\u5b9e\u8df5\uff5c\u5f97\u7269\u6280\u672f<\/a><\/p>\n<p>3.<a href=\"https:\/\/segmentfault.com\/a\/1190000047739248\" target=\"_blank\" rel=\"noopener noreferrer\">\u901a\u7528 AI Agent \u9a71\u52a8\u7f51\u5173\u8def\u7531\u5b89\u5168\u5ba1\u8ba1\u5b9e\u8df5\uff5c\u5f97\u7269\u6280\u672f<\/a><\/p>\n<p>4.<a href=\"https:\/\/segmentfault.com\/a\/1190000047725669\" target=\"_blank\" rel=\"noopener noreferrer\">AI\u9a71\u52a8\uff1a\u4ece\u8fd0\u8425\u884c\u4e3a\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u667a\u80fd\u5316\u5b9e\u8df5\uff5c\u5f97\u7269\u6280\u672f<\/a><\/p>\n<p>5.<a href=\"https:\/\/segmentfault.com\/a\/1190000047713252\" target=\"_blank\" rel=\"noopener noreferrer\">\u751f\u6210\u5f0f\u53ec\u56de\u5728\u5f97\u7269\u7684\u843d\u5730\u6280\u672f\u5206\u4eab\u4e0e\u601d\u8003<\/a><\/p>\n<h2>\u6587 \/\u4e39\u514b<\/h2>\n<p>\u5173\u6ce8\u5f97\u7269\u6280\u672f\uff0c\u6bcf\u5468\u66f4\u65b0\u6280\u672f\u5e72\u8d27<\/p>\n<p>\u8981\u662f\u89c9\u5f97\u6587\u7ae0\u5bf9\u4f60\u6709\u5e2e\u52a9\u7684\u8bdd\uff0c\u6b22\u8fce\u8bc4\u8bba\u8f6c\u53d1\u70b9\u8d5e\uff5e<\/p>\n<p>\u672a\u7ecf\u5f97\u7269\u6280\u672f\u8bb8\u53ef\u4e25\u7981\u8f6c\u8f7d\uff0c\u5426\u5219\u4f9d\u6cd5\u8ffd\u7a76\u6cd5\u5f8b\u8d23\u4efb\u3002<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000047782265\">https:\/\/segmentfault.com\/a\/1190000047782265<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001AI Coding \u73b0\u72b6\u4e0e\u75db\u70b9\uff1a\u4e3a\u4ec0\u4e48\u9700\u8981 Harness \u5f53\u524d\u4f7f\u7528\u60c5\u51b5 \u5f97\u7269\u79bb\u7ebf\u6570\u4ed3\u5404\u5c0f\u7ec4\u5df2\u57fa\u672c\u5b8c\u6210 A [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10021364","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10021364","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10021364"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10021364\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10021364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10021364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10021364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}