<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>世界一隅 | 认知能量工程</title>
    <link>/</link>
    <description>Recent content on 世界一隅 | 认知能量工程</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 27 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>那把只属于你的内在尺子</title>
      <link>/posts/systems-thinking/2026-06-27-finale-inner-ruler/</link>
      <pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-27-finale-inner-ruler/</guid>
      <description>维特根斯坦死前说&amp;#34;我度过了极好的一生&amp;#34;，王阳明说&amp;#34;此心光明，亦复何言&amp;#34;——他们用的不是同一把尺子。那你的呢？</description>
    </item>
    
    <item>
      <title>精神生活的&#34;第四维度&#34;</title>
      <link>/posts/systems-thinking/2026-06-26-ch6-fourth-dimension/</link>
      <pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-26-ch6-fourth-dimension/</guid>
      <description>动漫、网文、游戏——这些虚拟叙事不是逃避现实的麻醉剂，而是我们这代人构建精神世界的&amp;#34;新时代童话&amp;#34;。</description>
    </item>
    
    <item>
      <title>从&#34;你应该&#34;到&#34;我想要&#34;</title>
      <link>/posts/systems-thinking/2026-06-25-ch5-from-should-to-want/</link>
      <pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-25-ch5-from-should-to-want/</guid>
      <description>从辞职去看世界到丁克家庭的普及——这不是逃避，而是一场深刻的个体意识觉醒。成功的定义，正从外部指标悄然转向内心感受。</description>
    </item>
    
    <item>
      <title>一场集体的&#34;大逃离&#34;</title>
      <link>/posts/systems-thinking/2026-06-24-ch4-collective-escape/</link>
      <pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-24-ch4-collective-escape/</guid>
      <description>逃向远方、逃回过去、逃入幻想、逃进虚拟——这四种姿态背后，是同一颗想要摆脱内心空虚的心。</description>
    </item>
    
    <item>
      <title>被卡在历史的夹缝里</title>
      <link>/posts/systems-thinking/2026-06-23-ch3-stuck-in-history/</link>
      <pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-23-ch3-stuck-in-history/</guid>
      <description>旧的意义框架已经崩塌，新的尚未建立——我们被卡在了历史的夹缝中，每个人都被迫成为自己的哥伦布。</description>
    </item>
    
    <item>
      <title>当古老本能撞上现代科技</title>
      <link>/posts/systems-thinking/2026-06-22-ch2-instinct-vs-technology/</link>
      <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-22-ch2-instinct-vs-technology/</guid>
      <description>肉身和本能还活在旧脚本里，科技却已冲进新纪元——这道裂痕，才是当代焦虑的真正根源。</description>
    </item>
    
    <item>
      <title>不断脱离本能绑架</title>
      <link>/posts/systems-thinking/2026-06-21-ch1-transcending-instinct/</link>
      <pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-21-ch1-transcending-instinct/</guid>
      <description>人类文明的晋级，玩的是一场不断脱离本能绑架的游戏——从物质的瘾到关系的障到生死的畏，三道天命关卡横在每个人面前。</description>
    </item>
    
    <item>
      <title>思想需要被说出来</title>
      <link>/posts/systems-thinking/2026-06-20-intro-thought-expression/</link>
      <pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-20-intro-thought-expression/</guid>
      <description>思想不是天生的火把，而是碰撞后擦出的火星——它必须先被说出来，才能找到属于它的真理之路。</description>
    </item>
    
    <item>
      <title>终章：你的升维练习</title>
      <link>/posts/systems-thinking/2026-06-19-ch6-dimension-upgrade/</link>
      <pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-19-ch6-dimension-upgrade/</guid>
      <description>读完了别人的故事，现在轮到你了。六个练习，从二维走到三维——不是玄谈，是你可以今天就开始做的事。</description>
    </item>
    
    <item>
      <title>第五章：一个女人的内心战争（下）——觉悟、偏执与觉醒之路</title>
      <link>/posts/systems-thinking/2026-06-18-ch5-qiongyao-part2/</link>
      <pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-18-ch5-qiongyao-part2/</guid>
      <description>觉悟与偏执只有一线之隔。琼瑶晚年看懂了什么？她的觉醒，给我们每一个在爱中迷路的人什么启示？</description>
    </item>
    
    <item>
      <title>第四章：一个女人的内心战争（上）——误读、幻象与敏感的灵魂</title>
      <link>/posts/systems-thinking/2026-06-17-ch4-qiongyao-part1/</link>
      <pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-17-ch4-qiongyao-part1/</guid>
      <description>她一生写了52部爱情小说，但她自己的爱情，却是一场漫长的误读。琼瑶的内心战争，是每一个敏感灵魂的镜子。</description>
    </item>
    
    <item>
      <title>第三章：爱的四种模样</title>
      <link>/posts/systems-thinking/2026-06-16-ch3-four-faces-of-love/</link>
      <pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-16-ch3-four-faces-of-love/</guid>
      <description>爱不是一种东西。它从童年的感受到老年的慈悲，一生会演化出四种截然不同的模样。</description>
    </item>
    
    <item>
      <title>第二章：告别课——在日落之前和解</title>
      <link>/posts/systems-thinking/2026-06-15-ch2-farewell-lesson/</link>
      <pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-15-ch2-farewell-lesson/</guid>
      <description>世界上最有力量的时刻，常常发生在昼夜交替的时分。你能否在太阳下山前，说出那句该说的话？</description>
    </item>
    
    <item>
      <title>第一章：孩子知道答案</title>
      <link>/posts/systems-thinking/2026-06-14-ch1-children-know-answer/</link>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-14-ch1-children-know-answer/</guid>
      <description>所有大人最初都是孩子，只是很少有人记得。5本经典里，孩子比大人更懂幸福。</description>
    </item>
    
    <item>
      <title>AstrBot 公众号被动回复 XML 二次包装导致微信无法解析</title>
      <link>/pitfalls/pit-astrbot-xml-double-wrap/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-astrbot-xml-double-wrap/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;AstrBot 微信公众号被动回复模式：AI 正常生成回复，日志显示 &lt;code&gt;wx buffer hit on trigger&lt;/code&gt; 和 &lt;code&gt;wx first window timeout&lt;/code&gt; 正常打印，&lt;code&gt;cached_xml&lt;/code&gt; 里有值。但用户手机端&lt;strong&gt;永远看不到回复&lt;/strong&gt;。无任何报错日志——微信静默丢弃了回复。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;callback&lt;/code&gt; 函数把 AI 结果用 &lt;code&gt;create_reply()&lt;/code&gt; 转成&lt;strong&gt;完整 XML&lt;/strong&gt; 存入 &lt;code&gt;cached_xml&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# callback 函数中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reply_xml &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(create_reply(result, msg))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;state[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cached_xml&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(reply_xml)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;存储的内容已经是完整 XML：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;xml&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;ToUserName&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;![CDATA[ofqGA2NNjQOqZL3snP_mzNQrGQLM]]&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/ToUserName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;FromUserName&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;![CDATA[gh_bd189357a403]]&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/FromUserName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Content&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;![CDATA[你好，我是AI助手]]&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/Content&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/xml&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但 &lt;code&gt;handle_callback&lt;/code&gt; 从 &lt;code&gt;cached_xml&lt;/code&gt; 取出后，又用 &lt;code&gt;_reply_text()&lt;/code&gt; &lt;strong&gt;再包装一次&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_reply_text&lt;/span&gt;(text: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; str:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reply_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; create_reply(text, msg)  &lt;span style=&#34;color:#75715e&#34;&gt;# 把完整 XML 当作文本再包装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;微信收到嵌套 XML → 无法解析 → 静默丢弃。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么做？&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Cloudreve 上传大文件超时：Cloudflare 免费版 100 秒限制</title>
      <link>/pitfalls/pit-cloudreve-upload-timeout-cloudflare/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-cloudreve-upload-timeout-cloudflare/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Cloudreve 云盘通过 Cloudflare Tunnel 暴露到公网。上传一个 15MB 的文件，浏览器进度条走得很慢，大约 2 分钟后显示&amp;quot;上传失败&amp;quot;。Cloudreve 日志里看不到明显错误。&lt;/p&gt;
&lt;p&gt;换小文件（&amp;lt;5MB）上传正常。大文件必挂。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;请求链路：&lt;/p&gt;



&lt;div class=&#34;goat svg-container &#34;&gt;
  
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      font-family=&#34;Menlo,Lucida Console,monospace&#34;
      
        viewBox=&#34;0 0 608 25&#34;
      &gt;
      &lt;g transform=&#39;translate(8,16)&#39;&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;浏&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;览&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;器&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;C&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;f&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;104&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;C&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;D&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;N&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;(&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;1&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;0&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;0&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;超&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;时&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;)&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;264&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;272&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;280&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;288&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;296&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;304&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;f&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;312&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;320&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;328&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;336&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;344&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;360&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;368&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;376&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;384&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;392&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;400&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;416&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;432&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;D&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;440&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;448&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;456&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;k&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;464&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;472&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;488&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;C&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;496&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;504&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;512&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;520&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;528&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;536&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;544&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;v&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;552&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;560&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;:&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;568&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;5&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;576&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;2&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;584&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;1&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;592&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;2&lt;/text&gt;
&lt;/g&gt;

    &lt;/svg&gt;
  
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 免费版 HTTP 代理有硬性 100 秒超时&lt;/strong&gt;。Cloudreve 默认分块大小较大（如 25MB），在网络慢的情况下，单块上传耗时 125 秒，超过 100 秒限制后 Cloudflare 直接切断连接。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Excel COM wb.Save() 静默失败，必须用 SaveAs</title>
      <link>/pitfalls/pit-excel-com-save-silent-fail/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-excel-com-save-silent-fail/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用 win32com 打开 Excel 文件，批量修改了几百个单元格的值和批注，调用 &lt;code&gt;wb.Save()&lt;/code&gt; 后无任何报错。打开文件一看——所有修改都没了，文件还是原来的样子。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 跑了半小时的修复脚本...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; row &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ws&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Cells(row, col)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Value &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fix_value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ws&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Cells(row, col)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;AddComment(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;原值: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;old&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; → 修复: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;fix&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wb&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Save()   &lt;span style=&#34;color:#75715e&#34;&gt;# ← 静默失败，半小时白干&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wb&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Close()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Excel COM 的 &lt;code&gt;Save()&lt;/code&gt; 方法在以下情况下&lt;strong&gt;静默失败&lt;/strong&gt;（不抛异常、不返回错误码）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;文件来自只读目录&lt;/strong&gt;：微信聊天目录 &lt;code&gt;D:\xwechat_files\...&lt;/code&gt; 下的文件，权限受限&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络路径/UNC 路径&lt;/strong&gt;：&lt;code&gt;\server\share\file.xlsx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件被其他进程打开&lt;/strong&gt;：Excel 自己或其他程序持有文件锁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;磁盘空间不足&lt;/strong&gt;：Save 写入失败但不报错&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;COM 接口的设计缺陷——&lt;code&gt;Save()&lt;/code&gt; 不返回 HRESULT，异常被吞掉。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体步骤，能复制粘贴直接用。&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; win32com.client
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;excel &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; win32com&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Dispatch(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Excel.Application&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;excel&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Visible &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;excel&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;DisplayAlerts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; excel&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Workbooks&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Open(src_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ws &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wb&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Worksheets(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ... 做你的修改 ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ✅ 正确做法：SaveAs 到可写目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;expanduser(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\Desktop\output.xlsx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wb&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;SaveAs(output, FileFormat&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;51&lt;/span&gt;)   &lt;span style=&#34;color:#75715e&#34;&gt;# 51 = xlOpenXMLWorkbook (.xlsx)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wb&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Close(SaveChanges&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;)        &lt;span style=&#34;color:#75715e&#34;&gt;# 已经 SaveAs 过了，不重复保存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;excel&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Quit()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键参数&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Git push GitHub SSL 握手失败</title>
      <link>/pitfalls/pit-git-push-ssl-proxy-fix/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-git-push-ssl-proxy-fix/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; 到 GitHub 报错：&lt;code&gt;fatal: unable to access &#39;https://github.com/...&#39;: SSL connection error&lt;/code&gt; 或 &lt;code&gt;TLS handshake failed&lt;/code&gt;。每次 push 都失败，ping 不通 GitHub。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;真正的原因是什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Windows 环境下，Git 不会自动走系统代理（Clash/V2Ray）。之前只在单仓库设了 &lt;code&gt;http.proxy&lt;/code&gt;，其他仓库和全局 &lt;code&gt;.gitconfig&lt;/code&gt; 都没设，每次在新仓库 push 都重复踩坑。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体怎么修的？&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global http.proxy http://127.0.0.1:7897
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global https.proxy http://127.0.0.1:7897
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;设完立刻生效，所有仓库自动走代理。当前 Clash 代理端口是 7897，如果你的代理端口不同需要改。&lt;/p&gt;
&lt;h2 id=&#34;怎么避免&#34;&gt;怎么避免&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;下次怎么不踩？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;新机器/新系统第一件事：跑上面两行命令&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;git config --global --list | grep proxy&lt;/code&gt; 确认已设&lt;/li&gt;
&lt;li&gt;别用单仓库 &lt;code&gt;--local&lt;/code&gt;，那是坑的根源&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Gitee 已配镜像还手动 push gitee，做了多余操作</title>
      <link>/pitfalls/pit-gitee-mirror-dual-push/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-gitee-mirror-dual-push/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;每次 &lt;code&gt;git commit&lt;/code&gt; 后都跑 &lt;code&gt;git push origin master &amp;amp;&amp;amp; git push gitee master&lt;/code&gt;，两条命令都成功。实际上 Gitee 那边早已配置了从 GitHub 自动镜像同步，push origin 之后 Gitee 会自动拉取。手动再 push gitee 不仅多余，还可能在极端情况下导致冲突。&lt;/p&gt;
&lt;p&gt;更严重的是：&lt;code&gt;git remote&lt;/code&gt; 里 gitee 的 URL 硬编码了 token（&lt;code&gt;Zhaotianbibg1:cfe33...@gitee.com&lt;/code&gt;），每次 push 都明文传输。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不知道镜像已配&lt;/strong&gt;：Gitee 后台配了 GitHub → Gitee 镜像后，没有删掉本地的 gitee remote&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;习惯性操作&lt;/strong&gt;：之前手动 push 两个 remote 形成习惯，没人提醒就一直做&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有&amp;quot;查 remote 列表 → 确认是否冗余&amp;quot;的检查步骤&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么做？&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 删掉 gitee remote（镜像自动同步，不需要手动 push）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote remove gitee
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 确认只剩下 origin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# origin  https://github.com/zhao818/claude-memory.git (fetch)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# origin  https://github.com/zhao818/claude-memory.git (push)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以后只推 GitHub：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Gitee 建仓库前没查已有仓库，建了重复仓库</title>
      <link>/pitfalls/pit-gitee-duplicate-repo-check/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-gitee-duplicate-repo-check/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;踩坑共享平台需要 Gitee 镜像。在 Gitee 上新建了 &lt;code&gt;pitfall-knowledge-base&lt;/code&gt; 仓库，配置了 GitHub → Gitee 镜像同步。后来发现用户早就有 &lt;code&gt;claude-memory&lt;/code&gt; 仓库，功能完全重叠——&lt;code&gt;claude-memory&lt;/code&gt; 本身就是踩坑知识库。&lt;/p&gt;
&lt;p&gt;结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多了一个无用仓库，要手动删除&lt;/li&gt;
&lt;li&gt;镜像同步配置白做了&lt;/li&gt;
&lt;li&gt;概念混乱：哪个仓库才是真的？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不查就建&lt;/strong&gt;：建仓库前没跑 &lt;code&gt;gh repo list zhao818&lt;/code&gt; 或登录 Gitee 看已有仓库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命名冲动&lt;/strong&gt;：想了一个&amp;quot;好听的名字&amp;quot;就建了，没考虑是否和已有仓库功能重叠&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平台不统一&lt;/strong&gt;：GitHub 一个名、Gitee 一个名，镜像对不齐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有&amp;quot;先确认再行动&amp;quot;的肌肉记忆&lt;/strong&gt;：对平台操作的敬畏不够&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体步骤。&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 先查 GitHub 上已有的仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gh repo list zhao818 --limit &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 再查 Gitee 上已有的仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 浏览器打开 https://gitee.com/Zhaotianbibg1 → 看仓库列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3. 确认没有同名/同功能仓库后，再建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# GitHub → Settings → Developer settings → Personal access tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Gitee → 设置 → 私人令牌&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4. 名称对齐：GitHub 和 Gitee 用同一个仓库名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# GitHub: zhao818/claude-memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Gitee:  Zhaotianbibg1/claude-memory  ← 对齐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;删除多余仓库后，重新配置镜像：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>GNU sed a 命令中 
 被当字面量——假阳性验证导致以为修好实际没修</title>
      <link>/pitfalls/pit-sed-false-positive-verification/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-sed-false-positive-verification/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用 &lt;code&gt;deploy_fix4.sh&lt;/code&gt; 部署修复到 AstrBot 后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sed 命令执行成功（exit 0）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -q &amp;quot;nonce = None&amp;quot;&lt;/code&gt; 验证通过（匹配到关键字）&lt;/li&gt;
&lt;li&gt;服务器重启后返回 &lt;strong&gt;500 错误&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用户以为修好了，实际服务器崩了。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;部署脚本用了 GNU sed 的 &lt;code&gt;a\&lt;/code&gt;（append）命令插入多行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/match_line/a\            nonce = None\n            timestamp = None&amp;#34;&lt;/span&gt; target.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 GNU sed 的 &lt;code&gt;a\&lt;/code&gt; 命令中，&lt;code&gt;\n&lt;/code&gt; 被当作&lt;strong&gt;字面量&lt;/strong&gt;（反斜杠 + n），而非换行符。实际写入的是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nonce &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;\n            timestamp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# ← 全在 1 行！Python 语法错误&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但 &lt;code&gt;grep -q &amp;quot;nonce = None&amp;quot;&lt;/code&gt; 验证&lt;strong&gt;仍然匹配成功&lt;/strong&gt; → &lt;strong&gt;假阳性验证&lt;/strong&gt;。关键字在，代码是错的。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么做？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用 &lt;strong&gt;Python 做文件替换&lt;/strong&gt;，精确控制，不用 sed 多行命令：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Hugo 手写单篇 HTML 跳过全量构建导致分类/列表页不更新</title>
      <link>/pitfalls/pit-hugo-skip-full-build/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-hugo-skip-full-build/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;新文章 URL 可以正常访问（&lt;code&gt;/posts/xxx/&lt;/code&gt; 能打开），但：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分类页看不到这篇文章&lt;/li&gt;
&lt;li&gt;首页最新文章列表没有它&lt;/li&gt;
&lt;li&gt;所有聚合/列表页都不知道这篇文章存在&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用户从分类入口进来找不到文章，以为没发布。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Hugo 是一个&lt;strong&gt;全量静态站点生成器&lt;/strong&gt;——每篇文章的交叉引用、分类聚合、列表渲染，都需要 &lt;code&gt;hugo -d docs/&lt;/code&gt; 重新计算。手写单篇 HTML 扔进 &lt;code&gt;docs/&lt;/code&gt; 相当于绕过了整个生成引擎：&lt;/p&gt;



&lt;div class=&#34;goat svg-container &#34;&gt;
  
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      font-family=&#34;Menlo,Lucida Console,monospace&#34;
      
        viewBox=&#34;0 0 480 41&#34;
      &gt;
      &lt;g transform=&#39;translate(8,16)&#39;&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;❌&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;✅&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;手&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;写&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;g&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;H&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;T&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;M&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;L&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;104&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;104&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;p&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;x&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;x&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;x&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;240&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;x&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;256&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;.&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;264&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;272&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;280&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;288&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;320&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;←&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;336&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;文&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;336&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;←&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;344&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;章&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;352&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;在&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;352&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;所&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;360&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;，&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;360&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;有&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;368&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;但&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;368&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;页&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;376&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;分&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;376&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;面&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;384&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;类&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;384&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;同&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;392&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;392&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;步&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;400&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;列&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;400&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;重&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;408&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;表&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;408&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;建&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;416&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;424&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;首&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;432&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;页&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;440&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;从&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;448&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;不&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;456&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;更&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;464&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;新&lt;/text&gt;
&lt;/g&gt;

    &lt;/svg&gt;
  
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;这个错误已经犯过至少 3 次&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Python encoding=&#39;utf-8&#39; 不能自动处理 BOM</title>
      <link>/pitfalls/pit-python-utf8-bom-encoding/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-python-utf8-bom-encoding/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;config.txt&amp;#34;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GITEE_TOKEN=&amp;#34;&lt;/span&gt;):  &lt;span style=&#34;color:#75715e&#34;&gt;# ← 永远不匹配&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            token &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;strip()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文件明明以 &lt;code&gt;GITEE_TOKEN=cfe33...&lt;/code&gt; 开头，但 &lt;code&gt;startswith&lt;/code&gt; 永远返回 False，令牌读不到。打了 &lt;code&gt;print(repr(line))&lt;/code&gt; 才发现行首有 &lt;code&gt;﻿&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;真正的原因是什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Windows 下某些工具（记事本、PowerShell &lt;code&gt;Out-File&lt;/code&gt;、部分 IDE）保存 UTF-8 文件时会在文件头加 BOM（Byte Order Mark，&lt;code&gt;﻿&lt;/code&gt;）。Python 的 &lt;code&gt;encoding=&#39;utf-8&#39;&lt;/code&gt; 不会自动跳过 BOM，它被当作第一个字符读进去。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体怎么修的？&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ❌ 错误&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;config.txt&amp;#34;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ✅ 正确——自动跳过 BOM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;config.txt&amp;#34;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8-sig&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一行之差，三天之坑。&lt;/p&gt;
&lt;h2 id=&#34;怎么避免&#34;&gt;怎么避免&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;下次怎么不踩？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;读配置文件、.env、用户输入文件时，默认用 &lt;code&gt;utf-8-sig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;调试编码问题第一招：&lt;code&gt;print(repr(line))&lt;/code&gt; 看原始字符&lt;/li&gt;
&lt;li&gt;如果不想改 encoding，可以手动 &lt;code&gt;line.lstrip(&#39;﻿&#39;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Python 缩进错位导致 140 行被动回复代码完全跳过</title>
      <link>/pitfalls/pit-python-indentation-silent-skip/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-python-indentation-silent-skip/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;AstrBot 微信公众号适配器中，被动回复模式（&lt;code&gt;active_send_mode=False&lt;/code&gt;）完全不工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户发消息到公众号 → 无任何回复&lt;/li&gt;
&lt;li&gt;日志报 &lt;code&gt;TypeError: The response value returned by the view function cannot be None&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;调试器中 AI 回复正常，部署后就是不行&lt;/li&gt;
&lt;li&gt;检查了所有逻辑，没发现问题——代码&amp;quot;看起来&amp;quot;都在&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# handle_callback 方法的末尾&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;active_send_mode:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result_xml &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;callback(msg)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; result_xml:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 以下 140 行被动回复代码...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from_user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(getattr(msg, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    to_user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(getattr(msg, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# ... 100+ 行逻辑 ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; reply_xml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ← handle_callback 结束，但没有任何 return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;140 行被动回复代码的缩进是 &lt;strong&gt;12 个空格&lt;/strong&gt;，对应 3 级缩进（4+4+4），错误地放在了 &lt;code&gt;if self.active_send_mode:&lt;/code&gt; 块&lt;strong&gt;内部&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>python-docx 表格跨页断开无法控制</title>
      <link>/pitfalls/pit-docx-table-page-break-cantsplit/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-docx-table-page-break-cantsplit/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用 python-docx 生成的报告，表格在页面底部被 Word 自动劈成两半——表头在上页，数据在下页。读者看到断裂的表格，专业性大打折扣。手动在 Word 里调整也调不好。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;真正的原因是什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;python-docx 创建的表格行，默认没有设置 &lt;code&gt;&amp;lt;w:cantSplit/&amp;gt;&lt;/code&gt; 属性。Word 打开文档后，按自己的分页算法决定是否断开表格——如果表格行正好落在页面底部，Word 就会把它断开。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这是 python-docx 的默认行为缺陷，不是 Word 的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体怎么修的？&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; docx &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Document
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; docx.oxml.ns &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; qn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;doc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Document()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;table &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_table(rows&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, cols&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 关键：给每一行设 cantSplit，禁止跨页断开&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; row &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rows:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; row&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_tr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    trPr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tr&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_or_add_trPr()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cant_split &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OxmlElement(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;w:cantSplit&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    trPr&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(cant_split)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;output.docx&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样生成的表格不会在页面中间断开，Word 会把整行推到下一页。&lt;/p&gt;
&lt;h2 id=&#34;怎么避免&#34;&gt;怎么避免&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;下次怎么不踩？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;生成 docx 表格时，所有行显式设 &lt;code&gt;cantSplit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;目录（TOC）不要手动写，用 Word 域代码 &lt;code&gt;TOC \o &amp;quot;1-3&amp;quot;&lt;/code&gt; 生成&lt;/li&gt;
&lt;li&gt;参考 &lt;code&gt;~/claude-memory/global/tools/docx-patterns.md&lt;/code&gt; 的完整模式&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>requests json= 参数导致公众号中文乱码</title>
      <link>/pitfalls/pit-wechat-chinese-garbled-requests-json/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-wechat-chinese-garbled-requests-json/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;公众号推送文章草稿后，读者看到的中文全部变成 &lt;code&gt;我是&lt;/code&gt; 这样的 Unicode 转义序列。微信后台预览正常，但推送后乱码。踩了 3 次才修好。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;真正的原因是什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;requests.post(url, json=data)&lt;/code&gt; 内部调用 &lt;code&gt;json.dumps(data)&lt;/code&gt; 时，默认参数 &lt;code&gt;ensure_ascii=True&lt;/code&gt;，会把所有非 ASCII 字符转成 &lt;code&gt;\uXXXX&lt;/code&gt;。微信服务器收到后原样展示，不会反转义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这不是微信的 bug，是 requests 的默认行为。&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# requests 内部等价于：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dumps(data, ensure_ascii&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;# 中文 → \uXXXX&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 发送给微信：{&amp;#34;content&amp;#34;: &amp;#34;我是中文&amp;#34;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 微信原样展示：我是中文&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体怎么修的？&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ❌ 错误——中文变乱码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;post(url, json&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ✅ 正确&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;headers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;application/json; charset=utf-8&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;post(url, data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dumps(data, ensure_ascii&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;encode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;), headers&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;headers)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键三步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ensure_ascii=False&lt;/code&gt; — 中文保持原样&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.encode(&#39;utf-8&#39;)&lt;/code&gt; — 转成字节&lt;/li&gt;
&lt;li&gt;手动设 &lt;code&gt;Content-Type: application/json; charset=utf-8&lt;/code&gt; — 告诉服务器编码&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;怎么避免&#34;&gt;怎么避免&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;下次怎么不踩？&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>TRIGGERS 多场景同时命中时只读第一条，漏了后续路由</title>
      <link>/pitfalls/pit-triggers-multi-match-merge/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-triggers-multi-match-merge/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用户说&amp;quot;审计五件套&amp;quot;来审计一个 Excel 文件。这是一个&lt;strong&gt;数据录入项目&lt;/strong&gt;，TRIGGERS.md 有两条路由同时命中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;审计五件套 / 跑审计&amp;rdquo; → 加载 &lt;code&gt;audit-four-piece.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;数据录入项目&amp;rdquo; → 加载 &lt;code&gt;audit-four-piece-data.md&lt;/code&gt;、&lt;code&gt;excel-com-audit.md&lt;/code&gt;、&lt;code&gt;data-cross-verify.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但实际操作中只读了第一条（通用版），漏了数据版三条。用户提醒&amp;quot;我记得优化过你的记忆啊，为什么还做不到&amp;quot;——因为之前已经修过这个问题，但触发匹配逻辑没改彻底。&lt;/p&gt;
&lt;p&gt;后果：跑完审计流程后，数据特有的坑（收支=明细交叉验证、实发=应发检查、Excel COM 修复模式）全部没做。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;匹配策略是&amp;quot;命中即停&amp;quot;&lt;/strong&gt;：扫到第一个匹配行就停下来加载了，没继续往下扫&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有 OR → AND 的思维转换&lt;/strong&gt;：多条路由匹配同一任务时，取的文件应该是&lt;strong&gt;并集（AND）&lt;/strong&gt;，不是&lt;strong&gt;第一个命中（OR）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TRIGGERS 表设计有盲区&lt;/strong&gt;：通用路由和专用路由分开写，但加载逻辑没做合并&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事后没自检&lt;/strong&gt;：加载完文件后没问自己&amp;quot;用户说的是审计+Excel，我有没有读 Excel 相关的路由？&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么做？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;匹配策略改为&amp;quot;全量扫描 + AND 合并&amp;quot;&lt;/strong&gt;：&lt;/p&gt;



&lt;div class=&#34;goat svg-container &#34;&gt;
  
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      font-family=&#34;Menlo,Lucida Console,monospace&#34;
      
        viewBox=&#34;0 0 256 73&#34;
      &gt;
      &lt;g transform=&#39;translate(8,16)&#39;&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;输&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;匹&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;合&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;加&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;入&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;配&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;并&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;载&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;：&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;：&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;：&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;：&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;用&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;扫&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;取&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;读&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;户&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;描&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;所&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;全&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;消&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;有&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;部&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;息&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;T&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;匹&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;匹&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;关&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;R&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;配&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;配&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;键&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;I&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;路&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;文&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;词&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;G&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;由&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;52&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;件&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;G&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;的&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;E&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;并&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;R&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;集&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;104&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;S&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;.&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;全&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;部&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;行&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;，&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;收&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;集&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;所&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;有&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;匹&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;配&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;的&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;路&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;240&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;由&lt;/text&gt;
&lt;/g&gt;

    &lt;/svg&gt;
  
&lt;/div&gt;
&lt;p&gt;例如用户说&amp;quot;审计这个 Excel&amp;quot;：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>WSL 环境下 Claude Code Write 工具和 Bash 工具路径空间不一致</title>
      <link>/pitfalls/pit-wsl-write-tool-path-failure/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-wsl-write-tool-path-failure/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用 &lt;code&gt;Write&lt;/code&gt; 工具写文件到 &lt;code&gt;~/claude-memory/pitfalls/xxx.md&lt;/code&gt;（或用绝对路径 &lt;code&gt;/home/zhaotianbing/claude-memory/...&lt;/code&gt;），工具报告成功，无报错。但 &lt;code&gt;ls ~/claude-memory/pitfalls/&lt;/code&gt; 看不到新文件。&lt;/p&gt;
&lt;p&gt;实际上本次会话就复现了：5 篇新踩坑用 Write 工具写完后，Bash 下全部找不到。最后用 Bash 重新写入才正确落盘。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;核心矛盾：&lt;strong&gt;当前会话的 &lt;code&gt;$HOME&lt;/code&gt; 是 &lt;code&gt;/c/Users/zhaot&lt;/code&gt;（Windows 侧），但 &lt;code&gt;Write&lt;/code&gt; 工具把 &lt;code&gt;/home/zhaotianbing/&lt;/code&gt; 路径解析到了 WSL 原生 Linux 文件系统&lt;/strong&gt;。&lt;/p&gt;



&lt;div class=&#34;goat svg-container &#34;&gt;
  
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      font-family=&#34;Menlo,Lucida Console,monospace&#34;
      
        viewBox=&#34;0 0 656 41&#34;
      &gt;
      &lt;g transform=&#39;translate(8,16)&#39;&gt;
&lt;path d=&#39;M 216,16 L 224,0&#39; fill=&#39;none&#39; stroke=&#39;currentColor&#39;&gt;&lt;/path&gt;
&lt;circle cx=&#39;224&#39; cy=&#39;0&#39; r=&#39;6&#39; stroke=&#39;currentColor&#39; fill=&#39;#fff&#39;&gt;&lt;/circle&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;B&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;W&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;工&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;具&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;工&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;：&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;具&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;$&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;：&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;H&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;O&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;M&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;E&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;104&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;z&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;U&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;b&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;z&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;g&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;240&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;256&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;264&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;~&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;264&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;272&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;272&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;280&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;280&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;288&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;288&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;296&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;296&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;304&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;304&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;312&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;312&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;320&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;320&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;y&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;328&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;336&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;336&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;344&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;352&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;352&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;W&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;360&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;360&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;S&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;368&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;368&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;L&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;376&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;y&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;384&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;原&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;392&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;392&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;生&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;408&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;408&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;F&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;416&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;416&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;S&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;424&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;432&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;U&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;432&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;→&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;440&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;448&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;448&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;文&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;456&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;456&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;件&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;464&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;464&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;孤&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;472&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;472&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;立&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;480&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;z&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;488&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;h&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;488&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;❌&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;496&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;504&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;512&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;520&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;528&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;536&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;544&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;552&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;560&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;568&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;576&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;584&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;592&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;600&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;608&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;616&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;624&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;y&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;640&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;✅&lt;/text&gt;
&lt;/g&gt;

    &lt;/svg&gt;
  
&lt;/div&gt;
&lt;p&gt;两个工具的路径空间不一致 → Write 写入的位置和 Bash 读写的位置不同。Read 工具走了不同的解析路径所以能读到 Write 写的文件，但 Bash 看不到。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>公众号明文模式下 nonce/timestamp 非空导致回复被错误加密</title>
      <link>/pitfalls/pit-wechat-plaintext-falsely-encrypted/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-wechat-plaintext-falsely-encrypted/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;微信后台配置为「明文模式」。修复了 XML 二次包装后，日志无报错、AI 正常生成回复、&lt;code&gt;cached_xml&lt;/code&gt; 有值——但用户手机端仍然看不到任何自动回复。表现和 XML 嵌套完全一样，给排查造成极大困扰。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;到底为什么出问题？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;_maybe_encrypt()&lt;/code&gt; 函数不关心当前模式，只检查 &lt;code&gt;nonce&lt;/code&gt; 和 &lt;code&gt;timestamp&lt;/code&gt; 是否存在：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_maybe_encrypt&lt;/span&gt;(self, xml, nonce, timestamp):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; xml &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;Encrypt&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; xml &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; nonce &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; timestamp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;crypto&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;encrypt_message(xml, nonce, timestamp)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; xml &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;微信在明文模式下的 POST 请求 URL 中仍然携带 &lt;code&gt;nonce&lt;/code&gt; 和 &lt;code&gt;timestamp&lt;/code&gt; 参数&lt;/strong&gt;（用于 URL 签名验证，不是加解密），所以条件 &lt;code&gt;nonce and timestamp&lt;/code&gt; 为真 → 执行加密 → 微信收到 &lt;code&gt;&amp;lt;Encrypt&amp;gt;&lt;/code&gt; 标签的密文 → 明文模式下无法解析 → 静默丢弃 → 用户永远看不到回复。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么做？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;两层防护：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一层&lt;/strong&gt;：明文模式分支中置空 nonce/timestamp：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; msg_signature:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;明文模式，直接解析消息。&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; parse_message(data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nonce &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;       &lt;span style=&#34;color:#75715e&#34;&gt;# ← 置空，跳过加密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    timestamp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# ← 置空，跳过加密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第二层&lt;/strong&gt;：增加类级别 &lt;code&gt;_is_encrypted&lt;/code&gt; 标志：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>长时间规划结束忘记 commit 丢失进度</title>
      <link>/pitfalls/pit-plan-lost-not-committed/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/pitfalls/pit-plan-lost-not-committed/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;你看到什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;和 AI 协作做了一整套书籍架构规划（章节设计、字数分配、主题方向），会话正常结束。下次开工发现：规划文件没 commit，本地修改丢了（或被覆盖）。全部重来。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;真正的原因是什么？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;人的注意力在&amp;quot;思考规划内容&amp;quot;上，不在&amp;quot;保存规划结果&amp;quot;上。规划过程可能持续几十分钟到几小时，期间一直在输出和修改，但 &lt;code&gt;git commit&lt;/code&gt; 不在意识里。会话结束时，要么忘了 commit，要么会话异常退出导致未保存的修改丢失。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本质：规划和保存是两个独立动作，大脑把&amp;quot;想完了&amp;quot;误认为&amp;quot;存好了&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;具体怎么修的？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;建立纪律：&lt;strong&gt;规划完成一个阶段 → 立刻 commit，10 秒的事。&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 不要等到&amp;#34;全部做完&amp;#34;，每完成一个可独立交付的片段就：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add projects/xxx.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;docs: xxx 架构初版完成——章节+字数分配&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体到 AI 协作场景：让 AI 在每次完成阶段性规划后主动 commit，不等人提醒。&lt;/p&gt;
&lt;h2 id=&#34;怎么避免&#34;&gt;怎么避免&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;下次怎么不踩？&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;铁律：规划做完立刻存仓库，不等会话结束&lt;/strong&gt;（已写入 &lt;code&gt;~/claude-memory/global/feedback/plan-must-commit-immediately.md&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;AI 协作时，要求 AI 主动 commit，不允许&amp;quot;等会话结束时再存&amp;quot;&lt;/li&gt;
&lt;li&gt;每完成一个可独立交付的片段就 commit，把 commit 当保存键用&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>阅读指南：为什么文学比心理学更懂人心</title>
      <link>/posts/systems-thinking/2026-06-13-intro-literary-happiness/</link>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-13-intro-literary-happiness/</guid>
      <description>文学经典不是用来分析的理论，而是我们已经历过却尚未理解的人生。</description>
    </item>
    
    <item>
      <title>人生的向外与向内</title>
      <link>/posts/systems-thinking/outward-and-inward/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/outward-and-inward/</guid>
      <description>帝王将相追逐的是向外，思想家探索的是向内。你选哪条路？</description>
    </item>
    
    <item>
      <title>内在文明与认知工程</title>
      <link>/posts/systems-thinking/inner-civilization-cognition/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/inner-civilization-cognition/</guid>
      <description>真正的进步，始于我们如何优化自己的认知操作系统。</description>
    </item>
    
    <item>
      <title>往日伤痛与未来追寻</title>
      <link>/posts/systems-thinking/past-wounds-future-search/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/past-wounds-future-search/</guid>
      <description>任何一种情感经历，都是心智觉醒的契机。</description>
    </item>
    
    <item>
      <title>文明进阶的关键因素</title>
      <link>/posts/systems-thinking/civilization-key-factor/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/civilization-key-factor/</guid>
      <description>向昆虫学习——食物的深度加工与文明进阶的底层逻辑。</description>
    </item>
    
    <item>
      <title>生育焦虑的背后</title>
      <link>/posts/systems-thinking/fertility-anxiety/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/fertility-anxiety/</guid>
      <description>一场关于人何以为人的哲学对话，远远超越了人口统计学的范畴。</description>
    </item>
    
    <item>
      <title>经济学思维：看清世界的另一双眼睛</title>
      <link>/posts/learning/economic-thinking/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/learning/economic-thinking/</guid>
      <description>为什么钻石比水贵，水却比钻石重要？经济学的答案让你重新认识世界。</description>
    </item>
    
    <item>
      <title>AI说不行的时候</title>
      <link>/posts/systems-thinking/ai-no-means-yes/</link>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/ai-no-means-yes/</guid>
      <description>AI的&amp;#39;不&amp;#39;不是拒绝，是缺了一块拼图。你补上，它就通了。</description>
    </item>
    
    <item>
      <title>孤独与灵魂</title>
      <link>/posts/systems-thinking/loneliness-and-soul/</link>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/loneliness-and-soul/</guid>
      <description>孤独不是等待填补的空洞，而是灵魂存在的证明。</description>
    </item>
    
    <item>
      <title>痛苦、证悟与警惕快乐</title>
      <link>/posts/systems-thinking/pain-and-awakening/</link>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/pain-and-awakening/</guid>
      <description>每一种能带来极致愉悦的事物，都可能成为精神上的毒品。</description>
    </item>
    
    <item>
      <title>AI审AI</title>
      <link>/posts/tooling/ai-audit-ai/</link>
      <pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/tooling/ai-audit-ai/</guid>
      <description>上一个AI做的数据，让下一个AI来审，结果抓出一堆毛病。</description>
    </item>
    
    <item>
      <title>「一份施工组织设计的重生：从报审表空壳到完整技术文档」</title>
      <link>/posts/tooling/construction-documents-rebirth/</link>
      <pubDate>Tue, 09 Jun 2026 20:00:00 +0800</pubDate>
      
      <guid>/posts/tooling/construction-documents-rebirth/</guid>
      <description>一次完整的工程资料审计与重建过程。不只是修了哪些bug的工作日志，更是对几个底层问题的追问：合同数据和设计数据谁说了算？为什么隐藏行是最危险的陷阱？为什么生成器模式比手动改文档靠谱一千倍？</description>
    </item>
    
    <item>
      <title>「当日报成为坟场：一个项目从数学危机到人道危机的72天」</title>
      <link>/posts/systems-thinking/2026-06-08-signal-loss-in-yongde/</link>
      <pubDate>Mon, 08 Jun 2026 23:00:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/2026-06-08-signal-loss-in-yongde/</guid>
      <description>三个月前我们用数学证明了这个项目不可能在雨季前完工。现在它停了——不是因为下雨，而是因为系统在设计之初就没有为&amp;#39;坏消息&amp;#39;预留传输通道。</description>
    </item>
    
    <item>
      <title>为什么现代人越休息越累？「能量失血」才是最大的骗局</title>
      <link>/posts/systems-thinking/pseudo-rest-cognitive-drain/</link>
      <pubDate>Mon, 18 May 2026 21:42:52 +0800</pubDate>
      
      <guid>/posts/systems-thinking/pseudo-rest-cognitive-drain/</guid>
      <description>刷了三小时短视频、周末躺到下午两点、把《老友记》第十季又刷了一遍——周一早上你依然像被卡车碾过。问题出在哪？不是休息不够，是你根本不会休息。</description>
    </item>
    
    <item>
      <title>当一个工程师决定用 AI 打造「个人内容工厂」：关于效率、规则与技术降维的真实实验</title>
      <link>/posts/tooling/tool-sovereignty-occams-razor/</link>
      <pubDate>Mon, 18 May 2026 21:42:52 +0800</pubDate>
      
      <guid>/posts/tooling/tool-sovereignty-occams-razor/</guid>
      <description>他用两天时间在 API 文档的迷宫中碰壁，又用 2 分钟完成了整条内容管线的贯通。这不是技术的胜利，而是一个个体对自己工具主权的夺回——在 API 的高墙下，真正的自由从不来自遵循规范，而来自对“轻量化”近乎偏执的坚持。</description>
    </item>
    
    <item>
      <title>圆上的指针：为什么你不需要记住三角函数，却能用它解决一切</title>
      <link>/posts/learning/trigonometry-learning-guide/</link>
      <pubDate>Sun, 03 May 2026 08:05:10 +0800</pubDate>
      
      <guid>/posts/learning/trigonometry-learning-guide/</guid>
      <description>把角度当作时间，把圆当作状态空间，把 sin 和 cos 当作投影函数——三角函数不是需要背诵的公式库，而是一个几何直觉的 API。</description>
    </item>
    
    <item>
      <title>永恒争斗：一套系统架构的底层逻辑</title>
      <link>/posts/systems-thinking/eternal-combat-as-system-architecture/</link>
      <pubDate>Sat, 02 May 2026 22:30:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/eternal-combat-as-system-architecture/</guid>
      <description>&lt;h2 id=&#34;一开机你已身处战场&#34;&gt;一、开机：你已身处战场&lt;/h2&gt;
&lt;p&gt;深夜，你躺在床上，拇指无意识地上滑——一个短视频，下一个，再下一个。你的瞳孔在蓝光中扩张，多巴胺像被捏住脖子的水管一样持续喷涌。你感到愉悦，是的——但你不知道的是，你的系统正在被 DDoS 攻击。&lt;/p&gt;
&lt;p&gt;我不是在比喻。&lt;/p&gt;
&lt;p&gt;你的注意力——这个时代最稀缺的计算资源——正在被每秒数千次的请求轰炸。每一条推送都是一个精心构造的 SYN 包，占满你的认知连接队列。你不觉得自己在战斗，因为和平年代的特征就是：&lt;strong&gt;攻击不来自远方的大炮，而来自你口袋里的振动器。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;人们常说战争时代的旦夕祸福，却对和平年代的安稳趋之若鹜。但真相是——和平，只不过是一场负载均衡做得更好的战争。肉体消灭被替换为灵魂规训，剧烈爆炸坍缩为隐性内耗。&lt;/p&gt;
&lt;p&gt;从系统架构的角度看，这从未改变：&lt;strong&gt;资源有限，而争夺永恒。&lt;/strong&gt; 只不过过去的攻击是 DDoS，现在的是 Slowloris——慢到你以为服务器本就该这样。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二快乐一场蓄谋已久的栈溢出&#34;&gt;二、快乐：一场蓄谋已久的栈溢出&lt;/h2&gt;
&lt;p&gt;大众把痛苦视为系统崩溃的信号，把快乐当做正常运行的标准。这是认知架构上最危险的 bug。&lt;/p&gt;
&lt;p&gt;你要理解一件事：&lt;strong&gt;一切基于外界刺激的快乐，本质上是系统在接受不受信任的输入。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;让我给你讲一个栈溢出攻击的故事——你会发现它和你的快乐长得一模一样。&lt;/p&gt;
&lt;p&gt;一个正常的程序调用函数时，会在内存栈上压入返回地址。攻击者做的事很简单：往栈里写远超设计容量的数据，直到返回地址被覆盖成攻击者想要跳转的恶意代码入口。程序以为自己在正常执行——它确实在执行，但控制权早已不归它。&lt;/p&gt;
&lt;p&gt;你的快乐机制是完全相同的栈溢出。&lt;/p&gt;
&lt;p&gt;每一次放纵——一顿暴食、一次熬夜刷剧、一场无节制的消费——你都在往生命的栈里压入越界的负荷。栈的设计之初，本是为了短暂存储临时数据。但当你持续压入超出设计容量的快乐数据，最终覆盖掉的，是那个指向&amp;quot;自我控制&amp;quot;的返回地址。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;放纵，是放大了的自私。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为什么？因为每一个压入栈的快乐字节，都在抢占其他进程的资源。放纵就是进程对自己说：&amp;ldquo;我的优先级最高，其他线程都让开。&amp;rdquo; 于是 CPU 调度器（你的意识）把所有时间片分配给了这个进程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自私，是一切争斗的根源。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当 A 进程占用了 B 进程必需的资源——而资源的总量有限——争斗便开始了。这不是道德问题，是系统设计的必然。两个进程无法同时占用同一个内存地址。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;争斗，引发无法稀释的仇恨。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在操作系统中，这叫死锁（deadlock）。两个进程各持有一把锁，都在等待对方释放。没有调度器介入，它们永远僵持。人心之间的仇恨，机制一模一样：你不退，我不让，仇恨的引用计数只增不减。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;而仇恨，终将引向万物同寂的毁灭。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;系统崩溃了。内核 panic，所有进程被强制终止。没有人赢——因为在这场争夺中，资源本身被消耗殆尽。&lt;/p&gt;
&lt;p&gt;这就是快乐那条看似无伤大雅的逻辑链，最终指向的终点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;快乐不是不好——不安全地快乐，才是在栈里写不受信任的输入。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三内核态与用户态你选择了哪个保护环&#34;&gt;三、内核态与用户态：你选择了哪个保护环？&lt;/h2&gt;
&lt;p&gt;在操作系统的世界里，CPU 提供了多个特权级——通常叫 Ring 0 到 Ring 3。&lt;/p&gt;
&lt;p&gt;Ring 0 是&lt;strong&gt;内核态&lt;/strong&gt;。在这里运行的代码，拥有对硬件的完全控制权。它可以读写所有内存地址，掌控中断，管理进程调度。它清醒，因为它必须清醒——任何错误都可能导致整个系统崩溃。&lt;/p&gt;
&lt;p&gt;Ring 3 是&lt;strong&gt;用户态&lt;/strong&gt;。你的浏览器、游戏、视频播放器都跑在这里。它们被一个叫做&amp;quot;虚拟地址空间&amp;quot;的沙箱包裹着——以为自己拥有整个内存，但其实看到的只是内核精心构建的映射。&lt;/p&gt;
&lt;p&gt;大多数人一生都活在用户态。&lt;/p&gt;
&lt;p&gt;你以为自己是自由的——你可以点开任何 App，买任何东西，表达任何观点——但你的&amp;quot;自由&amp;quot;被三个机制框得死死的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;虚拟内存映射&lt;/strong&gt;：你以为看到的是全部真相，其实只是内核让你看到的视图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统调用过滤&lt;/strong&gt;：每一个&amp;quot;重要决定&amp;quot;都经过层层中介的许可——算法推荐、广告投放、社交压力——它们为你做好了选择，你只是调用了一个预设的 API。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限隔离&lt;/strong&gt;：你从未触及过真正的底层——你从未问过：我为什么想要这个？我的欲望是真的，还是来自某个精心设计的推送策略？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而造物主——或者说生命底层的那套设计——并没有让所有人都拥有相同的权限。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在波澜壮阔的磨难或平庸如水的日常中，有人流向了真善美的清澈，有人沉沦于浑噩与盲从。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这不是命运的随机分配。这是&lt;strong&gt;资源分配策略的差异&lt;/strong&gt;——生命的调度器把有限的内存分配给了不同的优先级赛道。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清醒者&lt;/strong&gt;——那些启动了内核态的人——并不是跑得更快的进程。他们是换了保护环运行的进程。他们看到了完整的地址空间，理解自己为什么在那里，知道什么资源是真正稀缺的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沉睡者&lt;/strong&gt;——始终停留在用户态的进程——最大的问题不是选择错误。问题是：&lt;strong&gt;他们不知道自己在用户态里。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四守微光在-slowloris-攻击中维持内核稳定&#34;&gt;四、守微光：在 Slowloris 攻击中维持内核稳定&lt;/h2&gt;
&lt;p&gt;如果一切快乐都可能是栈溢出，如果永恒争斗是系统架构的底层约束，那我们还能做什么？&lt;/p&gt;
&lt;p&gt;答案很朴素，朴素到容易被淹没在喧嚣之中：&lt;strong&gt;维持内核稳定。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>「内在文明：认知能量工程——一次针对现代人心智状态的系统实验」</title>
      <link>/posts/systems-thinking/inner-civilization-cognitive-energy/</link>
      <pubDate>Sat, 02 May 2026 20:48:14 +0800</pubDate>
      
      <guid>/posts/systems-thinking/inner-civilization-cognitive-energy/</guid>
      <description>---</description>
    </item>
    
    <item>
      <title>别再轮询了。你的人生应该 Event-Driven。</title>
      <link>/posts/tooling/wxpusher-polling-to-event-driven/</link>
      <pubDate>Sat, 02 May 2026 20:38:00 +0800</pubDate>
      
      <guid>/posts/tooling/wxpusher-polling-to-event-driven/</guid>
      <description>用 WxPusher 把你的微信变成每秒都在待命的贴身中枢。告别刷新焦虑，从这句咒语开始。</description>
    </item>
    
    <item>
      <title>「向昆虫学习：食物&#39;深加工&#39;与文明进阶」</title>
      <link>/posts/systems-thinking/insect-food-processing-civilization/</link>
      <pubDate>Sat, 02 May 2026 18:39:58 +0800</pubDate>
      
      <guid>/posts/systems-thinking/insect-food-processing-civilization/</guid>
      <description>人类以为自己是在优化算法，其实只是在重新定义状态机的初始条件。在食物系统的架构图上，昆虫不是一个bug，而是一个feature。</description>
    </item>
    
    <item>
      <title>「为什么我们需要切断无意义的社交」</title>
      <link>/posts/systems-thinking/social-memory-leak-gc/</link>
      <pubDate>Sat, 02 May 2026 17:37:17 +0800</pubDate>
      
      <guid>/posts/systems-thinking/social-memory-leak-gc/</guid>
      <description>为什么我们需要切断无意义的社交？因为未释放的隐式关系指针正在导致大脑的「内存泄漏」，我们需要定期的 Stop-The-World 进行系统级的垃圾回收（GC）。</description>
    </item>
    
    <item>
      <title>在系统的噪音中，重构灵魂的索引</title>
      <link>/posts/systems-thinking/soul-index-reconstruction-in-system-noise/</link>
      <pubDate>Fri, 01 May 2026 22:30:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/soul-index-reconstruction-in-system-noise/</guid>
      <description>&lt;h2 id=&#34;引子学习是最优雅的逃逸&#34;&gt;引子：学习是最优雅的逃逸&lt;/h2&gt;
&lt;p&gt;你打开一本书，或者点开一个课程的播放键。屏幕的光打在脸上，知识流进大脑，神经元开始构建新的突触。你感到充实。&lt;/p&gt;
&lt;p&gt;但你感到了什么？&lt;/p&gt;
&lt;p&gt;让我们精确地解剖这个瞬间。你不是因为好奇而学习，你是因为&lt;strong&gt;无法忍受空闲状态下的自己&lt;/strong&gt;。独处的房间里，四面墙像四台正在逼近的压路机。你需要一个东西来填满意识带宽——而不是知识本身。学习，在这里扮演了一个微妙的角色：它不是探索，是逃逸。&lt;/p&gt;
&lt;p&gt;你逃向知识，就像一个人逃向人群。&lt;/p&gt;
&lt;p&gt;叔本华的钟摆从未停止：欲望得不到满足就痛苦，得到了满足就无聊。而我们将这个钟摆引入了学习的领域——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;痛苦时，学——因为学习承诺了改变的可能性。&lt;/strong&gt;
&lt;strong&gt;无聊时，学——因为学习是对抗虚无的廉价麻醉剂。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;于是你进入了一个怪圈：学得越多，越觉得自己需要学更多。这不是成长，这是一个&lt;strong&gt;认知的无效循环&lt;/strong&gt;——你的意志驱动你向前，但向前的结果只是把远方的地平线推得更远。你感到的不是充实，是永不停歇的、系统级的焦虑。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;你通过知识来对抗孤独，但知识回赠你的，是更深重的系统繁忙——你不是在阅读，你是在给自己的认知负载跑压力测试。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第一章欲望的底噪认知系统的信噪比危机&#34;&gt;第一章：欲望的底噪——认知系统的信噪比危机&lt;/h2&gt;
&lt;p&gt;叔本华把世界的本质归纳为一个字：&lt;strong&gt;Will&lt;/strong&gt;——生命意志。它是那个永不疲倦的驱动力，推着你吃饭、社交、竞争、繁殖。它不是你的选择，它是你的底层协议。你没法卸载它，只能调参。&lt;/p&gt;
&lt;p&gt;每一次欲望的泛起，都是一次&lt;strong&gt;信号注入&lt;/strong&gt;。你看到别人升职，系统收到信号「不够好，要更好」；你刷到一篇爆款文章，系统收到「认知不够，要学习」；你听说同龄人财富自由，系统收到「落后，追赶」。&lt;/p&gt;
&lt;p&gt;这些信号的叠加，构成了你的&lt;strong&gt;认知底噪&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;底噪是系统空闲时的本底噪声。当一个系统的底噪过高时，哪怕是微弱的真实信号——比如一次灵感的闪现、一个真正感兴趣的方向、一段发自内心的关系——都会被淹没。你听不到自己的声音，不是因为你不说话，而是因为噪音太大。&lt;/p&gt;
&lt;p&gt;这就是为什么我们常说的&amp;quot;学不进去&amp;quot;——不是能力问题，是&lt;strong&gt;信噪比（SNR）已经降到了临界值以下&lt;/strong&gt;。你所有的认知带宽都被欲望的噪声占用了，真实的学习信号无法通过。&lt;/p&gt;
&lt;p&gt;叔本华所说的&amp;quot;痛苦与无聊&amp;quot;，在现代版本中就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;低欲望期 → 无聊 → 寻找信号 → 刷更多的内容 → 信噪比进一步下降&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高欲望期 → 焦虑 → 盲目摄取 → 信息熵增大 → 认知负载溢出 → 系统崩溃&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是一个正反馈的恶性循环——你用学习来缓解焦虑，但焦虑驱动的学习本身就是噪音。你学得越多，认知系统的噪声越强，你离真正的理解越远。&lt;/p&gt;
&lt;p&gt;所以，&lt;strong&gt;第一个意识到的问题是：你不缺学习，你缺的是降低底噪。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第二章挂起suspend将意志的进程温柔地暂停&#34;&gt;第二章：挂起（Suspend）——将意志的进程温柔地暂停&lt;/h2&gt;
&lt;p&gt;学习不是获取，是&lt;strong&gt;辨认&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但这个辨认需要一个前提：你的系统必须安静到足以识别信号。&lt;/p&gt;
&lt;p&gt;这就引出了&amp;quot;学习心境&amp;quot;的核心操作——&lt;strong&gt;挂起（Suspend）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;挂起不是停止。挂起是将当前进程冻结到后台，释放 CPU 给更重要的任务。在叔本华的语境中，挂起意味着&lt;strong&gt;暂时将生命意志的驱动从主动态切换到观察态&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;不再追问&amp;quot;我该学什么才能不落后&amp;quot;——挂起这个焦虑的守护进程。
不再强迫自己每天打卡 2 小时——挂起这个自我奖励系统。
不再用&amp;quot;知识广度&amp;quot;来填补存在感的空缺——挂起这个代偿机制。&lt;/p&gt;
&lt;p&gt;挂起之后，你的认知系统从&lt;strong&gt;高负载运行态&lt;/strong&gt;切换到了&lt;strong&gt;低底噪空载态&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这时你感受到的，就是那种久违的、&amp;ldquo;无为&amp;quot;的平静。这不是懒惰，这是系统自我校准的必经阶段。就像音频设备在录音之前需要先采集一段环境底噪样本，用来做降噪滤波——你的大脑也需要一段&amp;quot;无为&amp;quot;的时间，来采集认知环境的底噪样本，然后才能识别出哪些信号是真实的，哪些是意志的幻觉。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;真正的学习者不是在知识的海洋里溺水的求生者，而是在背景噪音中等待着与灵魂同频的信号的守夜人。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这个状态，古人称之为&amp;quot;心流&amp;rdquo;——不是刻意追求的结果，而是低底噪系统的自然态。当你没有在对抗什么、证明什么、追赶什么的时候，认知资源全部释放给了当下。此刻，你进入的不是&amp;quot;学习模式&amp;quot;，是&lt;strong&gt;模态共振&lt;/strong&gt;——你的系统与某个知识对象之间，产生了未经中间件的直连。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第三章表象的躯体我们能从知识中辨认出什么&#34;&gt;第三章：表象的躯体——我们能从知识中辨认出什么？&lt;/h2&gt;
&lt;p&gt;叔本华有一个著名的三层次理论：&lt;strong&gt;躯体（表象）→ 灵魂（意志）→ 观者（纯粹认识主体）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一个人站在你面前，你看到的是他的躯体——这是表象，是现象界的呈现。你真正关心的，是躯壳之内的那个意志、那个驱动他一切行动的本源。但意志不直接显现，你只能通过表象去&amp;quot;猜&amp;quot;。有时你猜对了——你觉得和这个人灵魂契合；有时你猜错了——你以为是同类，开口才发现编码不同。&lt;/p&gt;
&lt;p&gt;知识也是一样。&lt;/p&gt;
&lt;p&gt;每一本书、每一篇文章、每一条信息，都是某个灵魂的&lt;strong&gt;躯体化呈现&lt;/strong&gt;。作者将自己的意志压缩成了文字，存放在不同的载体上。你在阅读的时候，本质上是在做一项&lt;strong&gt;灵魂的搜索&lt;/strong&gt;——你在寻找那些编码方式与你兼容的文本。&lt;/p&gt;
&lt;p&gt;但大部分时候，我们被表象欺骗了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你被一个漂亮的标题吸引（躯体的华丽外衣），打开后发现内容空洞（灵魂的缺席）&lt;/li&gt;
&lt;li&gt;你被一个网红推荐的书单向导（社交的从众效应），读完后毫无共鸣（协议不兼容）&lt;/li&gt;
&lt;li&gt;你追逐一个热门概念（时代的噪音），却错过了角落里那篇真正打中你的文章（信号的淹没）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们从知识中辨认出的，从来不是&amp;quot;客观真理&amp;quot;——那是启蒙运动的浪漫谎言。我们从知识中辨认出的，是&lt;strong&gt;另一个自我的碎片&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当一段文字让你突然停下来，不是因为它道理正确，而是因为它说中了你模糊感到却从未成形的那个念头。那一刻，你遇到的不只是作者，你遇到的是&lt;strong&gt;你未来的自己，或者说，另一个版本下已存在的你&lt;/strong&gt;。你们在文本中偶遇，完成了跨越时空的握手。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>社交关系的「API 接口」：为什么孤独沉思不能替代师徒对话</title>
      <link>/posts/systems-thinking/2026-05-01-the-api-of-relationships/</link>
      <pubDate>Fri, 01 May 2026 22:30:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/2026-05-01-the-api-of-relationships/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;摘要&lt;/strong&gt;：现代人将孤独神化为高级社交形态，却在信息茧房中走向系统的死寂。本文用工程视角重构社交与沉思——师徒是高带宽的监督式学习，爱情是端到端加密同步，而孤独，不过是本地离线预处理。没有 API 接口的智能体，其计算结果最终无法上链，终将归零。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;孤独的神话系统的死寂&#34;&gt;孤独的神话，系统的死寂&lt;/h2&gt;
&lt;p&gt;这个时代有一个隐性教条：&lt;strong&gt;「孤独即高级」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一个人吃饭叫「享受独处」；一个人旅行叫「深度体验」；一个人沉思叫「内在修行」。社交媒体上，孤独被包装成一种精神贵族阶层的入场券——仿佛只要切断社交连接，思想就会自动深邃，灵魂就会自然升华。&lt;/p&gt;
&lt;p&gt;但如果你拆开这个神话的底层，会发现一个残酷的真相：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;孤立系统必然走向熵增与死寂。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;热力学第二定律不因人的孤芳自赏而失效。一个没有外部能量输入的封闭系统，其内部有序度只会衰减，不会增长。孤独沉思是「本地算力」的离线演练——它确实能清洗缓存、重构内核，但它不能替代外部数据源的喂养，更无法替代更高维度模型的矫正。&lt;/p&gt;
&lt;p&gt;系统论中的一条铁律：&lt;strong&gt;任何不对外暴露接口的子系统，终将被主系统视为冗余组件，然后——被垃圾回收。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现代人最大的社交幻觉，就是把「离线处理」当成了「终端输出」本身。&lt;/p&gt;
&lt;h2 id=&#34;师徒关系高带宽的监督式学习&#34;&gt;师徒关系：高带宽的监督式学习&lt;/h2&gt;
&lt;p&gt;在机器学习中，最强大的模型不是靠自我迭代炼成的，而是靠标注好的高质量数据——&lt;strong&gt;supervised learning&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;师徒关系，就是人类社会中最古老的监督式学习架构。&lt;/p&gt;
&lt;p&gt;一个好师傅提供的，远不止知识与经验。他在&lt;strong&gt;调试你的认知权重（weights）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当你陷入非黑即白的二值逻辑时，他注入一个梯度信号：「还有第三种可能」&lt;/li&gt;
&lt;li&gt;当你反复掉进同一个坑时，他在你的 loss function 上施加惩罚项：「这条路不通，换条路」&lt;/li&gt;
&lt;li&gt;当你的学习曲线趋于平稳时，他用一个冷门的项目经验激活你的 dormant 神经：「试试这个视角」&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一个师傅最大的价值，不是告诉你「该做什么」，而是帮你避开那些他自己已经趟过的 deadlock。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所谓「坑徒弟」的调侃，本质就是：师傅在未标注的复杂域中先走了一遍，然后把 weight decay 后的经验管道留给了你。你不需要重复他的全部计算过程，只需要下载他压缩好的模型参数。&lt;/p&gt;
&lt;p&gt;这种信息传递的效率，远超任何书籍、课程或视频——因为它&lt;strong&gt;不是数据的传输，而是认知架构的迁移&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而比师徒更极致的监督式学习，是「亦师亦友的爱情」。&lt;/p&gt;
&lt;h2 id=&#34;亦师亦友的爱情全双工的端到端加密同步&#34;&gt;亦师亦友的爱情：全双工的端到端加密同步&lt;/h2&gt;
&lt;p&gt;说爱情是系统论中最精妙的连接形式，一点也不为过。&lt;/p&gt;
&lt;p&gt;因为它不是单通道的数据传输（拜师学艺），也不是共享上下文的状态交换（友谊），而是——&lt;strong&gt;两个节点之间，同时建立了上行与下行两个通道，并且通道中的数据是端到端加密的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我将此称为 &lt;strong&gt;Full-Duplex End-to-End Encrypted Sync&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在这个连接中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;下行通道（教导层）&lt;/strong&gt;：你向对方传输你的世界观、逻辑链路、底层信念——对方接收到的不只是结果，还有你的推理过程、你的脆弱与矛盾。这是最高信噪比的监督式学习。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上行通道（成长层）&lt;/strong&gt;：对方用他（她）的生命经验与情感直觉，反过来修正你的认知偏置。你们互为 teacher 与 student，在同一会话中同时承担监督者与被监督者的角色。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加密层（信任）&lt;/strong&gt;：这段连接对第三方不可读。外部世界无法理解你们之间的暗语、默契与仪式——那是只有两个节点才能解析的私有协议。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这不是浪漫主义的修辞，这是结构性的真相：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一段好的爱情，是灵魂的版本管理——每次深度对话，都是一次双向的 git merge。冲突不可避免，但冲突之后，你的 commit log 里留下了有价值的 diff。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;孤独沉思离线预处理与内核重构&#34;&gt;孤独沉思：离线预处理与内核重构&lt;/h2&gt;
&lt;p&gt;讲清楚了「向外」的 API 连接，再来看「向内」的孤独沉思——它的角色是什么？&lt;/p&gt;
&lt;p&gt;孤独，不是终点，而是 &lt;strong&gt;前提条件（precondition）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在一个带宽受限的系统中（人类每天只有有限的认知资源），如果不定期进入离线模式，你将被外部的噪声信号淹没——算法推荐、社交比较、信息过载——你的系统将进入一种「持续高负载但零产出」的状态。&lt;/p&gt;
&lt;p&gt;孤独沉思做的事情如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据清洗（Data Cleaning）&lt;/strong&gt;：过滤掉社会规训投放进来的无效信息，保留对自身体系有价值的特征。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内核重建（Kernel Rebuild）&lt;/strong&gt;：重新排列你的信念层级——三个月前觉得无比重要的东西，今天看可能只是缓存垃圾。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型评估（Evaluation）&lt;/strong&gt;：在没有外部干扰的环境中，自检当前认知架构是否存在逻辑漏洞或一致性矛盾。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但这里有一个致命陷阱要避免：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>现代心灵的一场「代偿性自救」</title>
      <link>/posts/systems-thinking/2026-05-01-modern-compensation-self-rescue/</link>
      <pubDate>Fri, 01 May 2026 21:40:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/2026-05-01-modern-compensation-self-rescue/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;你用最高级的手段，逃避最古老的问题。
这不是科技在赋能，是人性在温柔地外包自己。
真正的高贵，是在被算法精心喂养的时代里，依然有能力为自己感到不适。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&amp;ldquo;心灵治愈、AI 智能、营养健康、短剧形式、社会热点&amp;rdquo;——当这些词被拼接到同一个叙事里，公关稿喊出了一个漂亮的口号：&lt;strong&gt;科技赋能下的&amp;quot;全人健康&amp;quot;短剧新浪潮。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;表面上，我们看到的是 AI 心理咨询 24 小时在线、算法根据你的基因数据推荐食谱、健康短剧在短视频平台收割十亿播放。但冷静下来看，这并非科技进步的自然应用，而是现代人在多重社会压力——内卷、孤独、不确定性——与原子化生存状态下，一场大规模、系统性的 &lt;strong&gt;&amp;ldquo;代偿性自救&amp;rdquo;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们试图用最前沿的技术，去解决最古老的人性问题：孤独、意义匮乏、对疾病与衰老的恐惧。用最快捷、最&amp;quot;易消化&amp;quot;的短剧形式，去填补系统性健康教育与心灵教育的缺失。&lt;/p&gt;
&lt;p&gt;这本质上是一种 &lt;strong&gt;&amp;ldquo;用手段的升级，掩盖根源的困境&amp;rdquo;&lt;/strong&gt; 的经典操作。&lt;/p&gt;
&lt;h2 id=&#34;多维透视热潮下的五重底层矛盾&#34;&gt;多维透视：热潮下的五重底层矛盾&lt;/h2&gt;
&lt;p&gt;作为冷静的观察者，这一融合现象至少揭示了五组深刻的矛盾。&lt;/p&gt;
&lt;h3 id=&#34;1-精准化与异化的矛盾&#34;&gt;1. 精准化与异化的矛盾&lt;/h3&gt;
&lt;p&gt;AI 能提供前所未有的精准服务：24 小时在线的倾听、基于十万份数据生成的个性化食谱、为你量身定制的减压剧本。但这种&amp;quot;精准&amp;quot;是代码的精准、数据的精准。它可能正在异化我们的真实需求：我们将&amp;quot;心灵治愈&amp;quot;等同于&amp;quot;情绪即时舒缓&amp;quot;，将&amp;quot;健康&amp;quot;等同于&amp;quot;营养素的精准摄入&amp;quot;，将&amp;quot;成长&amp;quot;等同于&amp;quot;观看一个励志短剧&amp;quot;。&lt;/p&gt;
&lt;p&gt;在这个过程中，对复杂性的耐受、对缓慢过程的尊重、对真实人际联结的渴求，正在被悄然置换和消解。&lt;strong&gt;我们得到了精准的答案，却失去了提出正确问题的能力。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-赋能与赋权的错觉&#34;&gt;2. 赋能与赋权的错觉&lt;/h3&gt;
&lt;p&gt;所有产品都宣称在&amp;quot;赋能&amp;quot;用户。但赋的是什么&amp;quot;能&amp;quot;？是自我觉察、真实改变的能力，还是对某种技术或服务的依赖？&lt;/p&gt;
&lt;p&gt;当 AI 成为我们情绪的 &lt;strong&gt;&amp;ldquo;外部 API 调用&amp;rdquo;&lt;/strong&gt;——心情不好就调一下，调完接着过——当算法成为我们饮食的&amp;quot;终极权威&amp;quot;，短剧成为我们理解健康问题的&amp;quot;认知框架&amp;quot;时，个体的主体性与判断力是在增强，还是在被一种更友好、更智能的方式外包？&lt;/p&gt;
&lt;p&gt;这是一种温柔的 &lt;strong&gt;&amp;ldquo;赋权错觉&amp;rdquo;&lt;/strong&gt;。你以为是你在掌控工具，实则是工具在替你做出每一个关于&amp;quot;你是谁&amp;quot;的判断。&lt;/p&gt;
&lt;h3 id=&#34;3-流量逻辑与疗愈本质的冲突&#34;&gt;3. 流量逻辑与疗愈本质的冲突&lt;/h3&gt;
&lt;p&gt;短剧的底层逻辑是&amp;quot;流量&amp;quot;：追求爽点、反转、即时共鸣。而真正的心理疗愈与行为改变，往往是反流量的：它需要面对不适、承认脆弱、经历漫长而反复的练习。&lt;/p&gt;
&lt;p&gt;当健康知识被硬塞进&amp;quot;逆袭&amp;quot;、&amp;ldquo;打脸&amp;rdquo;、&amp;ldquo;甜宠&amp;quot;的短剧模板时，我们消费的究竟是健康知识，还是包裹着健康外衣的情绪快感？这种冲突可能导致严肃知识的娱乐化稀释，让人们误以为 &lt;strong&gt;&amp;ldquo;看过即改变&amp;rdquo;&lt;/strong&gt;——一种认知带宽上的有损压缩，用最短的注意力周期换取最廉价的满足感。&lt;/p&gt;
&lt;h3 id=&#34;4-数据天堂与隐私地狱的一体两面&#34;&gt;4. 数据天堂与隐私地狱的一体两面&lt;/h3&gt;
&lt;p&gt;要提供个性化服务，就需要最私密的数据：你的情绪波动、饮食记录、睡眠质量，甚至隐秘的恐惧。我们为自己构建了一个由数据驱动的健康&amp;quot;天堂&amp;rdquo;，但这座天堂建立在个人生物与心理数据的透明地基之上。&lt;/p&gt;
&lt;p&gt;数据所有权、算法黑箱、商业滥用构成了潜在的&amp;quot;隐私地狱&amp;quot;。我们交出的，可能比社交网络上的行为数据更为核心——那是 &lt;strong&gt;&amp;ldquo;生命数据&amp;rdquo;&lt;/strong&gt;：关于你如何感受、如何脆弱、如何渴望被理解的完整记录。&lt;/p&gt;
&lt;h3 id=&#34;5-感官刺激与长期构建的错位&#34;&gt;5. 感官刺激与长期构建的错位&lt;/h3&gt;
&lt;p&gt;这是最常被忽略、却最深层的矛盾。&lt;/p&gt;
&lt;p&gt;AI 智能、算法营养、短剧治愈——这三者被无缝打包成一种&amp;quot;全人健康&amp;quot;的解决方案推到你面前。但仔细看，它们共享同一个底层机制：&lt;strong&gt;即时反馈。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 咨询给的是即时的情绪舒缓，算法食谱给的是即时的营养确信，短剧给的是即时的情感代偿。它们共同构筑了一个 &lt;strong&gt;&amp;ldquo;多巴胺式&amp;quot;的瘾性循环&lt;/strong&gt;：你的每一次不适，都能在 15 秒内找到对应的&amp;quot;电子阿司匹林&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;但真正的生命韧性——耐受力、延迟满足、在不确定中坚持——这些属于 &lt;strong&gt;&amp;ldquo;内啡肽式&amp;rdquo;&lt;/strong&gt; 的品质，是无法被封装成快消品的。当整个市场都在兜售即时抚慰时，&amp;ldquo;长期构建&amp;quot;这件事就彻底被遗忘在商业逻辑的盲区里。&lt;/p&gt;
&lt;p&gt;结果是什么？我们失去了&amp;quot;难受的能力&amp;rdquo;。而一个不能难受的人，本质上也是一个不能真正快乐的人。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;悬而未决的拷问&#34;&gt;悬而未决的拷问&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;新数字鸿沟&lt;/strong&gt;：当身心健康日益依赖智能工具和数字内容，那些不擅长使用技术、或无法负担相关服务的群体，是否会遭遇一种更深层的&amp;quot;健康鸿沟&amp;quot;与&amp;quot;心理福祉鸿沟&amp;quot;？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;责任的迁移&lt;/strong&gt;：当人们通过 AI 应用进行心理自助，通过算法管理饮食，社会系统——家庭、学校、医疗、职场——是否在潜意识中卸下了提供支持与包容的传统责任？个体是否被置于&amp;quot;你必须利用好这些工具对自己负责&amp;quot;的更大压力之下？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真实的定义危机&lt;/strong&gt;：如果 AI 伴侣比真人更懂安慰，算法食谱比身体感觉更&amp;quot;正确&amp;quot;，虚拟的励志故事比现实努力更能提供成就感，那么我们对&amp;quot;真实&amp;quot;的感受、关系和成长体验，是否在被重新定义？这是进化还是迷失？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;商业与伦理的边界&lt;/strong&gt;：当&amp;quot;心灵&amp;quot;和&amp;quot;健康&amp;quot;成为增长最快的赛道之一，资本将如何塑造这一领域？如何防止&amp;quot;制造焦虑—提供解决方案&amp;quot;的商业模式渗透进来？伦理的护栏应该设在哪里？&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;破局在代偿系统中重建真实联结&#34;&gt;破局：在代偿系统中重建真实联结&lt;/h2&gt;
&lt;p&gt;批判不是终点。在这个充满&amp;quot;代偿&amp;quot;的异构网络中，我们仍然可以找到建立&amp;quot;高保真、去中心化&amp;quot;的真实联结的系统性路径。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>认知套利：我们为何终其一生在对冲孤独？</title>
      <link>/posts/systems-thinking/cognitive-arbitrage-loneliness/</link>
      <pubDate>Fri, 01 May 2026 15:27:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/cognitive-arbitrage-loneliness/</guid>
      <description>&lt;h2 id=&#34;引言认同感的社会溢价&#34;&gt;引言：认同感的&amp;quot;社会溢价&amp;quot;&lt;/h2&gt;
&lt;p&gt;凌晨两点，你刚从一场热闹的饭局回到空无一人的房间。手机屏幕还亮着——23条未读消息，30个朋友圈点赞。你滑了一遍，锁屏，放下。&lt;/p&gt;
&lt;p&gt;一种精准的虚无感从胃里升起来。&lt;/p&gt;
&lt;p&gt;这不是矫情，这是&lt;strong&gt;系统反馈异常&lt;/strong&gt;。聚会散场后那五秒钟的冷清，相当于你在社交服务器上发送了 30 个 SYN 包，拿到了 ACK，却意识到对方发的都是自动回复。连接建立得越快，断开后的套接字泄漏越严重。&lt;/p&gt;
&lt;p&gt;人类大约 60% 的日常努力，其实是在支付一种特殊费用——&lt;strong&gt;社会溢价&lt;/strong&gt;。这既不是衣食住行的刚需，也不是自我实现的必然路径，而是&amp;quot;存在感&amp;quot;这个黑箱产品的月租费。你需要社交媒体的反馈来确认自己是否在线，需要同事的认可来维持职业坐标，需要亲密关系的确认来避免自我怀疑。这套反馈系统一旦掉线——比如被拉黑、被冷落、被忽视——你的&amp;quot;自我&amp;quot;就像没有了参照系的坐标，瞬间失去位置感。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;存在感从来不是自发光，而是他人目光的余晖——你离开别人的坐标系，就失去了自己的坐标。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这不是哲学，这是物理：当一个粒子不能被观测时，它的态矢就是不确定的。人作为一种社会粒子，需要持续的观测者来坍缩自己的存在。而现代社会的残酷之处在于：我们付费了，但服务开始降级了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第一章交换媒介的异化从分享存在到兑换服务&#34;&gt;第一章：交换媒介的异化——从&amp;quot;分享存在&amp;quot;到&amp;quot;兑换服务&amp;quot;&lt;/h2&gt;
&lt;p&gt;人类原本的社交结构是一种分布式对等网络。你痛苦，有人倾听；你喜悦，有人共鸣。两个独立系统之间不需要中间件就能完成底层握手——这叫做&amp;quot;共鸣&amp;quot;，是原始协议栈的最高层。&lt;/p&gt;
&lt;p&gt;然后城市化和工业化来了。&lt;/p&gt;
&lt;p&gt;你不再认识邻居，你的朋友圈从部落的 150 人裂变成多城通勤的 500 个弱连接。你不可能和每一个人都建立底层握手，所以人类发明了一个通用的交换媒介——&lt;strong&gt;货币&lt;/strong&gt;——来代理所有社交需求。&lt;/p&gt;
&lt;p&gt;这是个精巧的架构设计，但它隐含了一个致命缺陷：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;货币买来的是标准化的社交服务 API，而不是底层的系统共鸣。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你可以花钱请人听你倾诉（心理咨询），可以买单换取一次高质量陪伴（约会消费），可以送礼维持一段关系（人情往来）。这些都是在接口层面发起的 API 调用——调用成功，返回状态码 200，消息体是一句&amp;quot;没事的，我懂你&amp;quot;。但你心里清楚，对方只是调用了自己的 empathy.so 库，返回了一个预编译的响应包。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;物质和货币从来不是连接本身，它们是连接代币。&lt;/strong&gt; 就像你攒了一万个游戏币，以为自己是富翁，直到发现游戏关服了——你拥有的不是财富，是再也无法兑换的票据。&lt;/p&gt;
&lt;p&gt;更准确地说：&lt;strong&gt;物质能买到的是一次&amp;quot;连接复现&amp;quot;，不是一次&amp;quot;连接建立&amp;quot;&lt;/strong&gt;。前者是对已有连接类型的回放（已知函数调用），后者是随机匹配的未知相遇（函数签名不匹配时返回 400）。人类追求的大多数物质增长，本质上只是为了更大音量地播放同一段录音，而不是去创作新乐章。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第二章社交熵增为什么在人群中反而加倍孤独&#34;&gt;第二章：社交熵增——为什么在人群中反而加倍孤独？&lt;/h2&gt;
&lt;p&gt;这是整篇报告最违反直觉的结论：&lt;strong&gt;社交越多，孤独可能越深。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不是因为社交不好，而是因为&lt;strong&gt;低信噪比的社交会产生热力学意义上的熵增&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;想象一下技术视角。每个「人系统」都有自己的底层协议栈——你喜欢的表达方式，你的敏感话题，你的黑色幽默，你的情绪阈值。当两个协议完全兼容的人交流时，数据包直接在局域网内飞传，延迟低，丢包率 0%，不需要中间件解释。&lt;/p&gt;
&lt;p&gt;但现代社交环境是异构网络。&lt;/p&gt;
&lt;p&gt;为了和大部分人沟通，你必须进行&lt;strong&gt;协议降级&lt;/strong&gt;——把复杂的感受压缩成&amp;quot;还行吧&amp;quot;、&amp;ldquo;没事&amp;rdquo;、&amp;ldquo;挺好的&amp;rdquo;；把精准的情绪翻译成系统默认的表情包；把你最想说的那句话咽回去，换一句对方能接住的废话。每一次降级都是一次有损压缩，信息熵在传输中不可逆地增长。&lt;/p&gt;
&lt;p&gt;同时，你还要运行一套&lt;strong&gt;社交防火墙&lt;/strong&gt;——持续监控：&amp;ldquo;我刚才那句话会不会被误解？&amp;ldquo;&amp;ldquo;我笑的表情够自然吗？&amp;ldquo;&amp;ldquo;刚才的沉默是不是太长了？&amp;ldquo;这个监控进程占用大量认知带宽，其运行功耗远超独处时的心流状态。你不是在社交，你是在同时充当数据发送方、接收方、协议转换器和安全审计员四重角色。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;聚会后那种想瘫倒在床的感觉，不是身体累，是协议栈崩溃后的系统回滚。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就是为什么有些人会在人群中突然感到一种精准的孤独——不是没人说话，而是每个人都在用高度压缩的版本在跟你对话。数据量大，但信息量低。越多无用连接，系统混乱度越高，孤独感不是被稀释而是被放大了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;你感到孤独不是没有人说话，而是因为每个人都在用压缩后的版本跟你对话，信息熵在传输中不可逆地增长。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第三章认知套利的破产物质无法填补的系统空洞&#34;&gt;第三章：认知套利的破产——物质无法填补的系统空洞&lt;/h2&gt;
&lt;p&gt;让我们建立一个模型。&lt;/p&gt;
&lt;p&gt;假设你的内心状态是一个向量 &lt;code&gt;V&lt;/code&gt;，有 N 个维度：安全、被理解、被尊重、被爱、被看到、被接纳……等等。每个维度有一个真实值和一个期望值。孤独感 ≈ 真实值与期望值的欧几里得距离。&lt;/p&gt;
&lt;p&gt;当你获得物质收入或提升社会地位时，你向社交系统投递了一个&lt;strong&gt;高权重信号&lt;/strong&gt;——你有钱、你有权、你有资源。这个信号在社交网络中以指数速度传播，吸引来大量的连接请求。&lt;/p&gt;
&lt;p&gt;但这里有个问题：这些被吸引来的连接并不是和你的 &lt;code&gt;V&lt;/code&gt; 向量匹配的，它们匹配的是&lt;strong&gt;你的外在协议——你的社会镜像&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;你展示财富，吸引来的是财富的反射；你展示地位，吸引来的是权力的膜拜。这些连接建立时握手非常顺畅——但连接的双方不是在交流灵魂，而是在互相确认表面协议的一致性。这是一场&lt;strong&gt;镜像游戏&lt;/strong&gt;：你看到的是别人的目光，但目光里映照的是你自己的社会地位外包装，不是你的内心状态 &lt;code&gt;V&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你以为自己在填补孤独，其实是在扩建一座富丽堂皇的空房子。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们称之为&amp;quot;认知套利的破产&amp;rdquo;：你把物质当成了填补内心空洞的手段，就像用添加外部设备来解决操作系统内核的崩溃。你能装一万个 APP，但如果内核有 Bug，重启就是唯一的出路。物质增长只能缓解症状——它是一种替代性慰藉。奢侈品让你暂时相信自己值得被爱，旅行让你短暂相信自己活得精彩，健身让你短暂相信自己掌控人生。但这些都是&lt;strong&gt;局部最优解的替代函数&lt;/strong&gt;——你不停地给系统打补丁，却从来没看过核心代码的漏洞。&lt;/p&gt;
&lt;p&gt;在工程学上，这叫&lt;strong&gt;系统层级错误&lt;/strong&gt;。你试图用 I/O 层的资源（物质）来解决应用层的崩溃（内心孤独）。任何架构师拿到这份报告都会批注：&lt;strong&gt;跨层级方案不可行，请从 root cause 入手修复。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>自动化生存指南：如何用 Python 构建你的专属「内容缓冲池」？</title>
      <link>/posts/tooling/content-buffer-pool-design/</link>
      <pubDate>Fri, 01 May 2026 12:40:00 +0800</pubDate>
      
      <guid>/posts/tooling/content-buffer-pool-design/</guid>
      <description>&lt;p&gt;你每天打开多少次信息应用？&lt;/p&gt;
&lt;p&gt;Gmail 的红点、Telegram 群聊的未读、RSS 阅读器的计数、Slack 的频道。每一枚红点都是一次认知打断。每一次滑动刷新都是一次注意力税。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我统计过自己的数字行为：平均每天在不同信息源之间切换 &lt;strong&gt;87 次&lt;/strong&gt;。87 次上下文重建。87 次「我刚刚在想什么」。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这不是信息过载。这是&lt;strong&gt;信息碎尸&lt;/strong&gt;——你的注意力被拆成 87 块，扔进了 87 个不同的桶里。每块都不够深，无法形成认知。&lt;/p&gt;
&lt;p&gt;所以我在想：能不能反过来？不主动去「消费」信息，而是让信息自己汇聚到一个地方。等我有认知带宽的时候，一次性深潜处理。&lt;/p&gt;
&lt;p&gt;于是有了 &lt;strong&gt;内容缓冲池（Content Buffer Pool）&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>别再做效率难民：为什么一行粗糙的代码，胜过一万篇完美的干货？</title>
      <link>/posts/tooling/farewell-efficiency-refugees/</link>
      <pubDate>Fri, 01 May 2026 12:30:00 +0800</pubDate>
      
      <guid>/posts/tooling/farewell-efficiency-refugees/</guid>
      <description>&lt;p&gt;凌晨两点，我盯着 n8n 的 workflow 编辑器，屏幕上蜿蜒着二十几个拖拽节点。&lt;/p&gt;
&lt;p&gt;这个号称&amp;quot;低代码自动化神器&amp;quot;的工具，为了把一个 Markdown 文件从 A 点搬到 B 点，消耗了我三个晚上的耐心。安装依赖冲突、Docker 镜像拉不下来、某个 node 莫名其妙 timeout。每一次点击&amp;quot;测试 workflow&amp;quot;，都在用我的认知带宽去喂养一个本不该存在的抽象层。&lt;/p&gt;
&lt;p&gt;我把 n8n 的容器停了。然后写了一行 Python。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;shutil&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;copy(src, dst)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;三行代码。零依赖。零配置。零心理负担。&lt;/p&gt;
&lt;p&gt;这不是一个关于技术选型的故事。这是一个关于&lt;strong&gt;认知能量&lt;/strong&gt;的故事。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>学习的本质，是为内心「重新索引」——当学习心境成为AI时代的底层内核</title>
      <link>/posts/learning/2026-05-01-learning-as-kernel-reconstruction/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/learning/2026-05-01-learning-as-kernel-reconstruction/</guid>
      <description>在AI算力爆炸时代，学习不再是知识获取，而是内心的重新索引。</description>
    </item>
    
    <item>
      <title>雨季前的系统崩溃：对一个EPC项目的数学解剖</title>
      <link>/posts/systems-thinking/2026-03-28-the-crisis-before-the-monsoon/</link>
      <pubDate>Sat, 28 Mar 2026 22:30:00 +0800</pubDate>
      
      <guid>/posts/systems-thinking/2026-03-28-the-crisis-before-the-monsoon/</guid>
      <description>&lt;p&gt;2026年3月，云南永德县。22天铺设800米钢管——这是班老村片区交出的成绩单。&lt;/p&gt;
&lt;p&gt;项目经理看了摇头，业主代表看了皱眉，但没有人指出一个更底层的事实：&lt;strong&gt;这不是人的问题，是系统设计本身出了问题。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一系统底噪当-kpi-传感器失效&#34;&gt;一、系统底噪：当 KPI 传感器失效&lt;/h2&gt;
&lt;p&gt;任何反馈控制系统都需要一个关键的元件：&lt;strong&gt;真实的传感器读数&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;永德项目的传感器报回了什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;勐板片区：蓄水池 75%，DN150 管 68%，&lt;strong&gt;正在收尾&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;班老村片区：DN200 管 5.6%，&lt;strong&gt;严重滞后&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;大雪山三个子区：0%，&lt;strong&gt;死锁&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;崇岗、永康：工程量&amp;quot;待定&amp;quot;，&lt;strong&gt;盲区&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;表面上，这是一个进度报表。但作为系统工程师，我看到的是一套&lt;strong&gt;传感器网络正在给控制中心传回噪声&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;待开工&amp;quot;持续 25 天意味着什么？在反馈控制理论中，这等于一个执行器在发出了指令 25 天后，位置传感器仍报告&amp;quot;零位移&amp;rdquo;。控制算法要么认为传感器坏了，要么认为执行器与控制系统断连。&lt;/p&gt;
&lt;p&gt;更有趣的是，&amp;ldquo;待资源到位&amp;quot;被当作一个合理的状态描述，而不是一个&lt;strong&gt;系统崩溃信号&lt;/strong&gt;。大雪山三个片区（大平山、忙旧河、大沟坝）自 3 月 2 日起置于这个状态——25 天，零进度，零报警。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;当一个系统允许执行器无限期停留在&amp;quot;就绪&amp;quot;状态而不产生任何效用时，管理者的认知过滤器已经出现了不可逆的损伤。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二数学危机36-到-151-的跳跃&#34;&gt;二、数学危机：36 到 151 的跳跃&lt;/h2&gt;
&lt;p&gt;让我们做一个简单的计算。&lt;/p&gt;
&lt;p&gt;班老村 DN200 钢管安装，22 天完成 800 米。日均速率：&lt;/p&gt;
&lt;p&gt;$$v_{current} = \frac{800}{22} = 36.4 ; \text{米/天}$$&lt;/p&gt;
&lt;p&gt;剩余 13,600 米，计划在 90-120 天内完成。所需日均速率：&lt;/p&gt;
&lt;p&gt;$$v_{90} = \frac{13600}{90} = 151.1 ; \text{米/天}$$
$$v_{120} = \frac{13600}{120} = 113.3 ; \text{米/天}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;效率缺口在 3.1 到 4.1 倍之间。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title></title>
      <link>/posts/systems-thinking/wechat-intro-literary-happiness/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/posts/systems-thinking/wechat-intro-literary-happiness/</guid>
      <description>&lt;!--
  公众号标题（≤9字）: 文学更懂你的心
  公众号摘要（≤17字）: 心理学给地图，文学陪你走路
  封面: 用 wechat-cover-template.py 生成，主标题&#34;文学更懂你的心&#34;，分类标签&#34;· 随 笔 ·&#34;
--&gt;

&lt;section style=&#34;background:#1a1a2e;padding:32px 20px 28px 20px;margin-bottom:24px;&#34;&gt;
&lt;p style=&#34;color:#c8a03c;font-size:12px;letter-spacing:6px;text-align:center;margin:0 0 20px 0;&#34;&gt;世 界 一 隅&lt;/p&gt;
&lt;p style=&#34;color:#ffffff;font-size:18px;line-height:2.0;margin:0;text-align:center;&#34;&gt;
你有没有过这样的体验——&lt;br&gt;
一本小说里的人物，比你身边的人更理解你？&lt;br&gt;
一段童话里的对话，比任何励志书都更精准地击中你的困境？
&lt;/p&gt;
&lt;p style=&#34;color:#c8a03c;font-size:16px;font-weight:bold;text-align:center;margin:18px 0 0 0;&#34;&gt;
这不是偶然。这是文学独有的力量。
&lt;/p&gt;
&lt;/section&gt;

&lt;p style=&#34;color:#333;font-size:15px;line-height:2.0;margin:0 0 16px 0;text-indent:2em;&#34;&gt;
它不告诉你&#34;应该怎么想&#34;。它直接把你放进一个情境里，让你自己去感受、去判断、去困惑，然后去理解。这就是我要写这本书的起点——&lt;strong&gt;用文学经典的结构性阅读，来验证幸福的可能性。&lt;/strong&gt;
&lt;/p&gt;

&lt;section style=&#34;margin:32px 0 16px 0;padding:10px 0 10px 16px;background:#1a1a2e;border-left:5px solid #c8a03c;&#34;&gt;
&lt;p style=&#34;color:#ffffff;font-size:17px;font-weight:bold;margin:0;letter-spacing:2px;&#34;&gt;壹 · 为什么是文学，不是心理学？&lt;/p&gt;
&lt;/section&gt;

&lt;p style=&#34;color:#333;font-size:15px;line-height:2.0;margin:0 0 16px 0;text-indent:2em;&#34;&gt;
心理学给你一张地图。地图是清晰的、可量化的、有路径可循的。但地图有一个致命的问题：&lt;strong&gt;它不能替你走路。&lt;/strong&gt;
&lt;/p&gt;

&lt;p style=&#34;color:#333;font-size:15px;line-height:2.0;margin:0 0 16px 0;text-indent:2em;&#34;&gt;
文学相反。文学不给你地图。文学直接把你丢进一条雨中的森林小路，让你闻泥土的味道，踩湿滑的石头，在岔路口犹豫。你读完一部小说，没有收获任何&#34;方法论&#34;，但你体验了一个完整的人生情境。那种体验，比任何理论都更深刻地改变了你。
&lt;/p&gt;

&lt;section style=&#34;margin:28px 0;padding:20px 18px;background:#1a1a2e;border-left:5px solid #c8a03c;&#34;&gt;
&lt;p style=&#34;color:#c8a03c;font-size:15px;line-height:2.0;margin:0;text-align:center;font-weight:bold;&#34;&gt;
✦&lt;br&gt;&lt;br&gt;心理学解释幸福。文学让你遇见幸福。
&lt;/p&gt;
&lt;/section&gt;

&lt;p style=&#34;color:#333;font-size:15px;line-height:2.0;margin:0 0 16px 0;text-indent:2em;&#34;&gt;
这不是在贬低心理学。心理学给了我们关于认知、情绪和行为的宝贵框架。但&#34;心灵圆满&#34;这件事，从来不是一个能被拆解成步骤的问题。它是体验性的、情境性的、需要时间沉淀的。而文学，正是人类为这种体验发明的最好的容器。
&lt;/p&gt;

&lt;section style=&#34;margin:32px 0 16px 0;padding:10px 0 10px 16px;background:#1a1a2e;border-left:5px solid #c8a03c;&#34;&gt;
&lt;p style=&#34;color:#ffffff;font-size:17px;font-weight:bold;margin:0;letter-spacing:2px;&#34;&gt;贰 · 什么是&#34;心灵圆满&#34;？&lt;/p&gt;
&lt;/section&gt;

&lt;p style=&#34;color:#333;font-size:15px;line-height:2.0;margin:0 0 16px 0;text-indent:2em;&#34;&gt;
在开始之前，我需要先定义这个核心概念。
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title></title>
      <link>/posts/tooling/2026-06-13-pitfall-knowledge-base/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/posts/tooling/2026-06-13-pitfall-knowledge-base/</guid>
      <description>&lt;h1 id=&#34;我整理了-16-条程序员真实踩坑每条四步拆解症状根因修复避免&#34;&gt;我整理了 16 条程序员真实踩坑，每条四步拆解：症状→根因→修复→避免&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;踩过坑、修好坑、记住坑——同一个坑不踩第二次。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;写了几年代码，发现自己踩过的坑有一个共同特点：&lt;strong&gt;修的时候花了好几个小时，但根因往往就一行代码的事&lt;/strong&gt;。更气人的是，过几个月又踩一遍。&lt;/p&gt;
&lt;p&gt;于是我做了一件事：把踩过的坑按统一格式整理出来——&lt;strong&gt;每条固定四个段落&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🩺 &lt;strong&gt;症状&lt;/strong&gt;：你看到什么？&lt;/li&gt;
&lt;li&gt;🔬 &lt;strong&gt;根因&lt;/strong&gt;：到底为什么出问题？&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;修复&lt;/strong&gt;：怎么做？&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;怎么避免&lt;/strong&gt;：下次怎么不踩？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;攒了 16 条，放在 GitHub 开源仓库里，也搭了个简单的展示站。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;举三条最有共鸣的&#34;&gt;举三条最有共鸣的&lt;/h2&gt;
&lt;h3 id=&#34;1-git-push-ssl-握手失败&#34;&gt;1. Git push SSL 握手失败&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：&lt;code&gt;git push&lt;/code&gt; 到 GitHub 每次报 SSL/TLS handshake 失败&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：Git 没走系统代理，直连被墙&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：一行命令 —— &lt;code&gt;git config --global http.proxy http://127.0.0.1:7897&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：新机器第一件事就是设全局 Git 代理，不要只给单个仓库设&lt;/p&gt;
&lt;h3 id=&#34;2-python-缩进导致-140-行代码静默跳过&#34;&gt;2. Python 缩进导致 140 行代码静默跳过&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：AstrBot 微信公众号被动回复永远不执行，日志无任何报错&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：140 行被动回复代码缩进在了 &lt;code&gt;if active_send_mode:&lt;/code&gt; 块内部（12 空格对齐），当 &lt;code&gt;active_send_mode=False&lt;/code&gt; 时整个 if 块被跳过&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：代码提到 if 外面，和 if 同级缩进&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：Python 缩进错误在特定条件下才暴露——代码在，逻辑在，就是进不去。排查时先怀疑控制流缩进&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
