<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[schwannden: Techonology]]></title><description><![CDATA[Insight into AI/ML, cloud-native infrastructure, or just software engineering in general.]]></description><link>https://blog.schwannden.com/s/techonology</link><image><url>https://substackcdn.com/image/fetch/$s_!PCuI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c2324a-b3f3-4858-b911-4746dc76523d_390x390.png</url><title>schwannden: Techonology</title><link>https://blog.schwannden.com/s/techonology</link></image><generator>Substack</generator><lastBuildDate>Fri, 17 Jul 2026 09:43:10 GMT</lastBuildDate><atom:link href="https://blog.schwannden.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[schwannden]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[schwannden@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[schwannden@substack.com]]></itunes:email><itunes:name><![CDATA[schwannden]]></itunes:name></itunes:owner><itunes:author><![CDATA[schwannden]]></itunes:author><googleplay:owner><![CDATA[schwannden@substack.com]]></googleplay:owner><googleplay:email><![CDATA[schwannden@substack.com]]></googleplay:email><googleplay:author><![CDATA[schwannden]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Identity Is the Network]]></title><description><![CDATA[A friend at my church brought an old Mac in a few weeks ago.]]></description><link>https://blog.schwannden.com/p/identity-is-the-network</link><guid isPermaLink="false">https://blog.schwannden.com/p/identity-is-the-network</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Thu, 09 Jul 2026 14:26:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d345fb6b-3482-48ed-a288-8d00e8d26112_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yLKp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yLKp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yLKp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yLKp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yLKp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yLKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Identity Is the Network&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Identity Is the Network" title="Identity Is the Network" srcset="https://substackcdn.com/image/fetch/$s_!yLKp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yLKp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yLKp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yLKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44dded-96eb-4f3e-a17a-beaff4997aeb_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>A friend at my church brought an old Mac in a few weeks ago. He wanted to run n8n on it and turn it into our congregation's AI experimentation ground &#8212; automating the tedious stuff: rosters, reminders, the small administrative debt every volunteer organization accumulates. Reasonable idea. Then he had to answer the question every home-lab builder eventually hits: how do you let people reach a service running on a machine sitting behind your gateway, without opening that gateway to the entire internet?</p><p>He had a Synology NAS already, so he did what a lot of careful people do &#8212; he put the NAS's VPN server in front of the Mac and decided nobody talks to n8n unless the VPN tunnel is up. Sound instinct. And it's exactly where I want to start, because the failure mode he was avoiding, and the one he stepped into instead, are both symptoms of the same disease: we've been authenticating devices and networks when we should have been authenticating people.</p><h2>The Hole You Dig Either Way</h2><p>The alternative to VPN is remote desktop &#8212; RDP or VNC into the Mac directly. It's tempting because it needs zero client setup. Point a browser or a thin client at an address, type a password, done. Which is exactly the problem: "point an address at it" means the address has to be reachable, which means a port has to be open on the gateway, forwarded to a machine inside your private network. Every scanner on the internet finds that port eventually. RDP has one of the worst exposure track records in networking &#8212; it's a perennial top vector in ransomware post-mortems precisely because it's a direct, authenticated-at-the-endpoint tunnel into a box that usually has broad filesystem and process access. You're not exposing "a service." You're exposing a full desktop session.</p><p>So VPN is the correct instinct. Terminate access at the tunnel, not at the app. But now you've traded one problem for a slower, more annoying one. A VPN needs a client. Someone has to download WireGuard or OpenVPN, import a config file, and &#8212; this is the part that kills adoption in a volunteer organization &#8212; understand what a config file is. And on the network side, you often still need to open a UDP port on the gateway for the VPN server to be reachable from outside, which means someone has to know what port forwarding is and be trusted to touch the gateway's admin panel to set it up.</p><p>None of this is hard for an engineer. It is completely opaque to the person in your church who just wants automated reminders to go out on Tuesdays. And that's the actual constraint: whatever you build has to be operable by people who will never read a networking doc.</p><h2>Reframing the Problem</h2><p>Here's the thesis: the friction in both remote desktop and VPN isn't a UX problem you can smooth over with a nicer wizard. It's a modeling problem. Both approaches treat authentication as something that happens to a <em>device</em> at a <em>location</em> &#8212; this IP, this port, this machine's private key, configured once, sitting there as a static grant. Change the device, change the network, add a new person, revoke an old one, and you're back into the gateway's admin panel, hand-editing config.</p><p>The fix isn't a better VPN client. It's moving the unit of trust from "this device on this network" to "this account, verified continuously, wherever it happens to be." Once identity is the thing being checked &#8212; not location, not a static tunnel config &#8212; the network topology becomes an implementation detail the system manages for you instead of a thing your users have to reason about.</p><h2>How Ubiquiti Actually Does This</h2><p>This is the part I've been close to, because I lead the SSO team at Ubiquiti, and I want to describe it precisely rather than just gesture at "the cloud does it."</p><p>Ubiquiti's newest answer to this is <strong>UniFi Fabric</strong>, a concept the company rolled out only this past year: a set of identities, not the gateway, now governs a set of devices. You bind your consoles into a Fabric, and access to whatever's running behind them becomes a property of <em>who</em> you invite, not a config file you hand out. VPN comes built into that model, not bolted onto it.</p><p>Once that's live, granting my friend access to the n8n box isn't "give him the VPN config file." It's assigning a role to a person in Site Manager's People view. The moment a role or permission lands on someone, UniFi automatically sends them an invitation to the <strong>UniFi Endpoint app</strong> &#8212; the identity client, on desktop and mobile &#8212; with a 2FA code baked into onboarding. He installs the app, authenticates once, and from that point on the app itself is the credential. No config file changed hands. No port was opened for him personally.</p><p>The VPN leg specifically is handled by <strong>Teleport</strong>, which is where the "no port forwarding" claim actually earns itself. Teleport uses WireGuard, but instead of requiring the gateway to be directly reachable from the internet, the gateway maintains an outbound connection to Ubiquiti's cloud relay. When my friend's device wants in, the connection is brokered through that relay &#8212; the gateway never needed an open inbound port, because it never needed to <em>be</em> reachable; it only ever had to <em>reach out</em>. That's the same trick NAT traversal and reverse tunnels have always used, just packaged so nobody has to know the word "NAT traversal" to benefit from it.</p><p>Stack those two things and you get what my friend actually wanted: invite a person, they get one-click VPN, the gateway's attack surface never grew, and nobody had to be taught what a port is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I1o0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I1o0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!I1o0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!I1o0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!I1o0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I1o0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png" width="1536" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Identity Is the Network&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Identity Is the Network" title="Identity Is the Network" srcset="https://substackcdn.com/image/fetch/$s_!I1o0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!I1o0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!I1o0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!I1o0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d7abb5-35e0-46a4-9e12-6a02990a79ff_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>This Isn't New &#8212; It's BeyondCorp for Your Garage</h2><p>I want to be honest about what's genuinely novel here versus what's good packaging. The underlying idea &#8212; stop trusting network position, verify identity and device posture on every request &#8212; is Zero Trust Network Access, and it's been enterprise doctrine since Google published the BeyondCorp papers describing how they let employees work from any network, coffee shop included, without a traditional VPN, by making every request prove who was making it. "Never trust, always verify," identity as the new perimeter &#8212; none of that language is new, and none of it originated at Ubiquiti.</p><p>What's actually happening is that a decade of enterprise-grade identity infrastructure &#8212; IdP federation, continuous authorization, cloud relay for NAT traversal &#8212; is getting compressed into a product a single person can operate for their home network or their church's spare Mac. That compression is the real story of the AI home-lab moment: the people spinning up n8n or a local LLM on hardware in a closet are, without necessarily knowing it, recreating the access-control problem that enterprises spent ten years and considerable headcount solving. They just don't have a security team. The gateway vendor becomes the security team, by default, whether it wants the job or not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9pa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9pa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!K9pa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!K9pa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!K9pa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9pa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png" width="1536" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Identity Is the Network&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Identity Is the Network" title="Identity Is the Network" srcset="https://substackcdn.com/image/fetch/$s_!K9pa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!K9pa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!K9pa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!K9pa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d152dc2-1455-4cde-92a0-4fe2b004d783_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The Security Surface You're Actually Choosing</h2><p>Here's the part of the argument I'd push back on if I heard someone else make it uncritically: shifting authentication from per-device config to account identity doesn't remove risk, it <em>concentrates</em> it. A leaked WireGuard config compromises one tunnel to one machine. A compromised account, once role-based and federated across WiFi, VPN, and door access, is a much bigger blast radius if it falls into the wrong hands. Centralizing identity is a bet that you can secure the <em>few</em> things that matter &#8212; MFA, session policy, anomaly detection on the identity provider &#8212; better than you could secure the <em>many</em> things that used to be scattered: a dozen device configs, a dozen static keys, a port-forward rule someone added in 2019 and forgot about.</p><p>I think that bet is correct for the overwhelming majority of people, not because account compromise is rare, but because it's a <em>legible</em> risk. You can reason about "is 2FA on, is the session policy sane, has this account done anything unusual." You cannot reason about "which of the forty devices that ever got a VPN config still has it, and is that laptop still in the drawer it was left in." Distributed, invisible trust grants are harder to audit than one well-guarded identity, even though the identity is a scarier single point of failure on paper. Ninety percent of people are safer trusting one strong lock than managing forty forgotten ones &#8212; the other ten percent, running real infrastructure at scale, still need the layered device posture and network segmentation that pure identity-centric models compress away. That's a real tradeoff, not a solved problem, and anyone telling you identity-first access has no downside is selling you something.</p><h2>What This Has to Do With AI Infrastructure</h2><p>Ubiquiti sells switches, gateways, cameras, WiFi access points. It sells zero AI products. And yet the exact pattern I watched solve my friend's church-automation problem is the pattern every AI home lab and, at a different scale, every AI factory is going to need: a growing population of self-hosted services &#8212; n8n instances, local inference servers, agent runners &#8212; sitting on private networks, that need to be reachable by specific people without turning the network inside out. Nobody wants to hand-configure a VPN client for every teammate who needs to hit an internal model endpoint, and nobody wants that endpoint exposed to the raw internet either.</p><p>The companies that end up mattering to the AI infrastructure stack won't only be the ones selling GPUs and model weights. Some of them will be the ones that already figured out how to make "only the right person, from anywhere, with zero manual network configuration" a one-click default instead of a networking elective. My friend never once thought about IP addresses, VPN clients, or port forwarding to get his automation ground running securely. He thought about who he wanted to invite. That's the interface AI infrastructure needs at every layer above the silicon, and it's a stranger thing than it should be that the company already building it is one nobody associates with AI at all.</p>]]></content:encoded></item><item><title><![CDATA[Replace MCP with Skills and Why]]></title><description><![CDATA[MCP was genuinely great at first]]></description><link>https://blog.schwannden.com/p/replace-mcp-with-skills-and-why</link><guid isPermaLink="false">https://blog.schwannden.com/p/replace-mcp-with-skills-and-why</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Thu, 09 Apr 2026 13:38:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/789b55d0-d19f-4969-b3a6-369e08cbedc3_2000x1086.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><h2>MCP was genuinely great at first</h2><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kvq7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kvq7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 424w, https://substackcdn.com/image/fetch/$s_!kvq7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 848w, https://substackcdn.com/image/fetch/$s_!kvq7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!kvq7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kvq7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!kvq7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 424w, https://substackcdn.com/image/fetch/$s_!kvq7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 848w, https://substackcdn.com/image/fetch/$s_!kvq7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!kvq7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc55b6882-1885-4dae-95d8-f6e600d11aa3_2000x1086.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>When we first wired up <code>mcp-atlassian</code> to Claude Code, it felt like magic. "Create a Jira ticket for this bug." Done. "Update the Confluence page with the new architecture." Done. The MCP server handled authentication, request construction, Atlassian Document Format &#8211; all the tedious plumbing that makes the Atlassian API unpleasant to use directly. We had 71 tools at our fingertips and didn't have to think about any of them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LBX5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LBX5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 424w, https://substackcdn.com/image/fetch/$s_!LBX5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 848w, https://substackcdn.com/image/fetch/$s_!LBX5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 1272w, https://substackcdn.com/image/fetch/$s_!LBX5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LBX5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png" width="2000" height="884" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:884,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!LBX5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 424w, https://substackcdn.com/image/fetch/$s_!LBX5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 848w, https://substackcdn.com/image/fetch/$s_!LBX5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 1272w, https://substackcdn.com/image/fetch/$s_!LBX5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F449223dd-ff56-409e-9c5e-0dead702d765_2000x884.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For generic, one-off tasks, this was perfect. The problem started when we wanted things done <em>our</em> way.</p><h2>We got tired of repeating ourselves</h2><p>Every time we created a ticket, we had to say: "Use project Cloud-Team. Set the component to Cloud-Core. Prefix the title with <code>[Cloud]</code>. Assign it based on the current sprint rotation." Every time we created a Confluence page, we had to specify the space, the parent page, the heading structure. And half the time the formatting came back wrong anyway -- list items with broken bold text, headings where there shouldn't be headings, descriptions that needed a second pass to fix.</p><p>We were spending as much time correcting output and restating preferences as we would have spent doing the work manually. The tool was fast but imprecise, and precision is what you need when every ticket and every page feeds into your team's workflow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fz_v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fz_v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 424w, https://substackcdn.com/image/fetch/$s_!Fz_v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 848w, https://substackcdn.com/image/fetch/$s_!Fz_v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 1272w, https://substackcdn.com/image/fetch/$s_!Fz_v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fz_v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png" width="2000" height="877" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:877,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!Fz_v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 424w, https://substackcdn.com/image/fetch/$s_!Fz_v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 848w, https://substackcdn.com/image/fetch/$s_!Fz_v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 1272w, https://substackcdn.com/image/fetch/$s_!Fz_v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dc2a99f-5f6f-469e-9509-4a8679f9432c_2000x877.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So we built skills on top. A <code>jira-ticket</code> skill that encoded our project defaults, title conventions, component assignments, and custom field handling. A <code>confluence-page</code> skill that knew our space structure and formatting standards. These skills invoked the MCP tools underneath -- <code>jira_create_issue</code>, <code>jira_update_issue</code>, <code>confluence_create_page</code> -- but wrapped them in our team's specific logic.</p><p>This worked. For a while.</p><h2>Then the MCP upgraded and broke everything</h2><p>The <code>mcp-atlassian</code> package shipped a new version, and our skills broke. Tool names changed. Parameter formats shifted. Behaviors we relied on silently disappeared.</p><p>We rewrote our skills to match the new version. And in doing that rewrite, we started noticing things we'd been blissfully ignorant of.</p><p>The Jira REST API has multiple versions. Version 2 accepts Markdown-ish text for description fields. Version 3 requires Atlassian Document Format -- a JSON structure with typed nodes, marks, and nested content. The MCP server was converting our Markdown input into ADF internally, and that conversion was where five of our six documented bugs lived: bold text inside list items rendered wrong, underscores triggered false italics, hash characters were parsed as headings, leading spaces vanished, horizontal rules appeared where they shouldn't.</p><p>We'd been debugging formatting issues at the wrong layer. The bugs weren't in our skills or in our input -- they were in a Markdown-to-ADF converter hidden inside the MCP server, a converter we couldn't see, couldn't control, and couldn't fix.</p><h2>The file upload gap and the Docker problem</h2><p>Two more friction points pushed us further from MCP.</p><p>First: <code>mcp-atlassian</code> didn't support file uploads. That sounds minor until you realize it means no image attachments on Confluence pages, no uploaded diagrams, and critically -- no Mermaid diagram macros. Confluence renders Mermaid diagrams through the <code>mermaid-cloud</code> macro, which references an attached image. Without file upload support in the MCP, we had to do these operations manually: upload the file through some other means, get the attachment ID, then construct the page content referencing it. Half the workflow was inside the MCP abstraction and half was outside it, which is worse than having all of it outside.</p><p>Second: the Docker overhead. The version of <code>mcp-atlassian</code> we started with only ran in Docker. Each Claude Code session spawned its own container. Run three sessions in a morning -- reviewing a PR, creating tickets, updating docs -- and you'd have three containers alive, each holding a connection to Atlassian. Nobody was cleaning them up reliably. We'd find stale containers days later.</p><p>We eventually switched to a version that ran natively via <code>uvx</code>, which eliminated the container sprawl. But it was another migration, another set of configuration changes, another afternoon spent on tooling plumbing instead of actual work.</p><h2>The accumulating weight of workarounds</h2><p>By this point we had:</p><ul><li><p>A skill layer on top of MCP to encode team-specific behavior</p></li><li><p>Six documented converter bugs with workarounds baked into our skills</p></li><li><p>A mandatory two-step process for issue creation (create without custom fields, then update to add them, because the converter broke when custom fields were in the same call)</p></li><li><p>Manual file upload workflows for anything involving attachments</p></li><li><p>Memory files documenting MCP quirks so Claude wouldn't repeat mistakes</p></li><li><p>A history of one breaking upgrade already absorbed</p></li></ul><p>We were maintaining more infrastructure <em>around</em> the MCP than the MCP was saving us. And we were still hitting formatting bugs on every third Confluence page update.</p><p>That's when I read Mario Zechner's "<a href="https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/">What If You Don't Need MCP?</a>," and it reframed the problem for me.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L-Qn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L-Qn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 424w, https://substackcdn.com/image/fetch/$s_!L-Qn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 848w, https://substackcdn.com/image/fetch/$s_!L-Qn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 1272w, https://substackcdn.com/image/fetch/$s_!L-Qn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L-Qn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png" width="2000" height="721" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:721,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!L-Qn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 424w, https://substackcdn.com/image/fetch/$s_!L-Qn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 848w, https://substackcdn.com/image/fetch/$s_!L-Qn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 1272w, https://substackcdn.com/image/fetch/$s_!L-Qn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cceccf9-ca47-4668-8b49-8a21e4f98970_2000x721.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Zechner's argument is deceptively simple: MCP servers need to cover all bases, which means they ship large numbers of tools with lengthy descriptions, all permanently consuming context. He measured it. Playwright MCP: 21 tools, 13.7k tokens -- 6.8% of Claude's context window, gone before you ask a single question. Chrome DevTools MCP: 26 tools, 18k tokens, 9% of context. Our <code>mcp-atlassian</code> was worse: 71 tools, ~15-20k tokens, loaded into every session regardless of whether that session would ever touch Jira.</p><p>But the context cost was only his first point. The deeper problem is composability. MCP outputs route back through the agent's context before they can be persisted or combined with other results. Every API response, every search result, every page content fetch -- it all lands in the context window as intermediate state, crowding out the space you need for actual reasoning. With a curl command, the agent can pipe output to a file, chain it with <code>jq</code>, or redirect it entirely -- the result doesn't have to pass through context at all.</p><p>His solution was minimal bash scripts documented in a README. The agent reads the README, understands the tools, calls them directly. His browser toolkit went from thousands of tokens of tool schemas down to 225 tokens of documentation. And the key insight behind the savings: "This efficiency comes from the fact that models know how to write code and use Bash. I'm conserving context space by relying heavily on their existing knowledge." You don't need a tool schema to teach Claude how to make an HTTP request. Claude already knows curl. What it needs is the authentication pattern and the endpoint structure -- documentation, not abstraction.</p><p>Zechner also pointed out something we'd been experiencing without naming it: MCP servers are hard to extend. You can check out the source and modify it, but then you have to understand <em>their</em> codebase on top of your own. When our MCP server's converter broke, we couldn't just fix the converter -- we'd have needed to fork the project, understand its ADF conversion pipeline, patch it, and maintain our fork. Instead we documented the bugs and worked around them. That's the tax you pay for an abstraction you don't control.</p><p>We weren't just paying context overhead. We were paying maintenance overhead, debugging overhead, upgrade-compatibility overhead, and extensibility overhead &#8211; all to rent an abstraction that was hiding its own bugs from us, whose outputs weren't composable, and whose tool schemas consumed context whether we used them or not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EB_l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EB_l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 424w, https://substackcdn.com/image/fetch/$s_!EB_l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 848w, https://substackcdn.com/image/fetch/$s_!EB_l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!EB_l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EB_l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png" width="2000" height="1078" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1078,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!EB_l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 424w, https://substackcdn.com/image/fetch/$s_!EB_l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 848w, https://substackcdn.com/image/fetch/$s_!EB_l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!EB_l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27299b58-6f87-406c-baf7-120f65168fd1_2000x1078.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>A skill is all we need</h2><p>The replacement architecture has three pieces, same as before, but the bottom layer changed completely.</p><p><strong><code>recipe-atlassian</code></strong> replaced the MCP server. It's a single skill file containing documented curl patterns for every endpoint we use -- authentication, issue CRUD, search, Confluence page operations, file uploads, the works. No SDK, no wrapper functions. Just examples that Claude reads and adapts.</p><p><strong><code>jira-ticket</code></strong> and <strong><code>confluence-page</code></strong> stayed as our team-specific workflow layers, but got cleaner. They stopped referencing MCP tool names and started saying "use the <code>recipe-atlassian</code> skill for all API calls." All the team logic -- project defaults, title conventions, assignee rules, verification workflows -- remained untouched. The skills shed their API plumbing and kept only business logic.</p><p>The critical design decisions:</p><p><strong>Claude generates ADF inline.</strong> Instead of converting Markdown through a buggy middle layer, Claude reads a 200-line ADF schema reference and constructs the JSON directly. Five converter bugs disappeared in one stroke. The same approach works for Confluence -- Claude writes storage format XHTML natively, which gives us access to every Confluence macro including Mermaid diagrams, code blocks with language hints, info panels, and table of contents. The MCP's Markdown conversion couldn't reach most of these.</p><p><strong>Every API call is a visible curl command.</strong> When something fails, you see the exact request and response:</p><pre><code>curl -s -u "${JIRA_USERNAME}:${JIRA_API_TOKEN}" \
  -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "fields": {
      "project": {"key": "PROJ"},
      "summary": "Issue title",
      "issuetype": {"name": "Task"},
      "description": {"version": 1, "type": "doc", "content": [...]}
    }
  }' \
  "${JIRA_URL}/rest/api/3/issue"
</code></pre><p>No opaque intermediary. No hidden conversion. No wondering which layer broke.</p><p><strong>File uploads just work.</strong> Curl handles multipart form uploads natively. The thing MCP couldn't do at all became a straightforward curl call with <code>-F "file=@diagram.png"</code>. We could finally do full Confluence page updates with Mermaid diagrams in a single workflow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nHLX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nHLX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 424w, https://substackcdn.com/image/fetch/$s_!nHLX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 848w, https://substackcdn.com/image/fetch/$s_!nHLX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 1272w, https://substackcdn.com/image/fetch/$s_!nHLX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nHLX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png" width="2000" height="729" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:729,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!nHLX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 424w, https://substackcdn.com/image/fetch/$s_!nHLX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 848w, https://substackcdn.com/image/fetch/$s_!nHLX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 1272w, https://substackcdn.com/image/fetch/$s_!nHLX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F300c4e35-85d7-47bf-beed-ec4e2973b9d0_2000x729.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What the abstraction was hiding</h2><p>Going direct surfaced things the MCP had been quietly handling -- and sometimes quietly mishandling.</p><p><strong>URL format mismatch.</strong> <code>JIRA_URL</code> is <code>https://your-org.atlassian.net</code> with no path suffix. <code>CONFLUENCE_URL</code> is <code>https://your-org.atlassian.net/wiki</code> with <code>/wiki</code> included. Our first Confluence curl call produced <code>.../wiki/wiki/api/v2/pages</code>. A 404 on attempt one. Trivial to fix, but we'd never learned the actual URL structure because the MCP constructed URLs for us.</p><p><strong>ADF-typed custom fields reject strings.</strong> We tried clearing a field by setting it to <code>""</code>. The API said: <code>"Operation value must be an Atlassian Document"</code>. The field was ADF-typed -- it needed <code>{"version": 1, "type": "doc", "content": []}</code>. The MCP had been silently coercing types.</p><p><strong>Deprecated search endpoint.</strong> The old <code>GET /rest/api/3/search</code> is deprecated. The replacement is <code>POST /rest/api/3/search/jql</code> with token-based pagination. The MCP was still on the old endpoint. Going direct put us on the current API.</p><p>Every one of these was a thing we should have understood about our own API surface. The MCP wasn't just abstracting the HTTP calls -- it was abstracting our understanding of the system we depend on.</p><h2>The numbers</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ouTD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ouTD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 424w, https://substackcdn.com/image/fetch/$s_!ouTD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 848w, https://substackcdn.com/image/fetch/$s_!ouTD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 1272w, https://substackcdn.com/image/fetch/$s_!ouTD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ouTD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png" width="2000" height="935" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:935,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Replace MCP with Skills and Why&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Replace MCP with Skills and Why" title="Replace MCP with Skills and Why" srcset="https://substackcdn.com/image/fetch/$s_!ouTD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 424w, https://substackcdn.com/image/fetch/$s_!ouTD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 848w, https://substackcdn.com/image/fetch/$s_!ouTD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 1272w, https://substackcdn.com/image/fetch/$s_!ouTD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19968a1b-ac7c-4b43-8701-3442c810ab07_2000x935.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Metric MCP (before) Skill (after) Tools registered per session 71 (always loaded) 0 (loaded on demand) Idle context cost ~15-20k tokens 0 tokens External dependencies Docker or uvx, mcp-atlassian PyPI curl, jq (system builtins) Converter bugs/workarounds 6 documented 0 (direct API) Issue creation 2 calls (bug workaround) 1 call File upload support No Yes (native curl) Breaking upgrades absorbed 1 (with full skill rewrite) N/A (we control the patterns)</p><p>The zero idle cost is the headline number. Skills load on demand &#8211; if a session doesn't touch Jira, zero tokens are spent on Atlassian tooling. With MCP, those 71 tool schemas were in context from session start regardless of whether you needed them.</p><p>But the number I care about most is the last one. We will never again have a dependency upgrade break our team's workflow. The curl patterns in our recipe skill talk directly to Atlassian's REST API. If Atlassian changes an endpoint, we update one line in one file. No waiting for an MCP maintainer to ship a fix. No hoping the fix doesn't introduce new converter bugs. No rewriting our workflow skills because tool names changed.</p><h2>The slow unraveling</h2><p>Looking back, the trajectory was predictable. MCP gave us fast access to an unfamiliar API, and that was valuable. But as our needs got specific -- team conventions, formatting standards, attachment workflows, custom fields -- the abstraction started fighting us instead of helping us. Each workaround was small. Each bug was tolerable. Each upgrade was absorbable. But they accumulated, and at some point we crossed the line where the MCP was costing more than it saved.</p><p>The migration took one session. The six converter workarounds disappeared immediately. File uploads started working. Docker containers stopped piling up. And now when a curl call returns a 400, we see exactly why -- because there's nothing between us and the API but a documented pattern and a shell.</p><p>I don't think MCP is wrong. For exploring an unfamiliar API, for broad tool discovery, for integrations maintained by someone else -- it earns its keep. But for a focused integration where you've accumulated a bug list and a workaround file and a history of breaking upgrades? At that point you're not using a tool. You're maintaining a dependency. And the question becomes whether that dependency is giving you more than <code>curl</code> would.</p><p>For us, the answer was no.</p>]]></content:encoded></item><item><title><![CDATA[AI 典範轉移 Ep.3：從複製貼上到 Commit——Skill 如何取代了我的 Prompt 收藏夾]]></title><description><![CDATA[&#36889;&#20491;&#31995;&#21015;&#21069;&#20841;&#38598;&#35611;&#30340;&#26159;&#29305;&#23450;&#30340;&#24037;&#20855;&#8212;&#8212;&#19968;&#20491;&#30435;&#25511; skill&#12289;&#19968;&#20491; triage agent&#12290;&#20294;&#35498;&#23526;&#35441;&#65292;&#37027;&#20123;&#21482;&#26159;&#19968;&#27573;&#26356;&#38263;&#26053;&#31243;&#30340;&#32066;&#40670;&#65292;&#32780;&#36889;&#27573;&#26053;&#31243;&#30340;&#36215;&#40670;&#36319;&#25152;&#26377;&#20154;&#19968;&#27171;&#65306;&#25226;&#25991;&#23383;&#35079;&#35069;&#36028;&#19978;&#21040;&#32842;&#22825;&#35222;&#31383;&#35041;&#65292;&#28982;&#24460;&#31048;&#31153;&#36664;&#20986;&#26377;&#29992;&#12290;]]></description><link>https://blog.schwannden.com/p/ai-paradigm-shift-ep-3-from-copy-paste-to-commit-how-skills-replaced-my-prompt-library-zh</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-paradigm-shift-ep-3-from-copy-paste-to-commit-how-skills-replaced-my-prompt-library-zh</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 20 Mar 2026 08:23:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c6103167-bb87-4036-838c-4cffeb2b81e0_2000x1091.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MWeJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MWeJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 424w, https://substackcdn.com/image/fetch/$s_!MWeJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 848w, https://substackcdn.com/image/fetch/$s_!MWeJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 1272w, https://substackcdn.com/image/fetch/$s_!MWeJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MWeJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!MWeJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 424w, https://substackcdn.com/image/fetch/$s_!MWeJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 848w, https://substackcdn.com/image/fetch/$s_!MWeJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 1272w, https://substackcdn.com/image/fetch/$s_!MWeJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cf12a9-c2d7-4a8a-a641-16db7f84a659_2000x1091.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>&#36889;&#20491;&#31995;&#21015;<a href="https://blog.schwannden.com/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident-zh/">&#21069;&#20841;&#38598;</a>&#35611;&#30340;&#26159;&#29305;&#23450;&#30340;&#24037;&#20855;&#8212;&#8212;&#19968;&#20491;&#30435;&#25511; skill&#12289;&#19968;&#20491; triage agent&#12290;&#20294;&#35498;&#23526;&#35441;&#65292;&#37027;&#20123;&#21482;&#26159;&#19968;&#27573;&#26356;&#38263;&#26053;&#31243;&#30340;&#32066;&#40670;&#65292;&#32780;&#36889;&#27573;&#26053;&#31243;&#30340;&#36215;&#40670;&#36319;&#25152;&#26377;&#20154;&#19968;&#27171;&#65306;&#25226;&#25991;&#23383;&#35079;&#35069;&#36028;&#19978;&#21040;&#32842;&#22825;&#35222;&#31383;&#35041;&#65292;&#28982;&#24460;&#31048;&#31153;&#36664;&#20986;&#26377;&#29992;&#12290;</p><p>&#36889;&#19968;&#38598;&#35611;&#30340;&#26159;&#26053;&#31243;&#26412;&#36523;&#12290;&#20841;&#24180;&#20839;&#65292;&#25105;&#21644; AI &#20043;&#38291;&#30340;&#20171;&#38754;&#25563;&#20102;&#22235;&#27425;&#65292;&#32780;&#27599;&#19968;&#27425;&#25563;&#65292;&#24118;&#20358;&#30340;&#25913;&#35722;&#37117;&#27604;&#27169;&#22411;&#26412;&#36523;&#30340;&#36914;&#27493;&#26356;&#22823;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8mDa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8mDa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 424w, https://substackcdn.com/image/fetch/$s_!8mDa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 848w, https://substackcdn.com/image/fetch/$s_!8mDa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 1272w, https://substackcdn.com/image/fetch/$s_!8mDa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8mDa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png" width="2000" height="1077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1077,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!8mDa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 424w, https://substackcdn.com/image/fetch/$s_!8mDa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 848w, https://substackcdn.com/image/fetch/$s_!8mDa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 1272w, https://substackcdn.com/image/fetch/$s_!8mDa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22ae4fbd-f071-4865-8f13-54bf9ec2df88_2000x1077.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#20154;&#32905;&#21098;&#36028;&#31807;</h2><p>2022 &#24180;&#24213;&#12289;2023 &#24180;&#21021;&#12290;ChatGPT &#27243;&#31354;&#20986;&#19990;&#12290;&#25105;&#35352;&#24471;&#37027;&#27573;&#26178;&#38291;&#22312;&#32016;&#32004;&#21443;&#21152;&#19968;&#22580;&#30740;&#35342;&#26371;&#65292;&#35611;&#32773;&#21839;&#21488;&#19979;&#26377;&#27794;&#26377;&#20154;&#29992;&#36942;&#22909;&#30340; chatbot&#12290;&#20116;&#30334;&#20154;&#30340;&#26371;&#22580;&#65292;&#33289;&#25163;&#30340;&#21482;&#26377;&#20841;&#20491;&#12290;&#20294; ChatGPT &#19981;&#20687;&#25105;&#35211;&#36942;&#30340;&#20219;&#20309; chatbot&#8212;&#8212;&#23427;&#19981;&#26159;&#22312;&#38364;&#37749;&#23383;&#19978;&#20570; pattern matching &#28982;&#24460;&#21520;&#32592;&#38957;&#22238;&#35206;&#12290;&#23427;&#33021;&#25512;&#29702;&#65292;&#25110;&#32773;&#33267;&#23569;&#34920;&#28436;&#20986;&#19968;&#31278;&#20196;&#20154;&#20449;&#26381;&#30340;&#25512;&#29702;&#12290;&#25105;&#26159;&#30495;&#30340;&#34987;&#38663;&#25788;&#21040;&#20102;&#12290;</p><p>&#25105;&#26368;&#20808;&#25343;&#23427;&#20358;&#20570;&#30340;&#26159;&#25688;&#35201;&#12290;&#19968;&#24373; Zendesk ticket &#36914;&#20358;&#65306;900 &#20491;&#23383;&#65292;&#30495;&#27491;&#30340;&#37679;&#35492;&#35338;&#24687;&#22475;&#22312;&#31532;&#20845;&#27573;&#65292;&#22846;&#22312;&#23565;&#25105;&#20497;&#25991;&#20214;&#30340;&#25265;&#24616;&#21644;&#35201;&#27714;&#25171;&#38651;&#35441;&#20043;&#38291;&#12290;&#25105;&#25226;&#25972;&#27573;&#35079;&#35069;&#36028;&#19978;&#21040; ChatGPT&#12290;&#12300;&#24171;&#25105;&#25688;&#35201;&#36889;&#24373; ticket&#65292;&#28982;&#24460;&#33609;&#25836;&#19968;&#24373; Jira story&#12290;&#12301;&#20986;&#20358;&#19968;&#20221;&#25688;&#35201;&#21644;&#19968;&#24373; story&#12290;&#36996;&#34892;&#12290;&#19981;&#19968;&#33268;&#65292;&#20294;&#36996;&#34892;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Gds!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Gds!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 424w, https://substackcdn.com/image/fetch/$s_!5Gds!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 848w, https://substackcdn.com/image/fetch/$s_!5Gds!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 1272w, https://substackcdn.com/image/fetch/$s_!5Gds!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Gds!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png" width="2000" height="716" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!5Gds!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 424w, https://substackcdn.com/image/fetch/$s_!5Gds!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 848w, https://substackcdn.com/image/fetch/$s_!5Gds!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 1272w, https://substackcdn.com/image/fetch/$s_!5Gds!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ca217e6-2213-49dc-8770-e113c8192a79_2000x716.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#19981;&#19968;&#33268;&#26159;&#31532;&#19968;&#36947;&#35010;&#32299;&#12290;&#27599;&#27425;&#36664;&#20986;&#30340;&#26684;&#24335;&#37117;&#19981;&#19968;&#27171;&#12290;LLM &#26412;&#36074;&#19978;&#26159;&#20491;&#38568;&#27231;&#36942;&#31243;&#8212;&#8212;&#21516;&#27171;&#30340; prompt&#12289;&#21516;&#27171;&#30340;&#36664;&#20837;&#65292;&#27599;&#27425;&#29986;&#20986;&#19981;&#21516;&#30340;&#32080;&#26524;&#12290;&#30070;&#20320;&#24819;&#22312;&#22296;&#38538;&#24037;&#20316;&#27969;&#31243;&#35041;&#24314;&#31435;&#22312;&#36889;&#20491;&#22522;&#30990;&#19978;&#65292;&#12300;&#27599;&#27425;&#37117;&#19981;&#19968;&#27171;&#12301;&#19981;&#26159;&#21151;&#33021;&#65292;&#26159;&#31237;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OFTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OFTc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 424w, https://substackcdn.com/image/fetch/$s_!OFTc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 848w, https://substackcdn.com/image/fetch/$s_!OFTc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!OFTc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OFTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png" width="1822" height="1042" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1042,&quot;width&quot;:1822,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!OFTc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 424w, https://substackcdn.com/image/fetch/$s_!OFTc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 848w, https://substackcdn.com/image/fetch/$s_!OFTc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!OFTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99d7363d-e2bb-4a2d-a03c-5c9b5d9091ab_1822x1042.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#26044;&#26159;&#25105;&#20570;&#20102;&#20219;&#20309;&#24037;&#31243;&#24107;&#37117;&#26371;&#20570;&#30340;&#20107;&#65306;&#23531;&#19979;&#20358;&#12290;&#19968;&#20491;&#20491;&#20154; prompt &#25910;&#34255;&#22846;&#8212;&#8212;&#25353;&#20219;&#21209;&#20998;&#39006;&#30340;&#25991;&#23383;&#27284;&#12290;&#19968;&#20491;&#29992;&#20358;&#25688;&#35201; Zendesk ticket&#12290;&#19968;&#20491;&#29992;&#20358;&#33609;&#25836; Jira story&#12290;&#19968;&#20491;&#29992;&#20358;&#23531; incident post-mortem&#12290;&#27599;&#20491;&#37117;&#32147;&#36942;&#21453;&#35206;&#35430;&#37679;&#25171;&#30952;&#12290;&#22238;&#38957;&#30475;&#65292;&#25105;&#30070;&#26178;&#20854;&#23526;&#26159;&#22312;&#28858;&#19968;&#20491;&#36996;&#19981;&#23384;&#22312;&#30340; API &#25163;&#21051;&#19968;&#22871;&#20491;&#20154; SDK&#65292;&#29992;&#35079;&#35069;&#36028;&#19978;&#30070; transport layer&#12290;</p><p>&#36889;&#25307;&#26377;&#29992;&#12290;&#20294;&#20063;&#24847;&#21619;&#33879;&#27599;&#27425;&#20114;&#21205;&#37117;&#26159;&#21516;&#19968;&#22871;&#20736;&#24335;&#65306;&#25214;&#21040;&#23565;&#30340; prompt&#12289;&#25226; context &#35079;&#35069;&#36028;&#19978;&#36914;&#21435;&#12289;&#25226;&#36664;&#20986;&#35079;&#35069;&#36028;&#19978;&#20986;&#20358;&#12289;&#36028;&#36914;&#23526;&#38555;&#30340;&#24037;&#20855;&#35041;&#12289;&#25163;&#21205;&#20462;&#27491; LLM &#25630;&#37679;&#30340;&#37096;&#20998;&#12290;&#25105;&#26159;&#19968;&#22602;&#26377;&#20027;&#35211;&#30340;&#20154;&#32905;&#21098;&#36028;&#31807;&#12290;AI &#24456;&#24375;&#22823;&#20294;&#34987;&#38548;&#38626;&#20102;&#8212;&#8212;&#23427;&#20303;&#22312;&#19968;&#20491;&#28687;&#35261;&#22120;&#20998;&#38913;&#35041;&#65292;&#36319;&#27599;&#19968;&#20491;&#30495;&#27491;&#30340;&#24037;&#20855;&#20043;&#38291;&#38548;&#33879;&#25105;&#30340;&#21098;&#36028;&#31807;&#36889;&#23652;&#33180;&#12290;</p><div><hr></div><h2>&#30070; AI &#26377;&#20102;&#20491;&#24615;</h2><p>&#28982;&#24460;&#20358;&#21040; persona &#26178;&#20195;&#12290;Gemini Gems&#12289;Claude Projects&#12289;ChatGPT custom GPTs&#12290;&#36067;&#40670;&#26159;&#65306;&#19981;&#29992;&#27599;&#27425;&#36028; prompt &#20102;&#65292;&#20320;&#24314;&#19968;&#20491;&#25345;&#20037;&#30340; context&#12290;&#19968;&#20491; persona&#12290;&#20320;&#25551;&#36848;&#35282;&#33394;&#12289;&#19978;&#20659;&#21443;&#32771;&#25991;&#20214;&#12289;&#35373;&#23450;&#35486;&#27683;&#12290;</p><p>&#25105;&#24314;&#20102;&#22909;&#24190;&#20491;&#12290;&#19968;&#20491; database migration &#23560;&#29992;&#30340; persona&#65292;&#29087;&#24713;&#25105;&#20497;&#30340; schema &#24931;&#20363;&#12290;&#19968;&#20491; support case &#20998;&#26512;&#30340; persona&#65292;&#30693;&#36947;&#25105;&#20497;&#30340;&#29986;&#21697;&#23652;&#32026;&#21644;&#24120;&#35211;&#25925;&#38556;&#27169;&#24335;&#12290;&#19968;&#20491;&#26550;&#27083;&#35373;&#35336;&#30340; persona&#65292;&#35037;&#36617;&#20102;&#25105;&#20497;&#30340; service map &#21644; API &#21512;&#32004;&#12290;&#19968;&#33268;&#24615;&#36914;&#27493;&#20102;&#8212;&#8212;support persona &#27599;&#27425;&#37117;&#26371;&#29986;&#20986;&#26377; acceptance criteria &#30340; Jira story&#65292;&#22240;&#28858;&#25105;&#21578;&#35380;&#23427;&#35201;&#36889;&#27171;&#20570;&#12290;Prompt &#28040;&#22833;&#20102;&#65292;&#21462;&#32780;&#20195;&#20043;&#30340;&#26159;&#26356;&#25345;&#20037;&#30340;&#26481;&#35199;&#65292;&#31639;&#26377;&#40670;&#36914;&#27493;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IUqK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IUqK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 424w, https://substackcdn.com/image/fetch/$s_!IUqK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 848w, https://substackcdn.com/image/fetch/$s_!IUqK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 1272w, https://substackcdn.com/image/fetch/$s_!IUqK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IUqK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png" width="2000" height="868" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:868,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!IUqK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 424w, https://substackcdn.com/image/fetch/$s_!IUqK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 848w, https://substackcdn.com/image/fetch/$s_!IUqK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 1272w, https://substackcdn.com/image/fetch/$s_!IUqK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe074c0d3-d1d5-4b64-99a3-f8862f06c3e5_2000x868.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#20294;&#26681;&#26412;&#30340;&#25299;&#25778;&#27794;&#26377;&#35722;&#12290;&#25105;&#36996;&#26159;&#37027;&#20491; transport layer&#12290;&#25226; Zendesk ticket &#35079;&#35069;&#36914; support persona&#65292;&#35712;&#36664;&#20986;&#65292;&#35079;&#35069;&#36914; Jira&#12290;AI &#26356;&#32880;&#26126;&#20063;&#26356;&#19968;&#33268;&#20102;&#65292;&#20294;&#23427;&#36996;&#26159;&#22312;&#32842;&#22825;&#35222;&#31383;&#35041;&#65292;&#32780;&#25105;&#36996;&#26159;&#37027;&#20491;&#22312;&#32842;&#22825;&#35222;&#31383;&#21644;&#29694;&#23526;&#20043;&#38291;&#25644;&#36939;&#36039;&#26009;&#30340;&#20154;&#12290;</p><p>&#25105;&#25226; persona &#20998;&#20139;&#32102;&#22296;&#38538;&#65292;&#36879;&#36942;&#36899;&#32080;&#12290;&#20182;&#20497;&#29992;&#20102;&#12290;&#20182;&#20497;&#20063;&#21508;&#33258;&#24494;&#35519;&#20102;&#19968;&#40670;&#65292;&#28982;&#24460;&#25105;&#20497;&#23601;&#26377;&#20102;&#19977;&#20221;&#20998;&#27495;&#30340;&#21103;&#26412;&#65292;&#27794;&#26377;&#20219;&#20309;&#26041;&#24335;&#21487;&#20197;&#21512;&#20341;&#12290;&#25105;&#20497;&#20998;&#20139;&#30693;&#35672;&#30340;&#26041;&#24335;&#36319; 2004 &#24180;&#20998;&#20139; Word &#25991;&#20214;&#19968;&#27171;&#8212;&#8212;&#23492;&#21103;&#26412;&#20986;&#21435;&#65292;&#28982;&#24460;&#31048;&#31153;&#27794;&#20154;&#20570;&#20986;&#34909;&#31361;&#30340;&#20462;&#25913;&#12290;</p><div><hr></div><h2>Tool Layer &#21040;&#20102;&#65292;&#28982;&#24460;&#31435;&#21051;&#26292;&#38706;&#20102;&#30495;&#27491;&#30340;&#21839;&#38988;</h2><p>MCP &#25913;&#35722;&#20102;&#36938;&#25138;&#35215;&#21063;&#12290;Model Context Protocol &#32102;&#20102; AI &#19968;&#20491;&#27161;&#28310;&#21270;&#30340;&#26041;&#24335;&#36319;&#23526;&#38555;&#24037;&#20855;&#28317;&#36890;&#8212;&#8212;&#19981;&#26159;&#36879;&#36942;&#25105;&#30340;&#21098;&#36028;&#31807;&#65292;&#32780;&#26159;&#30452;&#25509;&#36899;&#25509;&#12290;Jira&#12289;Confluence&#12289;GitHub&#12289;AWS&#12289;&#36039;&#26009;&#24235;&#12290;&#38548;&#38626;&#35299;&#38500;&#20102;&#12290;</p><p>&#25105;&#24478;&#32842;&#22825;&#23458;&#25142;&#31471;&#25644;&#21040;&#20102; Cursor &#21644; Claude Code&#12290;&#19981;&#20877;&#25226; support case &#35079;&#35069;&#36914;&#32842;&#22825;&#35222;&#31383;&#20102;&#65292;&#25105;&#21487;&#20197;&#30452;&#25509;&#35498;&#12300;&#35712;&#36889;&#24373; Zendesk ticket &#28982;&#24460;&#24314;&#19968;&#24373; Jira story&#12301;&#65292;agent &#26371;&#36879;&#36942; Zendesk &#25972;&#21512;&#35712; ticket&#65292;&#36879;&#36942; Jira MCP tool &#24314; story&#65292;&#30452;&#25509;&#22635;&#20837;&#27396;&#20301;&#12290;&#27794;&#26377;&#21098;&#36028;&#31807;&#12290;&#27794;&#26377;&#35079;&#35069;&#36028;&#19978;&#12290;</p><p>&#22823;&#27010;&#26377;&#20841;&#20491;&#31150;&#25308;&#65292;&#25105;&#20197;&#28858;&#36889;&#23601;&#26159;&#32066;&#26997;&#24418;&#24907;&#20102;&#12290;&#28982;&#24460;&#26684;&#24335;&#21839;&#38988;&#21448;&#22238;&#20358;&#20102;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N36i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N36i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 424w, https://substackcdn.com/image/fetch/$s_!N36i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 848w, https://substackcdn.com/image/fetch/$s_!N36i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 1272w, https://substackcdn.com/image/fetch/$s_!N36i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N36i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png" width="2000" height="767" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:767,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!N36i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 424w, https://substackcdn.com/image/fetch/$s_!N36i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 848w, https://substackcdn.com/image/fetch/$s_!N36i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 1272w, https://substackcdn.com/image/fetch/$s_!N36i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff247fbf8-18ba-40a4-8cc8-a0705db237ec_2000x767.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>MCP &#35731; AI &#21487;&#20197;&#20351;&#29992;&#24037;&#20855;&#12290;&#20294;&#23427;&#27794;&#26377;&#35731; AI &#30693;&#36947;<em>&#20320;&#30340;&#22296;&#38538;&#24590;&#40636;&#20351;&#29992;&#36889;&#20123;&#24037;&#20855;</em>&#12290;&#25105;&#20497;&#22296;&#38538;&#23565; SSO &#23376;&#31995;&#32113;&#26377;&#29305;&#23450;&#30340; component tag&#12290;&#25105;&#20497;&#23565;&#20358;&#33258; support case &#30340; story &#21644;&#20358;&#33258;&#20839;&#37096;&#35215;&#21123;&#30340; story &#26377;&#19981;&#21516;&#30340;&#21629;&#21517;&#24931;&#20363;&#12290;Story point &#27396;&#20301;&#26159; <code>customfield_10004</code>&#65292;&#19981;&#26159;&#27599;&#20491; LLM &#31532;&#19968;&#27425;&#37117;&#26371;&#29468;&#30340;&#37027;&#20491;&#27604;&#36611;&#30452;&#35258;&#30340;&#27396;&#20301;&#21517;&#12290;</p><p>Agent &#21487;&#20197;&#24314; Jira ticket&#12290;&#20294;&#24314;&#20986;&#20358;&#26159;&#37679;&#30340;&#12290;Component &#37679;&#12289;label &#26684;&#24335;&#37679;&#12289;story point &#22635;&#37679;&#27396;&#20301;&#12290;&#27599;&#27425;&#20462;&#27491;&#37117;&#26159;&#25105;&#22312;&#23565;&#35441;&#35041;&#25171;&#30340;&#19968;&#21477; prompt&#65292;&#19979;&#19968;&#20491; session &#23601;&#24536;&#20102;&#12290;&#25105;&#21448;&#22238;&#21040;&#20102;&#35352; prompt &#30340;&#26085;&#23376;&#8212;&#8212;&#19981;&#26159;&#22240;&#28858; AI &#32570;&#20047;&#33021;&#21147;&#65292;&#32780;&#26159;&#22240;&#28858;&#23427;&#32570;&#20047;<em>&#25105;&#20497;&#22296;&#38538;&#30340;</em> context&#12290;</p><p>Mario Zechner <a href="https://mariozechner.at/posts/2025-08-15-mcp-vs-cli/">&#35498;&#24471;&#22909;</a>&#65306;&#12300;&#33287;&#20854;&#29229;&#35542; MCP &#36996;&#26159; CLI&#65292;&#19981;&#22914;&#38283;&#22987;&#25171;&#36896;&#26356;&#22909;&#30340;&#24037;&#20855;&#12290;Protocol &#21482;&#26159;&#27700;&#31649;&#12290;&#12301;&#20182;&#35498;&#24471;&#23565;&#12290;&#20182;&#30340; benchmark &#39023;&#31034;&#65292;&#35373;&#35336;&#33391;&#22909;&#30340;&#24773;&#27841;&#19979;&#65292;MCP &#21644;&#32020; CLI &#24037;&#20855;&#30340;&#34920;&#29694;&#19968;&#27169;&#19968;&#27171;&#8212;&#8212;&#19968;&#20491; 225 token &#30340; CLI wrapper &#37197;&#19978;&#22909;&#30340; README&#65292;&#21213;&#36942;&#19968;&#20491; 18,000 token &#20294;&#25991;&#20214;&#23531;&#24471;&#29211;&#30340; MCP server&#12290;&#21839;&#38988;&#24478;&#20358;&#19981;&#26159; protocol&#12290;&#26159;&#22296;&#38538;&#24590;&#40636;&#25226;&#33258;&#24049;&#30340;&#24931;&#20363;&#32232;&#30908;&#36914;&#32102; agent &#29992;&#30340;&#24037;&#20855;&#35041;&#12290;MCP &#26159;&#24037;&#20855;&#20379;&#25033;&#21830;&#30340;&#20171;&#38754;&#12290;&#23427;&#26292;&#38706;&#30340;&#26159; Jira <em>&#33021;</em>&#20570;&#20160;&#40636;&#12290;&#23427;&#23565;&#26044; Jira <em>&#25033;&#35442;</em>&#24590;&#40636;&#34987;&#19968;&#20491;&#19977;&#20154; SSO &#22296;&#38538;&#20351;&#29992;&#8212;&#8212;&#29992;&#20160;&#40636; component tag&#12289;&#20160;&#40636; story &#26684;&#24335;&#8212;&#8212;&#19968;&#20491;&#23383;&#37117;&#27794;&#35498;&#12290;&#37027;&#20491;&#33853;&#24046;&#8212;&#8212;capability &#21644; convention &#20043;&#38291;&#30340;&#8212;&#8212;&#25165;&#26159;&#25152;&#26377;&#25705;&#25830;&#30495;&#27491;&#20303;&#30340;&#22320;&#26041;&#12290;</p><div><hr></div><h2>&#24478;&#24555;&#25463;&#37749;&#21040;&#21487;&#20197; Commit &#30340;&#26481;&#35199;</h2><p>Custom command &#26159;&#31532;&#19968;&#27425;&#22039;&#35430;&#22635;&#35036;&#36889;&#20491;&#33853;&#24046;&#12290;Claude Code &#35041;&#30340; slash command&#65306;&#20320;&#25226;&#19968;&#27573;&#38263; prompt &#23531;&#22312;&#27284;&#26696;&#35041;&#65292;&#32102;&#23427;&#19968;&#20491;&#21517;&#23383;&#65292;&#29992; <code>/my-command</code> &#21628;&#21483;&#12290;Prompt &#36617;&#20837;&#65292;agent &#29031;&#25351;&#20196;&#36208;&#65292;&#20320;&#19981;&#29992;&#27599;&#20491; session &#37325;&#26032;&#25171;&#19968;&#27425;&#24931;&#20363;&#23601;&#33021;&#25343;&#21040;&#19968;&#33268;&#30340;&#36664;&#20986;&#12290;</p><p>&#25105;&#24314;&#20102;&#19968;&#22534;&#12290;<code>/create-support-ticket</code> &#21253;&#21547;&#20102;&#25105;&#20497;&#25152;&#26377; Jira &#24931;&#20363;&#12290;<code>/write-postmortem</code> &#26377;&#25105;&#20497;&#30340; incident report &#32080;&#27083;&#12290;<code>/draft-epic</code> &#30693;&#36947;&#25105;&#20497;&#24590;&#40636;&#25226; feature &#25286;&#25104; story&#12290;&#26356;&#22909;&#20102;&#12290;&#20294;&#24456;&#20725;&#30828;&#12290;</p><p>Custom command &#23601;&#26159;&#19968;&#27573;&#21152;&#20102;&#25463;&#24465;&#30340;&#38263; prompt&#12290;&#23427;&#19981;&#33021;&#21205;&#24907;&#24341;&#29992;&#22806;&#37096;&#27284;&#26696;&#12290;&#23427;&#19981;&#33021;&#26681;&#25818;&#36664;&#20837;&#39006;&#22411;&#35519;&#25972;&#12290;&#32780;&#19988;&#26368;&#38364;&#37749;&#30340;&#65292;agent &#19981;&#33021;&#33258;&#24049;&#30332;&#29694;&#23427;&#8212;&#8212;&#20320;&#24517;&#38920;&#30693;&#36947;&#36889;&#20491; command &#23384;&#22312;&#28982;&#24460;&#26126;&#30906;&#22320;&#21628;&#21483;&#23427;&#12290;&#22914;&#26524;&#19968;&#20491;&#38538;&#21451;&#22312;&#34389;&#29702; incident &#20294;&#19981;&#35352;&#24471;&#26377; <code>/write-postmortem</code> &#36889;&#20491;&#26481;&#35199;&#65292;&#20182;&#23601;&#26371;&#24478;&#38957;&#23531; post-mortem&#12290;&#30693;&#35672;&#34987;&#32232;&#30908;&#20102;&#65292;&#20294;&#19981;&#21487;&#34987;&#30332;&#29694;&#12290;</p><p>&#28982;&#24460; skill &#20986;&#29694;&#20102;&#65292;&#32780;&#36889;&#35041;&#25105;&#38656;&#35201;&#35488;&#23526;&#22320;&#35498;&#23427;&#26159;&#20160;&#40636;&#12289;&#19981;&#26159;&#20160;&#40636;&#12290;</p><p>Skill &#22312; Claude Code &#35041;&#26159;&#19968;&#32068;&#25351;&#20196;&#12289;references &#21644; sub-command &#30340;&#38598;&#21512;&#65292;agent &#21487;&#20197;&#33258;&#21205;&#30332;&#29694;&#20006;&#22519;&#34892;&#12290;&#30070; agent &#30475;&#21040;&#19968;&#20491;&#20219;&#21209;&#31526;&#21512;&#26576;&#20491; skill &#30340;&#25551;&#36848;&#65292;&#23427;&#21487;&#20197;&#22312;&#20351;&#29992;&#32773;&#27794;&#26377;&#26126;&#30906;&#21628;&#21483;&#30340;&#24773;&#27841;&#19979;&#36617;&#20837;&#20006;&#22519;&#34892;&#12290;Skill &#21487;&#20197;&#24341;&#29992;&#22806;&#37096;&#27284;&#26696;&#8212;&#8212;&#25105;&#20497;&#30340; Jira component mapping&#12289;incident severity rubric&#8212;&#8212;&#32780;&#19988;&#23427;&#21487;&#20197;&#21628;&#21483; MCP tool&#65292;&#25152;&#20197;&#25972;&#20491;&#37832;&#26781;&#23601;&#25509;&#19978;&#20102;&#65306;skill &#32232;&#30908;&#25105;&#20497;&#22296;&#38538;&#30340;&#24931;&#20363;&#65292;MCP tool &#25226;&#23427;&#20497;&#22519;&#34892;&#22312;&#30495;&#23526;&#31995;&#32113;&#19978;&#12290;</p><p>&#25105;&#30340;&#24037;&#20316;&#27969;&#31243;&#35722;&#25104;&#65306;<code>/jira-skill "customer reports SAML integration broken, see Zendesk #4521"</code>&#12290;Skill &#20597;&#28204;&#21040;&#36889;&#26159;&#19968;&#24373; support &#20358;&#28304;&#30340; ticket&#65292;&#36617;&#20837; convention reference&#65292;&#22871;&#29992;&#27491;&#30906;&#30340; component tag &#21644; label &#26684;&#24335;&#65292;&#22635;&#20837; <code>customfield_10004</code>&#65292;&#28982;&#24460;&#21628;&#21483; Jira MCP tool&#12290;&#19968;&#27425;&#21628;&#21483;&#65292;&#36664;&#20986;&#27491;&#30906;&#65292;&#19981;&#29992;&#20462;&#27491;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uwln!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uwln!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 424w, https://substackcdn.com/image/fetch/$s_!Uwln!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 848w, https://substackcdn.com/image/fetch/$s_!Uwln!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 1272w, https://substackcdn.com/image/fetch/$s_!Uwln!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uwln!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png" width="2000" height="723" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:723,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!Uwln!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 424w, https://substackcdn.com/image/fetch/$s_!Uwln!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 848w, https://substackcdn.com/image/fetch/$s_!Uwln!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 1272w, https://substackcdn.com/image/fetch/$s_!Uwln!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6681ecd0-6827-48c2-b43d-e4c699477e46_2000x723.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#20294;&#30495;&#27491;&#30340;&#20729;&#20540;&#19981;&#22312;&#21628;&#21483;&#26412;&#36523;&#12290;&#32780;&#26159;&#30070; agent &#22312;&#33258;&#20027;&#22519;&#34892;&#19968;&#20491;&#26356;&#22823;&#30340;&#20219;&#21209;&#12289;&#36935;&#21040;&#19968;&#20491; skill &#33021;&#34389;&#29702;&#30340;&#23376;&#20219;&#21209;&#26178;&#26371;&#30332;&#29983;&#20160;&#40636;&#12290;&#23427;&#25214;&#21040; skill&#12289;&#36617;&#20837;&#23427;&#12289;&#20351;&#29992;&#23427;&#12290;&#24931;&#20363;&#22312;&#25105;&#19981;&#22312; loop &#35041;&#30340;&#24773;&#27841;&#19979;&#34987;&#22871;&#29992;&#12290;&#22296;&#38538;&#30340;&#30693;&#35672;&#19981;&#21482;&#26159;&#34987;&#32232;&#30908;&#20102;&#65307;&#23427;<em>&#21487;&#20197;&#34987; agent &#30070;&#20316;&#19968;&#20491;&#21487;&#32068;&#21512;&#30340;&#21407;&#35486;&#20358;&#20351;&#29992;</em>&#12290;</p><p>Skill &#19968;&#38283;&#22987;&#30906;&#23526;&#26159;&#29305;&#23450; agent &#23560;&#29992;&#30340;&#65292;&#20294;&#29983;&#24907;&#31995;&#27491;&#22312;&#36264;&#21516;&#12290;&#20687; <a href="https://github.com/vercel-labs/skills">Vercel &#30340; skills CLI</a> &#36889;&#39006;&#23560;&#26696;&#24050;&#32147;&#21487;&#20197;&#25226;&#21516;&#19968;&#20491; skill &#23450;&#32681;&#20998;&#30332;&#21040;&#22235;&#21313;&#22810;&#31278; agent &#19978;&#65292;&#24478; Claude Code &#21040; Cursor &#21040; Gemini CLI&#12290;&#22522;&#26412;&#26684;&#24335;&#8212;&#8212;&#19968;&#20491; Markdown &#27284;&#26696;&#21152;&#19978;&#21517;&#31281;&#12289;&#25551;&#36848;&#21644;&#25351;&#20196;&#8212;&#8212;&#27491;&#22312;&#35722;&#25104;&#19968;&#20491;&#20849;&#20139;&#30340;&#21407;&#35486;&#12290;&#36914;&#38542;&#21151;&#33021;&#22312;&#19981;&#21516; agent &#38291;&#20173;&#26377;&#24046;&#30064;&#65292;&#20294;&#26680;&#24515;&#27169;&#24335;&#26159;&#21487;&#25884;&#30340;&#65292;&#32780;&#19988;&#36234;&#20358;&#36234;&#21487;&#25884;&#12290;</p><div><hr></div><h2>&#25913;&#35722;&#19968;&#20999;&#30340;&#37027;&#27425; Commit</h2><p>&#25925;&#20107;&#22312;&#36889;&#35041;&#32350;&#22238;&#21069;&#20841;&#38598;&#12290;</p><p><a href="https://blog.schwannden.com/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution-zh/">Episode 1</a> &#30340;&#30435;&#25511; skill &#21644; <a href="https://blog.schwannden.com/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident-zh/">Episode 2</a> &#30340; triage agent &#20043;&#25152;&#20197;&#29305;&#21029;&#65292;&#19981;&#26159;&#22240;&#28858;&#23427;&#20497;&#29992;&#20102; AI&#12290;&#26159;&#22240;&#28858;&#23427;&#20497;&#34987; commit &#36914;&#20102; repository&#12290;&#23427;&#20497;&#27963;&#22312;&#29256;&#26412;&#25511;&#21046;&#35041;&#12290;&#23427;&#20497;&#36879;&#36942; pull request &#28436;&#21270;&#12290;&#21487;&#20197; review&#12289;&#21487;&#20197; diff&#12289;&#21487;&#20197;&#22519;&#34892;&#12290;</p><p>&#20197;&#21069;&#20998;&#20139; AI context &#24847;&#21619;&#33879;&#20659;&#19968;&#20491; Gem &#25110; Project &#30340;&#36899;&#32080;&#12290;&#29694;&#22312;&#24847;&#21619;&#33879;&#25226; skill commit &#36914; repo&#12290;&#26032;&#24037;&#31243;&#24107;&#21487;&#20197;&#35712; skill &#29702;&#35299;&#22296;&#38538;&#24590;&#40636;&#34389;&#29702; support case&#65292;&#25110;&#32773;&#30452;&#25509;&#36305;&#23427;&#65292;&#38283;&#31665;&#21363;&#29992;&#22320;&#25343;&#21040;&#27491;&#30906;&#30340;&#34892;&#28858;&#12290;</p><p>&#30070;&#19968;&#20491;&#38538;&#21451;&#30332;&#29694;&#25105;&#20497;&#30340; triage skill &#32570;&#23569; ECS deployment &#27298;&#26597;&#8212;&#8212;<a href="https://blog.schwannden.com/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident-zh/">Episode 2</a> &#30340;&#20107;&#8212;&#8212;&#25105;&#20497;&#27794;&#26377;&#26356;&#26032; wiki &#38913;&#38754;&#65292;&#20063;&#27794;&#26377;&#30332;&#19968;&#21063;&#20841;&#22825;&#24460;&#23601;&#34987;&#28153;&#27794;&#30340; Slack &#35338;&#24687;&#12290;&#25105;&#20497;&#26356;&#26032;&#20102; skill &#28982;&#24460; commit &#20102;&#35722;&#26356;&#12290;Diff &#35611;&#36848;&#20102;&#25925;&#20107;&#65306;&#12300;&#26032;&#22686; ECS deployment status &#27298;&#26597;&#20316;&#28858;&#31532;&#19968;&#20491;&#35519;&#26597;&#27493;&#39519;&#65292;&#22240;&#28858; Incident #5 &#39023;&#31034; deployment &#35722;&#26356;&#26159;&#26368;&#24120;&#35211;&#30340; root cause&#12290;&#12301;&#29151;&#36939;&#30693;&#35672;&#65292;&#26377;&#29256;&#26412;&#25511;&#21046;&#12289;&#21487; review&#12289;&#21487;&#31435;&#21363;&#22519;&#34892;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Ksy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Ksy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 424w, https://substackcdn.com/image/fetch/$s_!8Ksy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 848w, https://substackcdn.com/image/fetch/$s_!8Ksy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 1272w, https://substackcdn.com/image/fetch/$s_!8Ksy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Ksy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png" width="2000" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" title="AI &#20856;&#31684;&#36681;&#31227; Ep.3&#65306;&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; Commit&#8212;&#8212;Skill &#22914;&#20309;&#21462;&#20195;&#20102;&#25105;&#30340; Prompt &#25910;&#34255;&#22846;" srcset="https://substackcdn.com/image/fetch/$s_!8Ksy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 424w, https://substackcdn.com/image/fetch/$s_!8Ksy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 848w, https://substackcdn.com/image/fetch/$s_!8Ksy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 1272w, https://substackcdn.com/image/fetch/$s_!8Ksy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9b91a0-a2cc-425e-b7dc-674c5aec6329_2000x838.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Zechner &#25552;&#21040;&#65292;&#29992; ad-hoc &#30340;&#24037;&#20855;&#65292;&#12300;&#20320;&#24517;&#38920;&#33258;&#24049;&#24819;&#20986;&#19968;&#22871;&#32080;&#27083;&#20358;&#24314;&#36896;&#21644;&#32173;&#35703;&#23427;&#20497;&#12290;&#12301;&#23565;&#19968;&#20491;&#20154;&#38283;&#30332;&#20358;&#35498;&#65292;&#36889;&#31278;&#33258;&#30001;&#26159;&#36039;&#29986;&#12290;&#23565;&#19968;&#20491;&#22296;&#38538;&#20358;&#35498;&#65292;&#23427;&#26159;&#36000;&#20661;&#12290;&#19977;&#20491;&#20154;&#21508;&#33258;&#32173;&#35703; ad-hoc &#24037;&#20855;&#20294;&#27794;&#26377;&#20849;&#20139;&#24931;&#20363;&#65292;&#26371;&#20197;&#36319;&#25105;&#20497;&#30070;&#21021; persona &#20998;&#27495;&#23436;&#20840;&#19968;&#27171;&#30340;&#26041;&#24335;&#20998;&#27495;&#12290;&#20849;&#20139; repo &#35041;&#26377;&#29256;&#26412;&#25511;&#21046;&#30340; skill&#65292;&#26159;&#35731;&#25105;&#20497;&#20445;&#25345;&#19968;&#33268;&#30340;&#24375;&#21046;&#20989;&#25976;&#12290;</p><p>&#22739;&#32302;&#19968;&#19979;&#36889;&#20491;&#28436;&#21270;&#65306;&#35079;&#35069;&#36028;&#19978;&#12289;&#28982;&#24460; persona&#12289;&#28982;&#24460; MCP&#12289;&#28982;&#24460; skill&#12290;&#27599;&#19968;&#27493;&#37117;&#22739;&#32302;&#20102;&#24847;&#22294;&#21644;&#34892;&#21205;&#20043;&#38291;&#30340;&#19968;&#23652;&#25705;&#25830;&#12290;&#35079;&#35069;&#36028;&#19978;&#29992;&#19968;&#22602;&#20154;&#32905;&#21098;&#36028;&#31807;&#38548;&#38283;&#23427;&#20497;&#12290;Persona &#28187;&#23569;&#20102; prompt &#36000;&#25812;&#20294;&#20154;&#39006;&#36996;&#26159; transport&#12290;MCP &#31227;&#38500;&#20102; transport &#20294;&#27794;&#24118;&#36208;&#24931;&#20363;&#12290;Skill &#32232;&#30908;&#20102;&#24931;&#20363;&#65292;&#20006;&#35731;&#23427;&#20497;&#21487;&#20197;&#34987;&#30332;&#29694;&#12290;</p><div><hr></div><h2>&#20171;&#38754;&#25165;&#26159;&#29942;&#38968;</h2><p>&#36942;&#21435;&#20841;&#24180;&#25105;&#19968;&#30452;&#20551;&#35373;&#38480;&#21046;&#22240;&#32032;&#26159;&#27169;&#22411;&#26234;&#24935;&#12290;&#26356;&#22909;&#30340;&#27169;&#22411;&#26371;&#29986;&#20986;&#26356;&#22909;&#30340;&#32080;&#26524;&#12290;&#29433;&#32681;&#19978;&#20358;&#35498;&#36889;&#27794;&#37679;&#12290;&#20294;&#30495;&#27491;&#25913;&#35722;&#25105;&#26085;&#24120;&#24037;&#20316;&#30340;&#36914;&#27493;&#65292;&#19981;&#22312;&#26234;&#24935;&#12290;&#22312;&#20171;&#38754;&#12290;</p><p>&#24478;&#35079;&#35069;&#36028;&#19978;&#21040; persona&#65292;&#27599;&#20491;&#20219;&#21209;&#30465;&#20102;&#20116;&#20998;&#37912;&#12290;&#24478; persona &#21040; MCP&#65292;&#30465;&#20102;&#21313;&#20998;&#37912;&#12290;&#24478; MCP &#21040; skill&#65292;&#20063;&#26377;&#30465;&#26178;&#38291;&#8212;&#8212;&#20294;&#26368;&#37325;&#35201;&#30340;&#26159;&#25552;&#21319;&#30340;<em>&#19968;&#33268;&#24615;</em>&#65292;&#32780;&#19968;&#33268;&#24615;&#25165;&#26159;&#19977;&#20491;&#20154;&#29992;&#21516;&#19968;&#22871;&#24931;&#20363;&#36305;&#27491;&#24335;&#29872;&#22659;&#26178;&#30495;&#27491;&#37325;&#35201;&#30340;&#26481;&#35199;&#12290;&#26178;&#38291;&#31680;&#30465;&#32218;&#24615;&#32047;&#31309;&#12290;&#19968;&#33268;&#24615;&#31680;&#30465;&#25928;&#30410;&#25351;&#25976;&#25844;&#22823;&#65292;&#22240;&#28858;&#27599;&#19968;&#20491;&#19981;&#19968;&#33268;&#37117;&#26371;&#29986;&#29983;&#19979;&#28216;&#20462;&#27491;&#65292;&#32780;&#37027;&#20123;&#20462;&#27491;&#21448;&#26371;&#35069;&#36896;&#33258;&#24049;&#30340;&#19981;&#19968;&#33268;&#12290;</p><p>&#25105;&#30340; prompt &#25910;&#34255;&#22846;&#28040;&#22833;&#20102;&#12290;&#19981;&#26159;&#34987;&#21034;&#38500;&#8212;&#8212;&#26159;&#34987;&#36986;&#26820;&#12290;&#35079;&#35069;&#36028;&#19978;&#25104;&#28858;&#26178;&#20195;&#30340;&#21270;&#30707;&#12290;&#35041;&#38754;&#30340;&#30693;&#35672;&#24050;&#32147;&#36983;&#31227;&#21040; commit &#36914; repository &#30340; skill &#35041;&#65292;agent &#21487;&#20197;&#30332;&#29694;&#23427;&#20497;&#65292;&#27599;&#19968;&#27425; incident &#21644; sprint &#37117;&#22312;&#25913;&#21892;&#23427;&#20497;&#12290;&#20840;&#22296;&#38538;&#29992;&#21516;&#19968;&#22871; skill&#65292;&#30070;&#20854;&#20013;&#19968;&#20491;&#20154;&#25945;&#20102; skill &#26032;&#26481;&#35199;&#65292;&#19979;&#19968;&#27425;&#22519;&#34892;&#25152;&#26377;&#20154;&#37117;&#21463;&#30410;&#12290;</p><p>&#36889;&#20491;&#31995;&#21015;&#35041;&#30340;&#20856;&#31684;&#36681;&#31227;&#19981;&#26159;&#12300;AI &#33021;&#20570;&#20107;&#20102;&#12301;&#12290;&#36681;&#31227;&#22312;&#26044;&#65292;&#20154;&#39006;&#24847;&#22294;&#21644;&#27231;&#22120;&#34892;&#21205;&#20043;&#38291;&#30340;&#20171;&#38754;&#65292;&#24478;&#19968;&#20491;&#22810;&#27493;&#39519;&#12289;&#26377;&#25613;&#32791;&#12289;&#25163;&#21205;&#30340;&#36942;&#31243;&#65292;&#22349;&#32302;&#25104;&#20102;&#19968;&#20491;&#30475;&#36215;&#20358;&#20687; function call&#12289;&#24863;&#35258;&#20687;&#22312;&#36319;&#19968;&#20491;&#35712;&#23436;&#20102;&#20320;&#24478;&#20358;&#27794;&#23531;&#30340;&#25991;&#20214;&#30340;&#38538;&#21451;&#35498;&#35441;&#30340;&#26481;&#35199;&#12290;</p><p>&#25105;&#24478;&#20358;&#27794;&#23531;&#37027;&#20123;&#25991;&#20214;&#65292;&#22240;&#28858;&#25105;&#24478;&#20358;&#27794;&#26377;&#26178;&#38291;&#12290;&#29694;&#22312;&#25105;&#19981;&#29992;&#23531;&#20102;&#12290;Skill <em>&#23601;&#26159;</em>&#25991;&#20214;&#12290;&#23427;&#20497;&#21482;&#26159;&#30896;&#24039;&#36996;&#33021;&#22519;&#34892;&#12290;</p>]]></content:encoded></item><item><title><![CDATA[AI Paradigm Shift Ep.3: From Copy-Paste to Commit — How Skills Replaced My Prompt Library]]></title><description><![CDATA[The previous two episodes in this series were about specific tools &#8212; a monitoring skill, a triage agent.]]></description><link>https://blog.schwannden.com/p/ai-paradigm-shift-ep-3-from-copy-paste-to-commit-how-skills-replaced-my-prompt-library</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-paradigm-shift-ep-3-from-copy-paste-to-commit-how-skills-replaced-my-prompt-library</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 20 Mar 2026 08:21:33 GMT</pubDate><enclosure url="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep3.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>The previous <a href="https://blog.schwannden.com/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident/">two episodes</a> in this series were about specific tools &#8212; a monitoring skill, a triage agent. But if I am honest, those were endpoints in a longer journey that started the same way it started for everyone: copying text into a chat window and hoping the output was useful.</p><p>This episode is about the journey itself. How the interface between me and AI changed four times in two years, and why each change mattered more than any improvement in the models.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png" width="2000" height="1077" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1077,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-8.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>The Human Clipboard</h2><p>Late 2022, early 2023. ChatGPT exists. I remember attending a conference in New York around that time where a speaker asked the room if anyone had used a good chatbot. Two hands went up out of five hundred people. But ChatGPT was not like any chatbot I had met &#8212; it was not pattern-matching on keywords and returning canned responses. It could reason, or at least perform a convincing impression of reasoning. I was genuinely mind-blown.</p><p>The first thing I used it for was summarizing. A Zendesk ticket comes in: 900 words burying the actual error in paragraph six between a complaint about our documentation and a request for a phone call. I copy the entire thing into ChatGPT. "Summarize this and draft a Jira story." Out comes a summary and a story. Not bad. Not consistent, but not bad.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png" width="2000" height="716" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-9.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The inconsistency was the first crack. Every output had a different format. LLMs are stochastic &#8212; the same prompt on the same input produces different outputs, and when you are trying to build a team workflow around them, "different every time" is not a feature. It is a tax.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png" width="1822" height="1042" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1042,&quot;width&quot;:1822,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-10.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So I did what any engineer does: I wrote it down. A personal prompt library &#8212; text files organized by task. One for summarizing Zendesk tickets. One for drafting Jira stories. One for writing incident post-mortems. Each refined through trial and error. I was building a personal SDK for an API that did not exist yet, using copy-paste as the transport layer.</p><p>This worked. It also meant that every interaction followed the same ritual: find the right prompt, copy-paste the context in, copy-paste the output out, paste it into the actual tool, manually fix whatever the LLM got wrong. I was a human clipboard with opinions. The AI was powerful but quarantined &#8212; living in a browser tab, separated from every real tool by the membrane of my clipboard.</p><div><hr></div><h2>When AI Got a Name Tag</h2><p>Then came the persona era. Gemini Gems, Claude Projects, ChatGPT custom GPTs. The pitch: instead of pasting a prompt every time, you build a persistent context. A persona. You describe the role, upload reference documents, set the tone.</p><p>I built several. A database migration persona that knew our schema conventions. A support case persona that knew our product tiers and failure modes. An architecture persona with our service map and API contracts. Consistency improved &#8212; the support persona always produced Jira stories with acceptance criteria because I told it to. The prompts were gone, replaced by something more durable. Progress.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png" width="2000" height="868" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:868,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-11.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But the fundamental topology had not changed. I was still the transport layer. Copy the Zendesk ticket into the support persona, read the output, copy it into Jira. The AI was smarter and more consistent, but it was still in a chat window, and I was still moving data between the chat window and reality.</p><p>I shared my personas with my team via links. They used them. They also modified them slightly for their own preferences, and now we had three divergent copies with no way to reconcile them. We were sharing knowledge the way people shared Word documents in 2004 &#8212; by emailing copies and hoping nobody made a conflicting edit.</p><div><hr></div><h2>The Tool Layer Arrives, and Immediately Reveals the Real Problem</h2><p>MCP changed the game. Model Context Protocol gave AI a standardized way to talk to actual tools &#8212; not through my clipboard, but directly. Jira, Confluence, GitHub, AWS, databases. The quarantine was lifted.</p><p>I moved from chat clients to Cursor and Claude Code. Instead of copying a support case into a chat window, I could say "read this Zendesk ticket and create a Jira story" and the agent would read the ticket, create the story through the Jira MCP tool, and populate the fields directly. No clipboard. No copy-paste.</p><p>For about two weeks, I thought this was the endgame. Then the format problem resurfaced, wearing a different hat.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png" width="2000" height="767" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:767,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-12.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>MCP gives AI access to tools. It does not give AI access to <em>your team's conventions for using those tools</em>. Our team uses specific component tags for SSO subsystems. We have naming conventions for stories that originate from support cases versus internal planning. The story point field is <code>customfield_10004</code>, not the more intuitive field name that every LLM guesses first.</p><p>The agent could create Jira tickets. It created them wrong. Wrong component. Wrong label format. Story points in the wrong field. Every correction was a prompt typed into the conversation that would be forgotten by the next session. I was back to remembering prompts &#8212; not because the AI lacked capability, but because it lacked <em>my team's</em> context.</p><p>Mario Zechner <a href="https://mariozechner.at/posts/2025-08-15-mcp-vs-cli/">put it well</a>: "Maybe instead of arguing about MCP vs CLI, we should start building better tools. The protocol is just plumbing." He is right. His benchmarks show that MCP and plain CLI tools perform identically when well-designed &#8212; a 225-token CLI wrapper with a good README outperforms an 18,000-token MCP server with poor documentation. The problem was never the protocol. It was how teams encode their conventions into the tools they give their agents. MCP is the tool vendor's interface. It exposes what Jira <em>can</em> do. It says nothing about what Jira <em>should</em> do for a three-person SSO team at Ubiquiti that uses specific component tags and a specific story format. That gap &#8212; between capability and convention &#8212; is where all the friction lives.</p><div><hr></div><h2>From Shortcuts to Something That Commits</h2><p>Custom commands were the first attempt to close the gap. Slash commands in Claude Code: you write a long prompt in a file, give it a name, and invoke it with <code>/my-command</code>. The prompt loads, the agent follows the instructions, and you get consistent output without re-typing your conventions every session.</p><p>I built a bunch. <code>/create-support-ticket</code> contained all our Jira conventions. <code>/write-postmortem</code> had our incident report structure. <code>/draft-epic</code> knew how we decompose features into stories. Better. But rigid.</p><p>A custom command is a long prompt with a shortcut. It cannot reference external files dynamically. It cannot adapt based on input type. And critically, the agent cannot discover it on its own &#8212; you have to know the command exists and invoke it explicitly. If a teammate is triaging an incident and does not remember that <code>/write-postmortem</code> exists, they write the post-mortem from scratch. The knowledge is encoded but not discoverable.</p><p>Then skills arrived, and here I need to be honest about what they are and what they are not.</p><p>A skill, in Claude Code, is a bundle of instructions, references, and sub-commands that an agent can discover and execute. When the agent sees a task that matches a skill's description, it can load it without the user explicitly invoking it. The skill can reference external files &#8212; our Jira component mapping, our incident severity rubric &#8212; and it can call MCP tools, so the chain completes: the skill encodes our team's conventions, and the MCP tools execute them against real systems.</p><p>My workflow became: <code>/jira-skill "customer reports SAML integration broken, see Zendesk #4521"</code>. The skill detects a support-originated ticket, loads the convention reference, applies the right component tags and label format, populates <code>customfield_10004</code>, and calls the Jira MCP tool. One invocation, correct output, no corrections.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png" width="2000" height="723" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:723,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-13.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But the real value is what happens when the agent is working autonomously on a larger task and encounters a subtask a skill can handle. It finds the skill, loads it, uses it. The conventions are applied without me being in the loop. The team's knowledge is not just encoded; it is <em>available</em> to the agent as a composable primitive.</p><p>Skills started as agent-specific, but the ecosystem is converging. Projects like <a href="https://github.com/vercel-labs/skills">Vercel's skills CLI</a> already distribute the same skill definition across forty-plus agents, from Claude Code to Cursor to Gemini CLI. The basic format &#8212; a Markdown file with a name, a description, and instructions &#8212; is becoming a shared primitive. Advanced features still vary by agent, but the core pattern is portable, and getting more so.</p><div><hr></div><h2>The Commit That Changed Everything</h2><p>Here is where the story loops back to the first two episodes.</p><p>The monitoring skill from <a href="https://blog.schwannden.com/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution/">Episode 1</a> and the triage agent from <a href="https://blog.schwannden.com/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident/">Episode 2</a> are not special because they use AI. They are special because they are committed to the repository. They live in version control. They evolve through pull requests. They are reviewable, diffable, and executable.</p><p>Previously, sharing AI context meant sending a link to a Gem or a Project. Now it means committing a skill to the repo. A new engineer can read the skill and understand how the team handles support cases, or just run it and get the right behavior out of the box.</p><p>When a teammate found the ECS deployment gap in our triage skill &#8212; <a href="https://blog.schwannden.com/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident/">Episode 2</a> &#8212; we did not update a wiki page or send a Slack message that would scroll off screen in two days. We updated the skill and committed the change. The diff tells the story: "Added ECS deployment status check as first investigation step after Incident #5 revealed deployment changes are the most common root cause." Operational knowledge, version-controlled, reviewable, and immediately executable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png" width="2000" height="838" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" title="AI Paradigm Shift Ep.3: From Copy-Paste to Commit &#8212; How Skills Replaced My Prompt Library" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-14.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Zechner notes that with ad-hoc tools, "you will have to come up with a structure for how you build and maintain those tools yourself." For a solo developer, that freedom is an asset. For a team, it is a liability. Three people maintaining ad-hoc tools without shared conventions will diverge in exactly the same way our personas diverged back in the chat era. Version-controlled skills in a shared repo are the forcing function that keeps us aligned.</p><p>The shift, compressed: copy-paste, then personas, then MCP, then skills. Each step collapsed a layer of friction between intent and action. Copy-paste separates them by a human clipboard. Personas reduce the prompt overhead but keep the human as transport. MCP removes the transport but not the conventions. Skills encode the conventions and make them discoverable.</p><div><hr></div><h2>The Interface Was the Bottleneck</h2><p>I spent the last two years assuming that the limiting factor was model intelligence. Better models would produce better output. That is true, narrowly. But the improvements that actually changed my daily work were not about intelligence. They were about interface.</p><p>The jump from copy-paste to personas saved me five minutes per task. The jump from personas to MCP saved me ten. The jump from MCP to skills saves time too, but most importantly &#8212; it saved me <em>consistency</em>, which is the thing that actually matters when three people are trying to operate a production system using the same conventions. Time savings compound linearly. Consistency savings compound geometrically, because every inconsistency creates downstream corrections.</p><p>My prompt library is gone. Not deleted &#8212; abandoned. A fossil record of the copy-paste era. The knowledge it contained has migrated into skills committed to the repository, discoverable by agents, and improving with every incident and sprint. The whole team uses the same skills, and when one of us teaches a skill something new, all of us benefit on the next run.</p><p>The paradigm shift in this series is not "AI can do things." The shift is that the interface between human intent and machine action collapsed from a multi-step, lossy, manual process into something that looks like a function call and feels like talking to a teammate who has read all the documentation you never wrote.</p><p>I never wrote that documentation because I never had time. Now I do not have to. The skills <em>are</em> the documentation. They just happen to also execute.</p>]]></content:encoded></item><item><title><![CDATA[AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident]]></title><description><![CDATA[Three weeks after I built the monitoring skill from Episode 1, our SSO service started acting up &#8212; specifically, passkey login on a new Android app that had just gone to market in beta.]]></description><link>https://blog.schwannden.com/p/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 20 Mar 2026 08:20:07 GMT</pubDate><enclosure url="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" title="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Three weeks after I built the monitoring skill from <a href="https://blog.schwannden.com/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution/">Episode 1</a>, our SSO service started acting up &#8212; specifically, passkey login on a new Android app that had just gone to market in beta. Not a full outage. The insidious kind of broken where most authentication methods work and one doesn't, so the bug reports trickle in slowly and you spend the first twenty minutes wondering if it is a real incident or just a beta-quality client doing beta-quality things.</p><p>It was real.</p><p>Passkey authentication was failing intermittently on the beta Android app. Brian built the WebAuthn flow eight months ago &#8212; I reviewed every PR but never did the hands-on staging testing, so my understanding was architectural, not visceral. Brian was on vacation in Hokkaido, unreachable in every way that matters. The root cause, as we would later discover, was on us: the beta client had been configured with the wrong passkey origin, and WebAuthn does not forgive origin mismatches.</p><p>This is the part of incident response nobody talks about in post-mortems: the knowledge bottleneck is not a process failure. It is a structural inevitability. Brian built the passkey feature. He knows which database tables it touches, which Athena queries reveal its failure modes, which CloudWatch metrics actually matter versus which ones look alarming but mean nothing. That knowledge lives in his head, accumulated over months of debugging sessions and late-night deploys. I know the architecture from code review, but knowing how something is designed and knowing how it breaks are two very different things. The gap between reviewing a PR and debugging a production incident is the gap between reading a map and navigating a city at night.</p><p>So here is what happens in the old world &#8212; briefly, because if you have ever been the person on the team who has to debug something they did not build, you already know. I open six browser tabs. I dig through Brian's old Athena queries in our shared workspace, trying to figure out which ones are still relevant. I read CloudWatch metrics I half-understand, pattern-matching against what I remember from code review. Steven, our designated incident liaison, watches my screen because he wants to learn, but I am too deep in query results to narrate what I am doing &#8212; partly because I am still figuring it out myself. The stakeholder update does not get sent. The liaison role is a polite fiction we maintain because the incident response template says we need one. The person trying to debug is too busy debugging to communicate, and the person who should communicate does not have enough context to say anything useful.</p><p>That is the structural problem. Vendor triage copilots exist &#8212; PagerDuty, Datadog, others &#8212; but they optimize for their own telemetry stack. Ours needed to reason across CloudWatch, application logs, deployment history, and domain-specific Athena queries simultaneously, in a way only a custom agent with full context of our stack could do. Everything that follows is an attempt to break the knowledge bottleneck with that agent.</p><div><hr></div><h2>The Fear Is Reasonable. The Boundary Is Simple.</h2><p>The fear of letting AI touch infrastructure is not theoretical. Earlier this month, Amazon held a company-wide engineering meeting after a pattern of outages tied to AI-assisted code changes &#8212; including a six-hour shopping site outage on March 5th that knocked out checkout, login, and product pricing. Their internal briefing described "high blast radius" incidents linked to "Gen-AI assisted changes." Amazon's response was to require senior engineer sign-off on all AI-assisted production changes. The instinct everywhere is the same: AI near infrastructure is dangerous, so add friction.</p><p>I understand the caution. I have the same fear. The last thing I want during an active incident is an AI agent deciding to helpfully restart the database or modify a security group.</p><p>But Amazon's problem &#8212; and the instinct to add blanket friction &#8212; conflates two very different things. There is an enormous gap between reading a CloudWatch metric and modifying an Auto Scaling group. One is observation. The other is action. We do not refuse to let junior engineers <em>look</em> at production dashboards because we are afraid they might accidentally click "Terminate Instance."</p><p>The fix was a service account with read-only permissions. An IAM policy: CloudWatch GetMetricData, RDS Performance Insights reads, Athena queries against read-only analytics tables, ALB and WAF metric reads, CloudTrail lookups. No PutMetricAlarm. No ModifyDBInstance. Nothing that modifies state.</p><p>This turns out to be the only safety boundary that matters in practice. Not "can the AI access infrastructure" but "can the AI <em>change</em> infrastructure." Read-only access gives you an extra pair of eyes without giving you an extra pair of hands. I brought the policy back to the platform team, they audited it, added a few explicit denies, and agreed to a trial. The trial is still running. Nobody has asked me to stop.</p><div><hr></div><h2>Fourteen Minutes</h2><p>The second incident arrived on a Tuesday. Passkey authentication failures again, this time concentrated on Android beta users in specific regions. I pasted the CloudWatch alarm payload, the first three bug reports from the beta channel, and the service name into the triage agent. One command: <code>/triage-incident --context &lt;paste&gt;</code>.</p><p>The agent spawned three parallel investigation threads &#8212; service-level metrics, infrastructure health, and passkey-specific queries &#8212; and reported back while I was still waiting for the RDS Performance Insights console to render. (The console takes a genuinely impressive amount of time, as if each pixel is hand-painted by an AWS intern.)</p><p>The infrastructure thread found it. Primary RDS read IOPS at 4x normal. Connection pool at 89%. The <code>WebAuthnCredentialLookup</code> query had gone from a P95 of 12ms to 340ms. The agent correlated this with a CloudTrail entry showing a compliance batch job &#8212; quarterly, full table scans on the same tables the passkey lookup uses &#8212; had started twenty minutes before the first beta user report.</p><p>Fourteen minutes from alert to root cause. I had not typed a single Athena query.</p><p>Here is what mattered more than the speed: I had nothing to do with my hands. The agent was investigating. My normal instinct &#8212; run queries, check dashboards, build a mental model &#8212; was already being done. So I did the thing that incident response frameworks have begged me to do for years. I communicated.</p><p>I spun up a second agent session connected to Atlassian. Incident report created, findings fed in as they arrived. When we confirmed the batch job was the cause, the compliance team got tagged within minutes instead of the usual "someone remembers to Slack them thirty minutes later." Steven was reading the triage output alongside me, following the diagnostic reasoning as structured narrative rather than trying to parse my frantic tab-switching. He started asking questions: "Why did it check DynamoDB latency separately from RDS?" Because the passkey flow hits both stores, and you need to isolate which layer is the bottleneck. He was learning the reasoning, not by watching me type too fast to follow, but by reading an investigation that explained itself.</p><p>Four stakeholder updates sent during the incident. In the old world, that number would have been zero.</p><p>Total time from alert to mitigation: twenty-two minutes. I started to feel like the tool was trustworthy. That feeling was about to be corrected.</p><div><hr></div><h2>When the Agent Was Wrong, and Why That Was the Point</h2><p>The third incident, two weeks later, the agent got it wrong. Elevated 5xx on the token exchange endpoint. The agent confidently blamed DynamoDB GSI throttling &#8212; a metric spike that correlated perfectly with the error onset. I almost acted on it. But the GSI was at 40% of provisioned capacity. Nowhere near throttling. The agent had pattern-matched on "metric went up at the same time as errors" without asking whether the magnitude was enough to matter. The real cause was a rate limiter typo in that morning's deploy &#8212; 50 requests per second instead of 500. One missing zero, sitting in the deployment diff the agent never checked.</p><p>Eighteen minutes lost. Not catastrophic, but enough to change how we used the tool. We stopped treating the agent's output as a verdict and started treating it as a brief &#8212; hypotheses with evidence, reviewed by a human who asks: does the anomaly actually explain the impact? What changed recently? After the failure, I updated the skill to check deployment history first and to validate metric thresholds against provisioned capacity, not just look for spikes. Steven caught another gap in the fourth incident: no ECS deployment status check. He told me, I updated the skill.</p><p>The pattern became clear. Every time the agent was wrong or incomplete, I just told it: "You missed the deployment history. Update the triage skill so that checking recent changes is always the first investigation thread." The agent rewrote its own skill. Next time I told it: "When you check DynamoDB metrics, compare consumed capacity against provisioned capacity &#8212; a spike means nothing if you are at 40% of your limit." The agent updated itself again. Steven found the ECS gap, told me, and I relayed it the same way. One sentence, and the skill absorbed the lesson.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png" width="2000" height="751" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:751,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" title="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>No manual editing of config files. No writing runbook entries after the fact. I just talked to the agent about what it got wrong, and it fixed its own playbook. The corrections accumulated. The skill got committed to the repo, and the diff tells the story: each change traces back to a specific incident and a specific mistake. It is a changelog of the team's diagnostic intelligence, maintained not by discipline but by the natural pressure of real incidents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png" width="2000" height="1040" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" title="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>The Fifth Incident</h2><p>By the fifth incident, those one-sentence corrections had compounded into something I did not expect. The skill checked deployment history first. It validated metric thresholds against provisioned capacity. It checked ECS deployment status. All lessons it learned from being told, once, what it missed. I barely intervened during the triage phase. The agent was not perfect &#8212; it still flagged irrelevant metrics occasionally, and its severity assessments ran a notch too high. But it was operating at the level of a teammate who had been on the team for a year, not the blank-slate tool it was on day one.</p><p>Steven used it solo last week. An alert fired for elevated 401 responses on the token refresh endpoint. He ran the triage skill. It checked recent deployments first (none), swept infrastructure metrics, then went narrow on the token validation subsystem. Twelve minutes to root cause &#8212; an upstream identity provider had changed their JWKS endpoint response format, breaking our key rotation. Steven filed the incident report, communicated with stakeholders, and coordinated the fix. He did not need me. He did not Slack me. I found out from the post-mortem document the next morning.</p><p>That is the moment I knew the structural problem was actually broken. Not dented, not mitigated. Broken. Steven ran an incident end-to-end using a skill that had learned from every previous mistake &#8212; mistakes I had simply talked it through, one sentence at a time.</p><div><hr></div><h2>What the Numbers Say</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png" width="2000" height="827" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" title="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I want to be honest about measurement. We did not run a controlled experiment. We do not have clean before-and-after metrics because the "before" was not instrumented. What we have is timestamps from Slack messages, incident reports, and my own notes.</p><p>Before the triage agent, our median time from alert to root cause identification &#8212; across the six incidents I can reconstruct from 2025 &#8212; was roughly seventy minutes. The range was thirty minutes (for problems I had seen before and could diagnose from muscle memory) to four hours (for novel failure modes that required building understanding from scratch).</p><p>With the triage agent, across five incidents, the median is eighteen minutes. The range is twelve to twenty-eight. The twenty-eight-minute outlier was the third incident, where the agent was wrong and we lost time on a false lead.</p><p>The number I care about more: stakeholder updates sent during the active incident phase. Before: a median of one, usually sent after the fix was already in progress. After: a median of four, with the first one going out within ten minutes of the alert. That is the communication unlock. The triage agent did not just speed up diagnosis. It freed the humans to do the part of incident response that humans are actually good at and that actually matters to the people waiting for answers.</p><div><hr></div><h2>What the Engineer Should Have Been Doing All Along</h2><p>The conventional accounting of incident cost focuses on downtime minutes. Those matter. But the hidden cost &#8212; the one that compounds quarter over quarter &#8212; is the knowledge monopoly. Every incident that only one person can triage makes that person more indispensable and the team more fragile. The experienced engineer becomes a single point of failure not because they want to be, but because incident work is inherently apprenticeship-based, and there are never enough incidents to train everyone, and the incidents that do occur are too urgent to use as teaching moments.</p><p>The triage agent did not replace me. It revealed what I should have been doing all along.</p><p>All those years of incident response, I thought my job was to diagnose the problem. To be the person who knew the queries, knew the metrics, knew the system's failure modes &#8212; or at least knew enough to muddle through when the person who really knew was unavailable. That was the expectation. But diagnosing the problem was never the hard part for the <em>team</em> &#8212; it was only the hard part because the knowledge was locked in one person's head, and that person was not always in the room. The actual hard part, the part that affected customers and stakeholders and the business, was communicating clearly under pressure, coordinating across teams, and making judgment calls about severity and mitigation trade-offs. I was not doing any of that because I was too busy being the human query engine.</p><p>The agent took over the query engine role. What remained was the work that actually mattered: talking to people, making decisions, and teaching others. It turns out that the "hero engineer" was not heroic. The hero engineer was a bottleneck who happened to type fast.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png" width="2000" height="680" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" title="AI Paradigm Shift Ep.2: The Triage Agent That Learned From Every Incident" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I do not know what the sixth incident will teach the skill. That is the point. The skill does not need to be complete on day one. It just needs to be better after each incident than it was before, and the team needs to trust it enough to use it and skeptical enough to correct it. So far, both of those bars have been easy to clear.</p>]]></content:encoded></item><item><title><![CDATA[AI 典範轉移 Ep.2：從每次事故中學習的Triage Skill]]></title><description><![CDATA[[&#20197;&#19979;&#25925;&#20107;&#20154;&#21517;&#20197;&#21450;&#20107;&#20214;&#37117;&#28858;&#20102;&#20445;&#35703;&#38577;&#31169;&#32780;&#26377;&#25152;&#34395;&#27083;]]]></description><link>https://blog.schwannden.com/p/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident-zh</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-paradigm-shift-ep-2-the-triage-agent-that-learned-from-every-incident-zh</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 20 Mar 2026 08:19:45 GMT</pubDate><enclosure url="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep2-1.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>[&#20197;&#19979;&#25925;&#20107;&#20154;&#21517;&#20197;&#21450;&#20107;&#20214;&#37117;&#28858;&#20102;&#20445;&#35703;&#38577;&#31169;&#32780;&#26377;&#25152;&#34395;&#27083;]</p><p><a href="https://blog.schwannden.com/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution-zh/">&#31532;&#19968;&#38598;</a>&#30340;&#30435;&#25511; skill &#20570;&#22909;&#19977;&#36913;&#24460;&#65292;&#25105;&#20497;&#30340; SSO &#26381;&#21209;&#20986;&#20102;&#21839;&#38988;&#8212;&#8212;&#20855;&#39636;&#20358;&#35498;&#65292;&#26159;&#19968;&#20491;&#21083;&#19978;&#24066; beta &#29256;&#30340; Android app &#19978;&#30340; passkey &#30331;&#20837;&#12290;&#19981;&#26159;&#20840;&#38754;&#20013;&#26039;&#65292;&#32780;&#26159;&#37027;&#31278;&#26368;&#38512;&#38570;&#30340;&#22750;&#27861;&#65306;&#22823;&#37096;&#20998;&#39511;&#35657;&#26041;&#24335;&#27491;&#24120;&#36939;&#20316;&#65292;&#21482;&#26377;&#19968;&#31278;&#19981;&#34892;&#12290;Bug report &#38646;&#38646;&#26143;&#26143;&#22320;&#36914;&#20358;&#65292;&#20320;&#38957;&#20108;&#21313;&#20998;&#37912;&#37117;&#22312;&#29494;&#35947;&#36889;&#21040;&#24213;&#26159;&#30495;&#27491;&#30340;&#20107;&#25925;&#65292;&#36996;&#26159; beta &#21697;&#36074;&#30340; client &#22312;&#20570; beta &#21697;&#36074;&#30340;&#20107;&#12290;</p><p>&#26159;&#30495;&#30340;&#12290;</p><p>Passkey &#39511;&#35657;&#22312; beta Android app &#19978;&#38291;&#27463;&#24615;&#22833;&#25943;&#12290;Brian &#20843;&#20491;&#26376;&#21069;&#23531;&#20102; WebAuthn &#27969;&#31243;&#8212;&#8212;&#27599;&#20491; PR &#25105;&#37117; review &#36942;&#65292;&#20294;&#24478;&#27794;&#35242;&#25163;&#22312; staging &#29872;&#22659;&#28204;&#35430;&#65292;&#25152;&#20197;&#25105;&#30340;&#29702;&#35299;&#26159;&#26550;&#27083;&#23652;&#38754;&#30340;&#65292;&#19981;&#26159;&#39636;&#24863;&#23652;&#38754;&#30340;&#12290;Brian &#27491;&#22312;&#21271;&#28023;&#36947;&#24230;&#20551;&#65292;&#23436;&#20840;&#22833;&#32879;&#12290;&#24460;&#20358;&#26597;&#20986;&#20358;&#30340;&#26681;&#26412;&#21407;&#22240;&#22312;&#25105;&#20497;&#36889;&#37002;&#65306;beta client &#37197;&#20102;&#37679;&#35492;&#30340; passkey origin&#65292;&#32780; WebAuthn &#23565; origin mismatch &#27627;&#19981;&#23532;&#23481;&#12290;</p><p>&#36889;&#26159; post-mortem &#35041;&#27794;&#20154;&#26371;&#35611;&#30340;&#37027;&#20491;&#37096;&#20998;&#65306;&#30693;&#35672;&#29942;&#38968;&#19981;&#26159;&#27969;&#31243;&#21839;&#38988;&#65292;&#32780;&#26159;&#32080;&#27083;&#24615;&#30340;&#24517;&#28982;&#12290;Brian &#20570;&#20102; passkey &#21151;&#33021;&#12290;&#20182;&#30693;&#36947;&#30896;&#20102;&#21738;&#20123;&#36039;&#26009;&#24235; table&#12289;&#21738;&#20123; Athena query &#33021;&#25581;&#38706;&#22833;&#25943;&#27169;&#24335;&#12289;&#21738;&#20123; CloudWatch metric &#30495;&#27491;&#37325;&#35201;&#32780;&#21738;&#20123;&#21482;&#26159;&#30475;&#36215;&#20358;&#22151;&#20154;&#21371;&#20160;&#40636;&#37117;&#19981;&#20195;&#34920;&#12290;&#36889;&#20123;&#30693;&#35672;&#20840;&#35037;&#22312;&#20182;&#33126;&#34955;&#35041;&#65292;&#26159;&#22909;&#24190;&#20491;&#26376;&#30340;&#38500;&#37679;&#21644;&#21322;&#22812;&#37096;&#32626;&#19968;&#40670;&#19968;&#28404;&#32047;&#31309;&#30340;&#12290;&#25105;&#24478; code review &#20102;&#35299;&#26550;&#27083;&#65292;&#20294;&#30693;&#36947;&#19968;&#20491;&#26481;&#35199;&#24590;&#40636;&#35373;&#35336;&#21644;&#30693;&#36947;&#23427;&#24590;&#40636;&#22750;&#25481;&#65292;&#26159;&#23436;&#20840;&#19981;&#21516;&#30340;&#20841;&#22238;&#20107;&#12290;review &#19968;&#20491; PR &#36319;&#22312; production &#38500;&#37679;&#20043;&#38291;&#30340;&#36317;&#38626;&#65292;&#23601;&#20687;&#30475; Google Maps &#36319;&#21322;&#22812;&#22312;&#38476;&#29983;&#24055;&#24324;&#35041;&#25214;&#36335;&#30340;&#36317;&#38626;&#12290;</p><p>&#25509;&#19979;&#20358;&#22312;&#33290;&#19990;&#30028;&#35041;&#26371;&#30332;&#29983;&#20160;&#40636;&#8212;&#8212;&#31777;&#30701;&#24118;&#36942;&#65292;&#22240;&#28858;&#22914;&#26524;&#20320;&#26366;&#32147;&#26159;&#22296;&#38538;&#35041;&#37027;&#20491;&#24517;&#38920;&#38500;&#37679;&#33258;&#24049;&#27794;&#23531;&#30340;&#26481;&#35199;&#30340;&#20154;&#65292;&#20320;&#24050;&#32147;&#30693;&#36947;&#20102;&#12290;&#25105;&#25171;&#38283;&#20845;&#20491;&#28687;&#35261;&#22120;&#20998;&#38913;&#12290;&#32763; Brian &#30340;&#33290; Athena query&#65292;&#35430;&#33879;&#25630;&#28165;&#26970;&#21738;&#20123;&#36996;&#26377;&#29992;&#12290;&#30475;&#33879;&#25105;&#19968;&#30693;&#21322;&#35299;&#30340; CloudWatch metric&#65292;&#29992; code review &#30340;&#35352;&#25014;&#20570;&#27169;&#24335;&#27604;&#23565;&#12290;Steven&#65292;&#25105;&#20497;&#25351;&#23450;&#30340;&#20107;&#25925;&#32879;&#32097;&#20154;&#65292;&#22312;&#30475;&#25105;&#30340;&#34722;&#24149;&#22240;&#28858;&#20182;&#24819;&#23416;&#65292;&#20294;&#25105;&#27491;&#28145;&#38519;&#22312; query &#32080;&#26524;&#35041;&#27794;&#36774;&#27861;&#37002;&#20570;&#37002;&#35611;&#8212;&#8212;&#19968;&#37096;&#20998;&#21407;&#22240;&#26159;&#25105;&#33258;&#24049;&#37117;&#36996;&#22312;&#25630;&#28165;&#26970;&#29376;&#27841;&#12290;&#21033;&#23475;&#38364;&#20418;&#20154;&#26356;&#26032;&#27794;&#30332;&#20986;&#21435;&#12290;&#32879;&#32097;&#20154;&#35282;&#33394;&#21482;&#26159;&#29031;&#33879;&#27969;&#31243;&#25850;&#20986;&#20358;&#30340;&#27171;&#23376;&#65292;&#22240;&#28858;&#20107;&#25925;&#25033;&#35722;&#27169;&#26495;&#35498;&#25105;&#20497;&#38656;&#35201;&#19968;&#20491;&#12290;&#27491;&#22312;&#38500;&#37679;&#30340;&#20154;&#24537;&#21040;&#27794;&#31354;&#28317;&#36890;&#65292;&#32780;&#25033;&#35442;&#28317;&#36890;&#30340;&#20154;&#27794;&#26377;&#36275;&#22816;&#30340;&#33032;&#32097;&#21435;&#35498;&#20986;&#20219;&#20309;&#26377;&#29992;&#30340;&#35441;&#12290;</p><p>&#36889;&#23601;&#26159;&#32080;&#27083;&#24615;&#21839;&#38988;&#12290;&#24066;&#38754;&#19978;&#26377; vendor triage copilot&#8212;&#8212;PagerDuty&#12289;Datadog &#31561;&#31561;&#8212;&#8212;&#20294;&#23427;&#20497;&#37117;&#26159;&#37341;&#23565;&#33258;&#23478;&#36953;&#28204;&#22534;&#30090;&#20570;&#26368;&#20339;&#21270;&#12290;&#25105;&#20497;&#38656;&#35201;&#30340;&#65292;&#26159;&#19968;&#20491;&#33021;&#21516;&#26178;&#36328; CloudWatch&#12289;&#25033;&#29992;&#31243;&#24335; log&#12289;&#37096;&#32626;&#27511;&#21490;&#21644;&#29305;&#23450;&#38936;&#22495; Athena query &#20570;&#25512;&#29702;&#30340;&#26481;&#35199;&#65292;&#32780;&#19988;&#21482;&#26377;&#19968;&#20491;&#23436;&#25972;&#20102;&#35299;&#25105;&#20497;&#25216;&#34899;&#22534;&#30090;&#30340;&#33258;&#24314; agent &#25165;&#20570;&#24471;&#21040;&#12290;&#20197;&#19979;&#25152;&#26377;&#20107;&#24773;&#65292;&#37117;&#26159;&#22039;&#35430;&#29992;&#37027;&#20491; agent &#25171;&#30772;&#30693;&#35672;&#29942;&#38968;&#12290;</p><div><hr></div><h2>&#24656;&#25084;&#26159;&#21512;&#29702;&#30340;&#12290;&#37002;&#30028;&#20063;&#24456;&#31777;&#21934;&#12290;</h2><p>&#35731; AI &#30896;&#22522;&#30990;&#35373;&#26045;&#30340;&#24656;&#25084;&#19981;&#26159;&#26462;&#20154;&#24962;&#22825;&#12290;&#36889;&#20491;&#26376;&#31245;&#26089;&#65292;Amazon &#21484;&#38283;&#20102;&#19968;&#22580;&#20840;&#20844;&#21496;&#24037;&#31243;&#26371;&#35696;&#65292;&#22240;&#28858;&#19968;&#36899;&#20018;&#33287; AI &#36628;&#21161;&#31243;&#24335;&#30908;&#35722;&#26356;&#30456;&#38364;&#30340;&#25925;&#38556;&#8212;&#8212;&#21253;&#25324;&#19977;&#26376;&#20116;&#26085;&#19968;&#22580;&#38263;&#36948;&#20845;&#23567;&#26178;&#30340;&#36092;&#29289;&#32178;&#31449;&#20013;&#26039;&#65292;&#32080;&#24115;&#12289;&#30331;&#20837;&#21644;&#21830;&#21697;&#23450;&#20729;&#20840;&#37096;&#30321;&#30227;&#12290;&#20839;&#37096;&#31777;&#22577;&#25551;&#36848;&#20102;&#33287;&#12300;Gen-AI assisted changes&#12301;&#30456;&#38364;&#30340;&#12300;high blast radius&#12301;&#20107;&#25925;&#12290;Amazon &#30340;&#23565;&#31574;&#26159;&#35201;&#27714;&#25152;&#26377; AI &#36628;&#21161;&#30340; production &#35722;&#26356;&#37117;&#38656;&#35201; senior engineer &#31805;&#26680;&#12290;&#25152;&#26377;&#20154;&#30340;&#30452;&#35258;&#37117;&#19968;&#27171;&#65306;AI &#38752;&#36817;&#22522;&#30990;&#35373;&#26045;&#24456;&#21361;&#38570;&#65292;&#25152;&#20197;&#21152;&#38459;&#21147;&#12290;</p><p>&#25105;&#29702;&#35299;&#36889;&#20221;&#35641;&#24910;&#12290;&#25105;&#26377;&#21516;&#27171;&#30340;&#24656;&#25084;&#12290;&#22312;&#27963;&#36493;&#20107;&#25925;&#20013;&#65292;&#25105;&#26368;&#19981;&#24819;&#30475;&#21040;&#30340;&#23601;&#26159;&#19968;&#20491; AI agent &#33258;&#20316;&#20027;&#24373;&#22320;&#37325;&#21855;&#36039;&#26009;&#24235;&#25110;&#25913; security group&#12290;</p><p>&#20294; Amazon &#30340;&#21839;&#38988;&#8212;&#8212;&#20197;&#21450;&#37027;&#31278;&#21152;&#20840;&#38754;&#38459;&#21147;&#30340;&#30452;&#35258;&#8212;&#8212;&#28151;&#28102;&#20102;&#20841;&#20214;&#25130;&#28982;&#19981;&#21516;&#30340;&#20107;&#12290;&#35712;&#19968;&#20491; CloudWatch metric &#21644;&#20462;&#25913;&#19968;&#20491; Auto Scaling group &#20043;&#38291;&#26377;&#24040;&#22823;&#30340;&#40251;&#28317;&#12290;&#19968;&#20491;&#26159;&#35264;&#23519;&#65292;&#21478;&#19968;&#20491;&#26159;&#34892;&#21205;&#12290;&#25105;&#20497;&#19981;&#26371;&#22240;&#28858;&#23475;&#24597; junior engineer &#19981;&#23567;&#24515;&#25353;&#21040;&#12300;Terminate Instance&#12301;&#23601;&#19981;&#35731;&#20182;&#20497;<em>&#30475;</em> production dashboard&#12290;</p><p>&#35299;&#27861;&#26159;&#19968;&#20491;&#21807;&#35712;&#27402;&#38480;&#30340; service account&#12290;&#19968;&#26781; IAM policy&#65306;CloudWatch GetMetricData&#12289;RDS Performance Insights &#35712;&#21462;&#12289;&#23565;&#21807;&#35712;&#20998;&#26512; table &#30340; Athena query&#12289;ALB &#21644; WAF metric &#35712;&#21462;&#12289;CloudTrail lookup&#12290;&#27794;&#26377; PutMetricAlarm&#12290;&#27794;&#26377; ModifyDBInstance&#12290;&#20219;&#20309;&#26371;&#25913;&#35722;&#29376;&#24907;&#30340;&#25805;&#20316;&#37117;&#19981;&#34892;&#12290;</p><p>&#36889;&#22312;&#23526;&#21209;&#19978;&#26159;&#21807;&#19968;&#37325;&#35201;&#30340;&#23433;&#20840;&#37002;&#30028;&#12290;&#19981;&#26159;&#12300;AI &#33021;&#19981;&#33021;&#23384;&#21462;&#22522;&#30990;&#35373;&#26045;&#12301;&#65292;&#32780;&#26159;&#12300;AI &#33021;&#19981;&#33021;<em>&#25913;&#35722;</em>&#22522;&#30990;&#35373;&#26045;&#12301;&#12290;&#21807;&#35712;&#23384;&#21462;&#35731;&#20320;&#22810;&#19968;&#38617;&#30524;&#30555;&#65292;&#20294;&#19981;&#22810;&#19968;&#38617;&#25163;&#12290;&#25105;&#25226; policy &#24118;&#22238; platform team&#65292;&#20182;&#20497;&#31293;&#26680;&#24460;&#21152;&#20102;&#24190;&#26781;&#26126;&#30906;&#30340; deny&#65292;&#21516;&#24847;&#35430;&#34892;&#12290;&#35430;&#34892;&#33267;&#20170;&#20173;&#22312;&#36914;&#34892;&#65292;&#27794;&#26377;&#20154;&#35201;&#27714;&#25105;&#20572;&#19979;&#20358;&#12290;</p><div><hr></div><h2>&#21313;&#22235;&#20998;&#37912;</h2><p>&#31532;&#20108;&#27425;&#20107;&#25925;&#30332;&#29983;&#22312;&#19968;&#20491;&#26143;&#26399;&#20108;&#12290;Passkey &#39511;&#35657;&#22833;&#25943;&#20877;&#27425;&#20986;&#29694;&#65292;&#36889;&#27425;&#38598;&#20013;&#22312;&#29305;&#23450;&#22320;&#21312;&#30340; Android beta &#29992;&#25142;&#12290;&#25105;&#25226; CloudWatch alarm payload&#12289;beta channel &#30340;&#21069;&#19977;&#21063; bug report &#21644;&#26381;&#21209;&#21517;&#31281;&#36028;&#36914; triage agent&#12290;&#19968;&#20491;&#25351;&#20196;&#65306;<code>/triage-incident --context &lt;paste&gt;</code>&#12290;</p><p>Agent &#21516;&#26178;&#21855;&#21205;&#20102;&#19977;&#26781;&#20006;&#34892;&#35519;&#26597;&#32218;&#8212;&#8212;&#26381;&#21209;&#23652; metric&#12289;&#22522;&#30990;&#35373;&#26045;&#20581;&#24247;&#24230;&#21644; passkey &#23560;&#23660; query&#8212;&#8212;&#22312;&#25105;&#36996;&#22312;&#31561; RDS Performance Insights &#20027;&#25511;&#21488;&#28210;&#26579;&#23436;&#25104;&#26178;&#23601;&#22238;&#22577;&#20102;&#12290;&#65288;&#37027;&#20491;&#20027;&#25511;&#21488;&#36617;&#20837;&#30340;&#26178;&#38291;&#38263;&#24471;&#20196;&#20154;&#21360;&#35937;&#28145;&#21051;&#65292;&#24439;&#24447;&#27599;&#20491;&#20687;&#32032;&#37117;&#26159; AWS &#23526;&#32722;&#29983;&#25163;&#32362;&#30340;&#12290;&#65289;</p><p>&#22522;&#30990;&#35373;&#26045;&#37027;&#26781;&#32218;&#25214;&#21040;&#20102;&#12290;Primary RDS read IOPS &#26159;&#27491;&#24120;&#20540;&#30340;&#22235;&#20493;&#12290;Connection pool &#21040; 89%&#12290;<code>WebAuthnCredentialLookup</code> query &#30340; P95 &#24478; 12ms &#39110;&#21040; 340ms&#12290;Agent &#25226;&#36889;&#20123;&#36319; CloudTrail &#30340;&#19968;&#31558;&#35352;&#37636;&#20570;&#20102;&#38364;&#32879;&#8212;&#8212;&#19968;&#20491;&#23395;&#24230;&#21512;&#35215;&#25209;&#27425;&#20316;&#26989;&#65292;&#23565; passkey lookup &#29992;&#30340;&#21516;&#19968;&#25209; table &#20570;&#20840;&#34920;&#25475;&#25551;&#8212;&#8212;&#22312;&#31532;&#19968;&#21063; beta &#29992;&#25142;&#22238;&#22577;&#21069;&#20108;&#21313;&#20998;&#37912;&#21855;&#21205;&#12290;</p><p>&#24478;&#35686;&#22577;&#21040;&#25214;&#21040;&#26681;&#26412;&#21407;&#22240;&#65292;&#21313;&#22235;&#20998;&#37912;&#12290;&#25105;&#19968;&#20491; Athena query &#37117;&#27794;&#25171;&#12290;</p><p>&#20294;&#27604;&#36895;&#24230;&#26356;&#37325;&#35201;&#30340;&#26159;&#65306;&#25105;&#30340;&#25163;&#23621;&#28982;&#31354;&#20102;&#19979;&#20358;&#12290;Agent &#22312;&#35519;&#26597;&#12290;&#25105;&#24179;&#24120;&#30340;&#30452;&#35258;&#21453;&#25033;&#8212;&#8212;&#36305; query&#12289;&#30447; dashboard&#12289;&#22312;&#33126;&#20013;&#25340;&#28234;&#27169;&#22411;&#8212;&#8212;&#24050;&#32147;&#26377;&#20154;&#22312;&#20570;&#20102;&#12290;&#25152;&#20197;&#25105;&#20570;&#20102;&#20107;&#25925;&#25033;&#35722;&#26694;&#26550;&#22810;&#24180;&#20358;&#19968;&#30452;&#25308;&#35351;&#25105;&#20570;&#30340;&#20107;&#12290;&#25105;&#21435;&#28317;&#36890;&#12290;</p><p>&#25105;&#38283;&#20102;&#31532;&#20108;&#20491; agent session &#36899;&#25509; Atlassian&#12290;&#20107;&#25925;&#22577;&#21578;&#24314;&#31435;&#22909;&#20102;&#65292;&#35519;&#26597;&#32080;&#26524;&#19968;&#20986;&#20358;&#23601;&#28748;&#36914;&#21435;&#12290;&#30070;&#25105;&#20497;&#30906;&#35469;&#25209;&#27425;&#20316;&#26989;&#26159;&#21407;&#22240;&#26178;&#65292;&#21512;&#35215;&#22296;&#38538;&#22312;&#24190;&#20998;&#37912;&#20839;&#23601;&#34987; tag &#21040;&#20102;&#65292;&#32780;&#19981;&#26159;&#36890;&#24120;&#30340;&#12300;&#26576;&#20154;&#22312;&#19977;&#21313;&#20998;&#37912;&#24460;&#24819;&#36215;&#20358;&#35201; Slack &#20182;&#20497;&#12301;&#12290;Steven &#36319;&#25105;&#19968;&#36215;&#30475; triage &#30340;&#36664;&#20986;&#65292;&#20182;&#26159;&#22312;&#30475;&#19968;&#20491;&#26377;&#32080;&#27083;&#30340;&#35386;&#26039;&#25944;&#36848;&#65292;&#32780;&#19981;&#26159;&#35430;&#22294;&#35299;&#35712;&#25105;&#30219;&#29378;&#20999;&#25563;&#20998;&#38913;&#30340;&#21205;&#20316;&#12290;&#20182;&#38283;&#22987;&#21839;&#21839;&#38988;&#65306;&#12300;&#28858;&#20160;&#40636;&#23427;&#25226; DynamoDB latency &#36319; RDS &#20998;&#38283;&#27298;&#26597;&#65311;&#12301;&#22240;&#28858; passkey &#27969;&#31243;&#20841;&#37002;&#37117;&#26371;&#25171;&#65292;&#20320;&#38656;&#35201;&#38548;&#38626;&#29942;&#38968;&#22312;&#21738;&#19968;&#23652;&#12290;&#20182;&#22312;&#23416;&#25512;&#29702;&#36942;&#31243;&#65292;&#19981;&#26159;&#38752;&#30475;&#25105;&#25171;&#23383;&#25171;&#21040;&#36319;&#19981;&#19978;&#65292;&#32780;&#26159;&#35712;&#19968;&#20221;&#26371;&#33258;&#25105;&#35299;&#37323;&#30340;&#35519;&#26597;&#22577;&#21578;&#12290;</p><p>&#20107;&#25925;&#26399;&#38291;&#30332;&#20986;&#22235;&#21063;&#21033;&#23475;&#38364;&#20418;&#20154;&#26356;&#26032;&#12290;&#22312;&#33290;&#19990;&#30028;&#65292;&#37027;&#20491;&#25976;&#23383;&#26371;&#26159;&#38646;&#12290;</p><p>&#24478;&#35686;&#22577;&#21040;&#32233;&#35299;&#30340;&#32317;&#26178;&#38291;&#65306;&#20108;&#21313;&#20108;&#20998;&#37912;&#12290;&#25105;&#38283;&#22987;&#35258;&#24471;&#36889;&#20491;&#24037;&#20855;&#20540;&#24471;&#20449;&#36084;&#12290;&#36889;&#20221;&#20449;&#24515;&#24456;&#24555;&#23601;&#34987;&#25171;&#33225;&#20102;&#12290;</p><div><hr></div><h2>Agent &#21028;&#26039;&#37679;&#35492;&#30340;&#37027;&#27425;&#65292;&#20197;&#21450;&#28858;&#20160;&#40636;&#37027;&#25165;&#26159;&#37325;&#40670;</h2><p>&#31532;&#19977;&#27425;&#20107;&#25925;&#65292;&#20841;&#36913;&#24460;&#65292;agent &#25630;&#37679;&#20102;&#12290;Token exchange endpoint &#20986;&#29694; 5xx &#21319;&#39640;&#12290;Agent &#24456;&#26377;&#20449;&#24515;&#22320;&#27512;&#21646;&#26044; DynamoDB GSI throttling&#8212;&#8212;&#19968;&#20491;&#33287;&#37679;&#35492;&#38283;&#22987;&#26178;&#38291;&#23436;&#32654;&#30456;&#38364;&#30340; metric spike&#12290;&#25105;&#24046;&#40670;&#23601;&#29031;&#33879;&#20570;&#20102;&#12290;&#20294;&#37027;&#20491; GSI &#21482;&#29992;&#20102; provisioned capacity &#30340; 40%&#65292;&#38626; throttling &#36960;&#24471;&#24456;&#12290;Agent &#20570;&#20102;&#12300;metric &#36319;&#37679;&#35492;&#21516;&#26178;&#19978;&#21319;&#12301;&#30340;&#27169;&#24335;&#27604;&#23565;&#65292;&#21371;&#27794;&#21839;&#24133;&#24230;&#22816;&#19981;&#22816;&#22823;&#12290;&#30495;&#27491;&#30340;&#21407;&#22240;&#26159;&#37027;&#22825;&#26089;&#19978;&#37096;&#32626;&#35041;&#19968;&#20491; rate limiter &#30340; typo&#8212;&#8212;&#27599;&#31186; 50 &#20491; request &#32780;&#19981;&#26159; 500 &#20491;&#12290;&#24046;&#19968;&#20491;&#38646;&#65292;&#23601;&#22312; agent &#24478;&#27794;&#21435;&#30475;&#30340; deployment diff &#35041;&#12290;</p><p>&#32350;&#20102;&#21313;&#20843;&#20998;&#37912;&#30340;&#24398;&#36335;&#12290;&#19981;&#31639;&#33268;&#21629;&#65292;&#20294;&#22816;&#25105;&#20497;&#30171;&#23450;&#24605;&#30171;&#12290;&#24478;&#37027;&#20043;&#24460;&#25105;&#20497;&#19981;&#20877;&#25226; agent &#30340;&#36664;&#20986;&#30070;&#23450;&#35542;&#65292;&#32780;&#26159;&#30070;&#20597;&#26597;&#22577;&#21578;&#8212;&#8212;&#38468;&#24118;&#35657;&#25818;&#30340;&#20551;&#35498;&#65292;&#30001;&#20154;&#20358;&#23529;&#35222;&#36861;&#21839;&#65306;&#36889;&#20491;&#30064;&#24120;&#30495;&#30340;&#33021;&#35299;&#37323;&#24433;&#38911;&#21966;&#65311;&#26368;&#36817;&#25913;&#20102;&#20160;&#40636;&#65311;&#22833;&#25943;&#24460;&#25105;&#26356;&#26032;&#20102; skill&#65306;&#20808;&#27298;&#26597;&#37096;&#32626;&#27511;&#21490;&#65292;&#20006;&#19988;&#39511;&#35657; metric threshold &#35201;&#36319; provisioned capacity &#27604;&#65292;&#19981;&#33021;&#21482;&#30475; spike&#12290;Steven &#22312;&#31532;&#22235;&#27425;&#20107;&#25925;&#20013;&#25235;&#21040;&#21478;&#19968;&#20491;&#32570;&#28431;&#65306;&#27794;&#26377;&#27298;&#26597; ECS deployment status&#12290;&#20182;&#21578;&#35380;&#25105;&#65292;&#25105;&#26356;&#26032;&#20102; skill&#12290;</p><p>&#35215;&#24459;&#28014;&#29694;&#20102;&#12290;&#27599;&#27425; agent &#21028;&#26039;&#37679;&#35492;&#25110;&#19981;&#23436;&#25972;&#65292;&#25105;&#21482;&#38656;&#35201;&#21578;&#35380;&#23427;&#65306;&#12300;&#20320;&#28431;&#20102;&#37096;&#32626;&#27511;&#21490;&#12290;&#26356;&#26032; triage skill&#65292;&#35731;&#27298;&#26597;&#36817;&#26399;&#35722;&#26356;&#27704;&#36960;&#26159;&#31532;&#19968;&#26781;&#35519;&#26597;&#32218;&#12290;&#12301;Agent &#25913;&#23531;&#20102;&#33258;&#24049;&#30340; skill&#12290;&#19979;&#27425;&#25105;&#21578;&#35380;&#23427;&#65306;&#12300;&#27298;&#26597; DynamoDB metric &#26178;&#65292;&#35201;&#25226; consumed capacity &#36319; provisioned capacity &#20570;&#27604;&#36611;&#8212;&#8212;&#22914;&#26524;&#20320;&#21482;&#29992;&#20102; 40% &#30340;&#38989;&#24230;&#65292;spike &#20160;&#40636;&#37117;&#19981;&#20195;&#34920;&#12290;&#12301;Agent &#21448;&#26356;&#26032;&#20102;&#33258;&#24049;&#12290;Steven &#30332;&#29694; ECS &#30340;&#32570;&#28431;&#65292;&#21578;&#35380;&#25105;&#65292;&#25105;&#29992;&#21516;&#27171;&#30340;&#26041;&#24335;&#36681;&#36948;&#12290;&#19968;&#21477;&#35441;&#65292;skill &#23601;&#21560;&#25910;&#20102;&#25945;&#35347;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png" width="2000" height="751" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:751,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-4.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#19981;&#29992;&#25163;&#21205;&#25913;&#35373;&#23450;&#27284;&#12290;&#19981;&#29992;&#20107;&#24460;&#35036; runbook&#12290;&#25105;&#23601;&#26159;&#36319; agent &#32842;&#23427;&#21738;&#35041;&#25630;&#30776;&#20102;&#65292;&#23427;&#33258;&#24049;&#23601;&#25226; playbook &#25913;&#22909;&#12290;&#20462;&#27491;&#19968;&#36335;&#30090;&#21152;&#12290;Skill &#34987; commit &#36914; repo&#65292;diff &#23601;&#26159;&#25925;&#20107;&#65306;&#27599;&#20491;&#25913;&#21205;&#37117;&#36861;&#28335;&#21040;&#19968;&#27425;&#29305;&#23450;&#30340;&#20107;&#25925;&#21644;&#19968;&#20491;&#29305;&#23450;&#30340;&#37679;&#35492;&#12290;&#37027;&#26159;&#22296;&#38538;&#35386;&#26039;&#21151;&#21147;&#30340; changelog&#65292;&#38752;&#30340;&#19981;&#26159;&#35504;&#26377;&#32000;&#24459;&#21435;&#32173;&#35703;&#65292;&#32780;&#26159;&#27599;&#27425;&#30495;&#23526;&#20107;&#25925;&#36924;&#20986;&#20358;&#30340;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png" width="2000" height="1040" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-5.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#31532;&#20116;&#27425;&#20107;&#25925;</h2><p>&#21040;&#20102;&#31532;&#20116;&#27425;&#20107;&#25925;&#65292;&#37027;&#20123;&#19968;&#21477;&#35441;&#30340;&#20462;&#27491;&#24050;&#32147;&#28414;&#25104;&#20102;&#25105;&#22987;&#26009;&#26410;&#21450;&#30340;&#38634;&#29699;&#12290;Skill &#26371;&#20808;&#27298;&#26597;&#37096;&#32626;&#27511;&#21490;&#12290;&#26371;&#25226; metric threshold &#36319; provisioned capacity &#20570;&#27604;&#36611;&#12290;&#26371;&#27298;&#26597; ECS deployment status&#12290;&#20840;&#37117;&#26159;&#34987;&#21578;&#30693;&#19968;&#27425;&#23601;&#23416;&#26371;&#30340;&#25945;&#35347;&#12290;&#22312; triage &#38542;&#27573;&#25105;&#24190;&#20046;&#19981;&#29992;&#20171;&#20837;&#12290;Agent &#20006;&#19981;&#23436;&#32654;&#8212;&#8212;&#20598;&#29246;&#36996;&#26159;&#26371;&#27161;&#35352;&#28961;&#38364;&#30340; metric&#65292;&#22196;&#37325;&#24615;&#35413;&#20272;&#20063;&#20559;&#39640;&#19968;&#27284;&#12290;&#20294;&#23427;&#30340;&#34920;&#29694;&#24050;&#32147;&#20687;&#19968;&#20491;&#22312;&#22296;&#38538;&#24453;&#20102;&#19968;&#24180;&#30340;&#20154;&#65292;&#19981;&#20877;&#26159;&#31532;&#19968;&#22825;&#37027;&#20491;&#20160;&#40636;&#37117;&#19981;&#25026;&#30340;&#33756;&#40165;&#24037;&#20855;&#12290;</p><p>Steven &#19978;&#36913;&#29544;&#31435;&#20351;&#29992;&#20102;&#23427;&#12290;&#19968;&#20491;&#35686;&#22577;&#35320;&#30332;&#65306;token refresh endpoint &#30340; 401 response &#21319;&#39640;&#12290;&#20182;&#36305;&#20102; triage skill&#12290;Skill &#20808;&#27298;&#26597;&#36817;&#26399;&#37096;&#32626;&#65288;&#27794;&#26377;&#65289;&#65292;&#25475;&#36942;&#22522;&#30990;&#35373;&#26045; metric&#65292;&#28982;&#24460;&#32302;&#23567;&#31684;&#22285;&#21040; token validation &#23376;&#31995;&#32113;&#12290;&#21313;&#20108;&#20998;&#37912;&#25214;&#21040;&#26681;&#26412;&#21407;&#22240;&#8212;&#8212;&#19978;&#28216; identity provider &#26356;&#25913;&#20102; JWKS endpoint &#30340;&#22238;&#25033;&#26684;&#24335;&#65292;&#30772;&#22750;&#20102;&#25105;&#20497;&#30340; key rotation&#12290;Steven &#24314;&#20102;&#20107;&#25925;&#22577;&#21578;&#12289;&#36319;&#21033;&#23475;&#38364;&#20418;&#20154;&#28317;&#36890;&#12289;&#21332;&#35519;&#20462;&#24489;&#12290;&#20182;&#19981;&#38656;&#35201;&#25105;&#12290;&#20182;&#27794;&#26377; Slack &#25105;&#12290;&#25105;&#26159;&#38548;&#22825;&#26089;&#19978;&#24478; post-mortem &#25991;&#20214;&#35041;&#25165;&#30693;&#36947;&#30340;&#12290;</p><p>&#37027;&#20491;&#30636;&#38291;&#25105;&#30693;&#36947;&#65292;&#32080;&#27083;&#24615;&#21839;&#38988;&#30495;&#30340;&#34987;&#35299;&#25481;&#20102;&#12290;&#19981;&#26159;&#32233;&#35299;&#65292;&#26159;&#30772;&#23616;&#12290;Steven &#31471;&#21040;&#31471;&#22320;&#34389;&#29702;&#20102;&#19968;&#27425;&#20107;&#25925;&#65292;&#29992;&#30340;&#26159;&#19968;&#20491;&#24478;&#27599;&#27425;&#20808;&#21069;&#37679;&#35492;&#20013;&#23416;&#32722;&#36942;&#30340; skill&#8212;&#8212;&#32780;&#37027;&#20123;&#37679;&#35492;&#65292;&#25105;&#21482;&#26159;&#19968;&#21477;&#19968;&#21477;&#22320;&#35611;&#32102;&#23427;&#32893;&#12290;</p><div><hr></div><h2>&#25976;&#23383;&#24590;&#40636;&#35498;</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png" width="2000" height="827" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-6.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#37327;&#28204;&#36889;&#20214;&#20107;&#65292;&#25105;&#24819;&#35611;&#30333;&#19968;&#40670;&#12290;&#25105;&#20497;&#27794;&#26377;&#36305;&#23565;&#29031;&#23526;&#39511;&#12290;&#25105;&#20497;&#27794;&#26377;&#20094;&#28136;&#30340;&#21069;&#24460;&#27604;&#36611; metric&#65292;&#22240;&#28858;&#12300;&#20043;&#21069;&#12301;&#26681;&#26412;&#27794;&#26377;&#34987; instrument&#12290;&#25105;&#20497;&#26377;&#30340;&#26159; Slack &#35338;&#24687;&#12289;&#20107;&#25925;&#22577;&#21578;&#21644;&#25105;&#33258;&#24049;&#31558;&#35352;&#35041;&#30340;&#26178;&#38291;&#25139;&#12290;</p><p>&#22312; triage agent &#20043;&#21069;&#65292;&#25105;&#20497;&#24478;&#35686;&#22577;&#21040;&#25214;&#21040;&#26681;&#26412;&#21407;&#22240;&#30340;&#20013;&#20301;&#25976;&#8212;&#8212;&#26681;&#25818;&#25105;&#33021;&#37325;&#24314;&#30340; 2025 &#24180;&#20845;&#27425;&#20107;&#25925;&#8212;&#8212;&#22823;&#32004;&#26159;&#19971;&#21313;&#20998;&#37912;&#12290;&#24555;&#30340;&#19977;&#21313;&#20998;&#37912;&#65288;&#35211;&#36942;&#30340;&#21839;&#38988;&#65292;&#38752;&#32908;&#32905;&#35352;&#25014;&#23601;&#33021;&#26039;&#65289;&#65292;&#24930;&#30340;&#22235;&#23567;&#26178;&#65288;&#20840;&#26032;&#30340;&#22750;&#27861;&#65292;&#24471;&#24478;&#38957;&#25720;&#32034;&#65289;&#12290;</p><p>&#26377;&#20102; triage agent &#20043;&#24460;&#65292;&#20116;&#27425;&#20107;&#25925;&#30340;&#20013;&#20301;&#25976;&#26159;&#21313;&#20843;&#20998;&#37912;&#12290;&#21312;&#38291;&#26159;&#21313;&#20108;&#21040;&#20108;&#21313;&#20843;&#12290;&#20108;&#21313;&#20843;&#20998;&#37912;&#37027;&#20491;&#38626;&#32676;&#20540;&#26159;&#31532;&#19977;&#27425;&#20107;&#25925;&#65292;agent &#21028;&#26039;&#37679;&#35492;&#65292;&#25105;&#20497;&#22312;&#37679;&#35492;&#32218;&#32034;&#19978;&#28010;&#36027;&#20102;&#26178;&#38291;&#12290;</p><p>&#25105;&#26356;&#22312;&#24847;&#30340;&#25976;&#23383;&#65306;&#27963;&#36493;&#20107;&#25925;&#26399;&#38291;&#30332;&#20986;&#30340;&#21033;&#23475;&#38364;&#20418;&#20154;&#26356;&#26032;&#25976;&#12290;&#20043;&#21069;&#65306;&#20013;&#20301;&#25976;&#19968;&#21063;&#65292;&#36890;&#24120;&#26159;&#22312;&#20462;&#24489;&#24050;&#32147;&#22312;&#36914;&#34892;&#26178;&#25165;&#30332;&#20986;&#12290;&#20043;&#24460;&#65306;&#20013;&#20301;&#25976;&#22235;&#21063;&#65292;&#31532;&#19968;&#21063;&#22312;&#35686;&#22577;&#24460;&#21313;&#20998;&#37912;&#20839;&#23601;&#30332;&#20986;&#12290;&#36889;&#25165;&#26159;&#30495;&#27491;&#34987;&#25171;&#36890;&#30340;&#29872;&#31680;&#12290;Triage agent &#19981;&#21482;&#21152;&#36895;&#20102;&#35386;&#26039;&#8212;&#8212;&#23427;&#25226;&#20154;&#39006;&#24478; query engine &#30340;&#35282;&#33394;&#35041;&#37323;&#25918;&#20986;&#20358;&#65292;&#21435;&#20570;&#20154;&#39006;&#30495;&#27491;&#25797;&#38263;&#30340;&#20107;&#65306;&#35731;&#31561;&#31572;&#26696;&#30340;&#20154;&#19981;&#20877;&#20094;&#31561;&#12290;</p><div><hr></div><h2>&#24037;&#31243;&#24107;&#26412;&#20358;&#23601;&#35442;&#20570;&#30340;&#20107;</h2><p>&#31639;&#20107;&#25925;&#25104;&#26412;&#65292;&#22823;&#23478;&#32722;&#24931;&#30447;&#20572;&#27231;&#20998;&#37912;&#25976;&#12290;&#37027;&#30070;&#28982;&#37325;&#35201;&#12290;&#20294;&#30495;&#27491;&#21507;&#20154;&#30340;&#38577;&#24615;&#25104;&#26412;&#8212;&#8212;&#32780;&#19988;&#26371;&#36880;&#23395;&#35079;&#21033;&#30340;&#8212;&#8212;&#26159;&#30693;&#35672;&#22751;&#26039;&#12290;&#27599;&#19968;&#27425;&#21482;&#26377;&#19968;&#20491;&#20154;&#33021;&#20570; triage &#30340;&#20107;&#25925;&#65292;&#37117;&#35731;&#37027;&#20491;&#20154;&#26356;&#19981;&#21487;&#25110;&#32570;&#65292;&#35731;&#22296;&#38538;&#26356;&#33030;&#24369;&#12290;&#36039;&#28145;&#24037;&#31243;&#24107;&#35722;&#25104; SPOF&#65288;&#21934;&#40670;&#25925;&#38556;&#65289;&#65292;&#19981;&#26159;&#20182;&#20497;&#33258;&#39000;&#30340;&#8212;&#8212;&#20107;&#25925;&#25033;&#35722;&#22825;&#29983;&#23601;&#26159;&#24107;&#24466;&#21046;&#65292;&#27704;&#36960;&#19981;&#26371;&#26377;&#22816;&#22810;&#30340;&#20107;&#25925;&#35731;&#27599;&#20491;&#20154;&#37117;&#32244;&#21040;&#65292;&#32780;&#30495;&#27491;&#30332;&#29983;&#30340;&#37027;&#20123;&#21448;&#22826;&#24613;&#65292;&#26681;&#26412;&#27794;&#39192;&#35029;&#25343;&#20358;&#25945;&#23416;&#12290;</p><p>Triage agent &#27794;&#26377;&#21462;&#20195;&#25105;&#12290;&#23427;&#25581;&#38706;&#20102;&#25105;&#19968;&#30452;&#20197;&#20358;&#26412;&#35442;&#22312;&#20570;&#20160;&#40636;&#12290;</p><p>&#36889;&#20123;&#24180;&#20570;&#20107;&#25925;&#25033;&#35722;&#65292;&#25105;&#20197;&#28858;&#33258;&#24049;&#30340;&#20729;&#20540;&#23601;&#26159;&#35386;&#26039;&#21839;&#38988;&#12290;&#30070;&#37027;&#20491; query &#35352;&#24471;&#26368;&#22810;&#12289;metric &#30475;&#24471;&#26368;&#25026;&#12289;&#31995;&#32113;&#22750;&#27861;&#26368;&#29087;&#30340;&#20154;&#8212;&#8212;&#25110;&#32773;&#33267;&#23569;&#22312;&#30495;&#27491;&#29087;&#30340;&#20154;&#19981;&#22312;&#26178;&#65292;&#33021;&#38914;&#33879;&#19978;&#22580;&#25744;&#20303;&#12290;&#22823;&#23478;&#20063;&#26159;&#36889;&#27171;&#26399;&#24453;&#25105;&#30340;&#12290;&#20294;&#35386;&#26039;&#21839;&#38988;&#24478;&#20358;&#19981;&#26159;<em>&#22296;&#38538;</em>&#30340;&#38627;&#34389;&#8212;&#8212;&#23427;&#20043;&#25152;&#20197;&#38627;&#65292;&#21482;&#26159;&#22240;&#28858;&#30693;&#35672;&#34987;&#37782;&#22312;&#19968;&#20491;&#20154;&#30340;&#33126;&#34955;&#35041;&#65292;&#32780;&#37027;&#20491;&#20154;&#19981;&#19968;&#23450;&#22312;&#22580;&#12290;&#30495;&#27491;&#30340;&#38627;&#34389;&#65292;&#37027;&#20491;&#24433;&#38911;&#23458;&#25142;&#12289;&#21033;&#23475;&#38364;&#20418;&#20154;&#21644;&#26989;&#21209;&#30340;&#37096;&#20998;&#65292;&#26159;&#22312;&#22739;&#21147;&#19979;&#28165;&#26970;&#28317;&#36890;&#12289;&#36328;&#22296;&#38538;&#21332;&#35519;&#12289;&#20197;&#21450;&#23565;&#22196;&#37325;&#24615;&#21644;&#32233;&#35299;&#21462;&#25448;&#20570;&#21028;&#26039;&#12290;&#25105;&#27794;&#26377;&#22312;&#20570;&#36889;&#20123;&#65292;&#22240;&#28858;&#25105;&#27491;&#24537;&#33879;&#30070;&#20154;&#32905; query engine&#12290;</p><p>Agent &#25509;&#25163;&#20102; query engine &#30340;&#27963;&#12290;&#21097;&#19979;&#30340;&#65292;&#25165;&#26159;&#30495;&#27491;&#37325;&#35201;&#30340;&#24037;&#20316;&#65306;&#36319;&#20154;&#35611;&#35441;&#12289;&#25293;&#26495;&#12289;&#24118;&#20154;&#12290;&#22238;&#38957;&#30475;&#65292;&#25152;&#35586;&#30340;&#12300;&#33521;&#38596;&#24037;&#31243;&#24107;&#12301;&#19968;&#40670;&#37117;&#19981;&#33521;&#38596;&#12290;&#19981;&#36942;&#26159;&#19968;&#20491;&#30896;&#24039;&#26356;&#26377;&#32147;&#39511;&#65292;&#25110;&#32773;&#25171;&#23383;&#27604;&#36611;&#24555;&#30340;&#29942;&#38968;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png" width="2000" height="680" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.2&#65306;&#24478;&#27599;&#27425;&#20107;&#25925;&#20013;&#23416;&#32722;&#30340;Triage Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-7.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#25105;&#19981;&#30693;&#36947;&#31532;&#20845;&#27425;&#20107;&#25925;&#26371;&#25945; skill &#20160;&#40636;&#12290;&#37027;&#27491;&#26159;&#37325;&#40670;&#8212;&#8212;&#23427;&#19981;&#38656;&#35201;&#22312;&#31532;&#19968;&#22825;&#23601;&#23436;&#25972;&#65292;&#21482;&#38656;&#35201;&#27599;&#27425;&#20107;&#25925;&#20043;&#24460;&#27604;&#19978;&#27425;&#26356;&#24375;&#12290;&#32780;&#22296;&#38538;&#38656;&#35201;&#20449;&#20219;&#23427;&#21040;&#39000;&#24847;&#29992;&#12289;&#21448;&#25079;&#30097;&#23427;&#21040;&#39000;&#24847;&#25913;&#12290;&#21040;&#30446;&#21069;&#28858;&#27490;&#65292;&#36889;&#20841;&#26781;&#32218;&#37117;&#19981;&#38627;&#23432;&#20303;&#12290;</p>]]></content:encoded></item><item><title><![CDATA[AI 典範轉移 Ep.1：自我演化的監控Skill]]></title><description><![CDATA[&#25105;&#24118; Ubiquiti &#30340; SSO &#22296;&#38538;&#12290;&#25105;&#20497;&#36000;&#36012;&#35469;&#35657;&#12289;token &#31649;&#29702;&#12289;&#20351;&#29992;&#32773; provisioning&#8212;&#8212;&#37027;&#31278;&#27599;&#20491;&#22296;&#38538;&#37117;&#20381;&#36084;&#20294;&#27794;&#20154;&#24819;&#21040;&#30340;&#22522;&#30990;&#35373;&#26045;&#65292;&#30452;&#21040;&#23427;&#22750;&#25481;&#12290;&#36889;&#26159;&#19968;&#20221;&#27794;&#20154;&#24863;&#35613;&#20294;&#20986;&#20102;&#20107;&#19968;&#23450;&#34987;&#25235;&#20986;&#20358;&#30340;&#24037;&#20316;&#12290;]]></description><link>https://blog.schwannden.com/p/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution-zh</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution-zh</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 20 Mar 2026 08:08:03 GMT</pubDate><enclosure url="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1-1.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>&#25105;&#24118; Ubiquiti &#30340; SSO &#22296;&#38538;&#12290;&#25105;&#20497;&#36000;&#36012;&#35469;&#35657;&#12289;token &#31649;&#29702;&#12289;&#20351;&#29992;&#32773; provisioning&#8212;&#8212;&#37027;&#31278;&#27599;&#20491;&#22296;&#38538;&#37117;&#20381;&#36084;&#20294;&#27794;&#20154;&#24819;&#21040;&#30340;&#22522;&#30990;&#35373;&#26045;&#65292;&#30452;&#21040;&#23427;&#22750;&#25481;&#12290;&#36889;&#26159;&#19968;&#20221;&#27794;&#20154;&#24863;&#35613;&#20294;&#20986;&#20102;&#20107;&#19968;&#23450;&#34987;&#25235;&#20986;&#20358;&#30340;&#24037;&#20316;&#12290;</p><p>&#24190;&#36913;&#21069;&#25105;&#20497;&#22312; email module &#35041;&#30332;&#29694;&#20102;&#29942;&#38968;&#12290;&#27599;&#20491;&#30896;&#21040; email &#30340; API&#8212;&#8212;&#23494;&#30908;&#37325;&#35373;&#12289;MFA &#39511;&#35657;&#12289;&#36992;&#35531;&#27969;&#31243;&#12289;&#36890;&#30693;&#20559;&#22909;&#8212;&#8212;&#37117;&#27604;&#25033;&#26377;&#30340;&#36895;&#24230;&#24930;&#12290;&#20462;&#27861;&#24456;&#30452;&#25509;&#65306;&#25226; email module &#27599;&#27425;&#21628;&#21483;&#37117;&#37325;&#26032;&#21021;&#22987;&#21270;&#30340;&#38364;&#37749;&#20803;&#20214;&#20570; cache&#12290;Template rendering&#12289;SMTP &#36899;&#32218; metadata&#12289;&#25910;&#20214;&#20154;&#39511;&#35657;&#32080;&#26524;&#12290;&#37027;&#20123;&#22312; request &#20043;&#38291;&#19981;&#26371;&#35722;&#20294;&#27599;&#27425;&#37117;&#24478;&#38957;&#24314;&#31435;&#30340;&#26481;&#35199;&#65292;&#23601;&#20687;&#19968;&#20491;&#27599;&#22825;&#28165; node_modules &#20197;&#27714;&#24515;&#38728;&#28136;&#21270;&#30340;&#24037;&#31243;&#24107;&#19968;&#27171;&#12290;</p><p>&#25105;&#20497;&#23565; caching layer &#30340;&#27491;&#30906;&#24615;&#26377;&#20449;&#24515;&#12290;Unit test &#36942;&#20102;&#12290;Integration test &#20063;&#36942;&#20102;&#12290;&#21839;&#38988;&#26159;&#65306;&#30495;&#23526;&#27969;&#37327;&#25171;&#19978;&#21435;&#26371;&#24590;&#27171;&#65311;&#27599;&#20491; import email module &#30340; API &#25033;&#35442;&#37117;&#26371;&#35722;&#24555;&#12290;&#12300;&#25033;&#35442;&#12301;&#22823;&#27010;&#26159;&#24037;&#31243;&#24107;&#35422;&#24409;&#34920;&#35041;&#26368;&#21361;&#38570;&#30340;&#20841;&#20491;&#23383;&#12290;</p><p>&#26159;&#26178;&#20505;&#30435;&#25511;&#36889;&#27425; rollout &#20102;&#12290;</p><div><hr></div><h2>&#33290;&#30340;&#20570;&#27861;&#65292;&#25110;&#65306;&#28858;&#20160;&#40636;&#25105;&#33457;&#20102;&#20841;&#22825;&#24314;&#19968;&#20491;&#27794;&#20154;&#30475;&#30340; Dashboard</h2><p>&#36889;&#20107;&#25105;&#20570;&#36942;&#24456;&#22810;&#27425;&#20102;&#65292;&#21127;&#26412;&#27704;&#36960;&#19968;&#27171;&#12290;</p><p>&#39318;&#20808;&#65292;&#20320;&#22352;&#19979;&#20358;&#21015;&#33289;&#27599;&#19968;&#20491;&#21487;&#33021;&#21463;&#24433;&#38911;&#30340; API&#12290;&#20320;&#25171;&#38283; codebase&#65292;grep email module &#30340; import&#65292;&#24314;&#19968;&#20221;&#28165;&#21934;&#12290;&#20320;&#28431;&#20102;&#20841;&#20491;&#65292;&#22240;&#28858;&#23427;&#20497;&#36208;&#30340;&#26159;&#19968;&#20491;&#19981;&#30452;&#25509; import module &#30340;&#20839;&#37096; wrapper&#12290;&#20320;&#20043;&#24460;&#26371;&#30332;&#29694;&#36889;&#20214;&#20107;&#65292;&#22312;&#26368;&#31967;&#31957;&#30340;&#26178;&#27231;&#12290;</p><p>&#28982;&#24460;&#20320;&#23531;&#19968;&#20491; script&#12290;&#25110;&#32773;&#20320;&#24314;&#19968;&#20491; CloudWatch dashboard&#12290;&#25110;&#32773;&#20841;&#20491;&#37117;&#20570;&#8212;&#8212;&#22240;&#28858; script &#32102;&#20320;&#21407;&#22987;&#25976;&#25818;&#65292;dashboard &#32102;&#20320;&#28418;&#20142;&#30340;&#22294;&#34920;&#65292;&#22909;&#22312;&#26377;&#20154;&#22312; incident channel &#21839;&#12300;&#19968;&#20999;&#37117;&#36996;&#22909;&#21966;&#65311;&#12301;&#30340;&#26178;&#20505;&#22238;&#35206;&#19968;&#20123;&#27604;&#12300;ok&#12301;&#26356;&#26377;&#35498;&#26381;&#21147;&#30340;&#26481;&#35199;&#12290;</p><p>Dashboard &#19978;&#26377;&#27599;&#20491; API &#30340; status code &#20998;&#24067;&#12289;p50 &#21644; p95 latency&#12289;request volume &#30340;&#38754;&#26495;&#12290;&#20320;&#25226;&#23427;&#20497;&#25490;&#21015;&#25972;&#40778;&#12290;&#20320;&#35373;&#23450;&#21512;&#29702;&#30340; Y &#36600;&#31684;&#22285;&#12290;&#20320;&#26283;&#26178;&#35258;&#24471;&#33258;&#24049;&#24456;&#33021;&#24185;&#12290;</p><p>&#20320;&#37096;&#32626;&#20102;&#12290;</p><p>&#31532;&#19968;&#20491;&#23567;&#26178;&#30475;&#36215;&#20358;&#19981;&#37679;&#12290;Latency &#20840;&#38754;&#19979;&#38477;&#12290;&#20320;&#22312; team channel &#30332;&#20102;&#19968;&#24373;&#25130;&#22294;&#21644;&#19968;&#20491;&#20302;&#35519;&#30340;&#24950;&#31069; emoji&#12290;&#28982;&#24460;&#26377;&#20154;&#22238;&#22577;&#37027;&#20491; legacy user-export endpoint&#8212;&#8212;&#20841;&#20491;&#23395;&#24230;&#21069;&#23601; deprecated &#20102;&#20294;&#19977;&#20491;&#20225;&#26989;&#23458;&#25142;&#36996;&#22312;&#21628;&#21483;&#22240;&#28858;&#27794;&#20154;&#24375;&#21046;&#22519;&#34892; deprecation &#30340;&#37027;&#20491;&#8212;&#8212;&#38283;&#22987;&#22238; 500&#12290;&#21407;&#20358; caching layer &#36319;&#19968;&#27573;&#26371;&#25226; mutable config object &#20659;&#36914; email module &#28982;&#24460;&#26399;&#24453; module &#20462;&#25913;&#23427;&#20316;&#28858; side effect &#30340; code path &#20114;&#21205;&#19981;&#33391;&#12290;&#37027;&#31278;&#20320;&#27704;&#36960;&#19981;&#26371;&#21051;&#24847;&#35373;&#35336;&#20294;&#22312;&#20219;&#20309;&#36229;&#36942;&#21313;&#20843;&#20491;&#26376;&#30340; codebase &#35041;&#33258;&#28982;&#38263;&#20986;&#20358;&#30340;&#26481;&#35199;&#12290;</p><p>&#29694;&#22312;&#20320;&#36914;&#20837; incident &#27169;&#24335;&#12290;&#20320;&#38656;&#35201;&#19968;&#20491;&#19981;&#22312; dashboard &#19978;&#30340; API &#30340;&#25976;&#25818;&#12290;&#20320; SSH &#36914;&#19968;&#21488;&#27231;&#22120;&#12290;&#20320;&#23565; metrics store &#36305; ad-hoc query&#12290;&#20320;&#29992; grep &#30340;&#36664;&#20986;&#21644;&#21892;&#24847;&#24314;&#27083;&#19968;&#20491; mental model&#12290;&#20320;&#25214;&#21040; bug&#65292;&#25512;&#19968;&#20491;&#20462;&#24489;&#65292;&#39511;&#35657;&#20462;&#24489;&#65292;&#28982;&#24460;&#38283;&#22987;&#25991;&#26360;&#20316;&#26989;&#65306;incident report&#12289;deprecated endpoint migration &#30340; Jira ticket&#12289;&#19968;&#20491; post-mortem action item &#23531;&#33879;&#12300;&#25913;&#21892;&#30435;&#25511;&#35206;&#33995;&#29575;&#12301;&#12290;&#20320;&#36996;&#38656;&#35201;&#26356;&#26032; dashboard &#25226;&#20320;&#28431;&#25481;&#30340; API &#21152;&#36914;&#21435;&#65292;&#22240;&#28858;&#19979;&#19968;&#27425;&#8212;&#8212;&#27704;&#36960;&#26377;&#19979;&#19968;&#27425;&#8212;&#8212;&#20320;&#24819;&#30475;&#21040;&#23436;&#25972;&#30340;&#30059;&#38754;&#12290;</p><p>&#30435;&#25511;&#26412;&#20358;&#25033;&#35442;&#24171;&#20320;&#24230;&#36942; release &#30340;&#12290;&#32080;&#26524;&#23427;&#35722;&#25104;&#20102;&#33258;&#24049;&#30340;&#23560;&#26696;&#65292;&#26377;&#33258;&#24049;&#30340; bug&#12289;&#33258;&#24049;&#30340;&#32173;&#35703;&#36000;&#25812;&#12289;&#33258;&#24049;&#30340;&#25216;&#34899;&#20661;&#12290;&#20320;&#24314;&#30340; dashboard &#25130;&#33267;&#20170;&#22825;&#26159;&#27491;&#30906;&#30340;&#12290;&#21040;&#20102;&#19979;&#19968;&#23395;&#65292;&#30070;&#26377;&#20154;&#26032;&#22686;&#19968;&#20491;&#20381;&#36084; email &#30340; endpoint&#65292;&#23427;&#21448;&#26371;&#19981;&#23436;&#25972;&#65292;&#32780;&#19988;&#27794;&#20154;&#26371;&#26356;&#26032;&#23427;&#65292;&#22240;&#28858;&#27794;&#20154;&#26371;&#26356;&#26032; dashboard&#12290;&#23427;&#20497;&#26159;&#22522;&#30990;&#35373;&#26045;&#30340;&#25216;&#34899;&#20661;&#65306;&#30701;&#21629;&#12289;&#32321;&#27542;&#21147;&#24375;&#12289;&#31532;&#19968;&#22825;&#20043;&#24460;&#22522;&#26412;&#19978;&#23601;&#34987;&#24573;&#30053;&#20102;&#12290;</p><p>&#36889;&#20491;&#24490;&#29872;&#25105;&#32147;&#27511;&#20102;&#21313;&#24190;&#27425;&#12290;&#25105;&#20197;&#28858;&#20107;&#24773;&#23601;&#26159;&#36889;&#27171;&#36939;&#20316;&#30340;&#12290;&#29151;&#36939;&#30340;&#20195;&#20729;&#12290;&#36319;&#21152;&#29677;&#21644; on-call &#19968;&#27171;&#65292;&#26159;&#24037;&#31243;&#24107;&#36867;&#19981;&#25481;&#30340;&#23487;&#21629;&#12290;</p><div><hr></div><h2>&#26032;&#30340;&#20570;&#27861;&#65292;&#25110;&#65306;&#36319;&#20320;&#30340;&#30435;&#25511;&#32842;&#22825;</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png" width="2000" height="870" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#36889;&#27425;&#25105;&#20570;&#20102;&#19981;&#19968;&#27171;&#30340;&#20107;&#12290;&#25105;&#27794;&#26377;&#23531; script &#25110;&#24314; dashboard&#65292;&#32780;&#26159;&#35531; Claude Code &#24171;&#25105;&#24314;&#19968;&#20491; skill&#12290;</p><p>Skill &#22312; Claude Code &#35041;&#26159;&#19968;&#20491;&#21487;&#37325;&#35079;&#20351;&#29992;&#30340; command&#8212;&#8212;&#19968;&#32068;&#25351;&#20196;&#21644; tool &#23450;&#32681;&#30340;&#38598;&#21512;&#65292;agent &#21487;&#20197;&#22519;&#34892;&#23427;&#12290;&#25226;&#23427;&#24819;&#25104;&#19968;&#20491;&#26371;&#24605;&#32771;&#30340; script&#12290;Bash script &#36981;&#24490;&#19968;&#20491;&#22266;&#23450;&#30340;&#25351;&#20196;&#24207;&#21015;&#65292;&#30070;&#29694;&#23526;&#20559;&#38626;&#20316;&#32773;&#30340;&#20551;&#35373;&#26178;&#23601;&#23849;&#28528;&#65307;skill &#32102; agent &#19968;&#20491;&#30446;&#27161;&#65292;&#35731;&#23427;&#33258;&#24049;&#24819;&#36774;&#27861;&#36948;&#25104;&#12290;</p><p>&#22823;&#33268;&#19978;&#25105;&#26159;&#36889;&#27171;&#35201;&#27714;&#30340;&#65306;&#12300;&#24314;&#19968;&#20491; post-release &#30435;&#25511; skill&#12290;&#23427;&#25033;&#35442; spawn &#20841;&#20491;&#20006;&#34892;&#30340; agent&#8212;&#8212;&#19968;&#20491;&#30475; service &#23652;&#32026;&#30340; metrics&#65292;&#20687;&#26159;&#27599;&#20491; API endpoint &#30340; status code &#21644; latency&#65307;&#19968;&#20491;&#30475;&#22522;&#30990;&#35373;&#26045;&#23652;&#32026;&#30340; metrics&#65292;&#20687;&#26159; CPU&#12289;&#35352;&#25014;&#39636;&#21644; connection pool &#20351;&#29992;&#29575;&#12290;&#25105;&#35201;&#33021;&#21578;&#35380;&#23427;&#30435;&#25511;&#22810;&#20037;&#12289;&#32858;&#28966;&#21738;&#20491;&#26381;&#21209;&#12290;&#12301;</p><p>&#23601;&#36889;&#27171;&#12290;&#19981;&#29992;&#25163;&#21205;&#21015;&#33289; API&#12290;&#19981;&#29992;&#35373;&#35336; dashboard layout&#12290;&#19981;&#29992;&#23531; CloudWatch metric query&#12290;Skill &#29702;&#35299;&#30435;&#25511;&#30446;&#27161;&#65292;&#30693;&#36947;&#24590;&#40636;&#26597;&#35426;&#25105;&#20497;&#30340; metrics &#31995;&#32113;&#65292;&#32780;&#19988;&#26159;&#36879;&#36942;&#35264;&#23519;&#23526;&#38555;&#27969;&#37327;&#25976;&#25818;&#20358;&#25214;&#20986;&#21738;&#20123; endpoint &#23384;&#22312;&#65292;&#32780;&#19981;&#26159;&#38752;&#25105;&#37027;&#19981;&#23436;&#25972;&#30340; codebase mental model&#12290;</p><p>&#25105;&#20497;&#23531;&#20102;&#19968;&#20491; command&#65306;<code>/monitor-release --service email --duration 2h</code>&#12290;Agent &#21855;&#21205;&#65292;&#20998;&#21449;&#25104;&#20841;&#20491;&#30435;&#25511;&#22519;&#34892;&#32210;&#65292;&#38283;&#22987;&#35264;&#23519;&#12290;&#23427;&#22312;&#32066;&#31471;&#27231;&#32102;&#25105;&#21363;&#26178;&#25688;&#35201;&#12290;Service agent &#22238;&#22577;&#27599;&#20491; endpoint &#30340; latency &#35722;&#21270;&#21644;&#30334;&#20998;&#27604;&#25913;&#21892;&#12290;Infra agent &#22238;&#22577;&#36039;&#28304;&#20351;&#29992;&#29575;&#36264;&#21218;&#12290;&#20841;&#20491;&#37117;&#26371;&#27161;&#35352;&#30064;&#24120;&#12290;</p><p>&#25105;&#37096;&#32626;&#20102; caching layer&#12290;Skill &#38283;&#22987;&#24037;&#20316;&#12290;Latency &#19979;&#38477;&#20102;&#12290;&#25688;&#35201;&#30475;&#36215;&#20358;&#24456;&#20094;&#28136;&#12290;&#25105;&#25226;&#25130;&#22294;&#30332;&#21040; team channel&#12290;</p><p>&#28982;&#24460;&#37027;&#20491; legacy user-export endpoint &#38283;&#22987;&#22132; 500&#12290;&#36319;&#33290;&#19990;&#30028;&#35041;&#26371;&#30896;&#21040;&#30340;&#19968;&#27171;&#30340; bug&#12290;&#19968;&#27171;&#19981;&#22312;&#25105;&#38647;&#36948;&#19978;&#30340; deprecated API&#12290;</p><p>&#20294;&#36889;&#27425;&#65292;&#30435;&#25511; agent <em>&#27880;&#24847;&#21040;&#20102;</em>&#12290;&#23427;&#19981;&#21463;&#38480;&#26044;&#25105; hardcode &#22312; dashboard &#35041;&#30340;&#38928;&#23450;&#32681; endpoint &#28165;&#21934;&#12290;&#23427;&#35264;&#23519;&#30340;&#26159; email service &#30340;&#23526;&#38555;&#27969;&#37327;&#27169;&#24335;&#65292;&#30070;&#19968;&#20491;&#21407;&#26412;&#22238; 200 &#30340; endpoint &#31361;&#28982;&#38283;&#22987;&#22238; 500&#65292;&#23427;&#27161;&#35352;&#20102;&#12290;&#25105;&#19981;&#29992; SSH &#36914;&#20219;&#20309;&#27231;&#22120;&#12290;&#25105;&#19981;&#29992;&#23531; ad-hoc query&#12290;Agent &#21578;&#35380;&#25105;&#65306;&#12300;<code>/v1/users/export</code> endpoint &#24478; 14:32 UTC &#38283;&#22987;&#20986;&#29694; 500 status code &#28608;&#22686;&#12290;&#36889;&#20491; endpoint &#19981;&#22312;&#21021;&#22987;&#30435;&#25511;&#31684;&#22285;&#20839;&#65292;&#20294;&#23427;&#36879;&#36942; <code>UserBulkOperations</code> &#38291;&#25509; import &#20102; email module&#12290;&#35201;&#25105;&#21152;&#36914;&#20027;&#35201;&#35264;&#23519;&#28165;&#21934;&#21966;&#65311;&#12301;</p><p>&#35201;&#12290;&#30070;&#28982;&#35201;&#12290;</p><div><hr></div><h2>&#30070;&#20320;&#21487;&#20197;&#30452;&#25509;&#35498;&#20986;&#20320;&#24819;&#35201;&#20160;&#40636;</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png" width="2000" height="1087" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1087,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#33290;&#30340;&#20570;&#27861;&#21644;&#26032;&#30340;&#20570;&#27861;&#22312;&#36889;&#35041;&#20998;&#27495;&#22823;&#21040;&#21483;&#23427;&#12300;&#25913;&#36914;&#12301;&#37117;&#22826;&#20445;&#23432;&#20102;&#12290;&#36889;&#26159;&#19981;&#21516;&#30340;&#29983;&#21629;&#36913;&#26399;&#12290;</p><p>&#33290;&#19990;&#30028;&#35041;&#65292;&#30332;&#29694;&#20320;&#38656;&#35201;&#30435;&#25511;&#19968;&#20491;&#26032; endpoint &#24847;&#21619;&#33879;&#65306;&#21040; CloudWatch&#65292;&#24314;&#19968;&#20491;&#26032; widget&#65292;&#35373;&#23450; metric query&#65292;&#36984; statistic&#65292;&#35373; period&#65292;&#35519;&#25972; dashboard layout&#65292;&#20786;&#23384;&#65292;&#22238;&#21435;&#34389;&#29702;&#20320;&#26412;&#20358;&#22312;&#35519;&#26597;&#30340;&#21839;&#38988;&#12290;&#26368;&#23569;&#21313;&#20998;&#37912;&#65292;&#21069;&#25552;&#26159;&#20320;&#24456;&#29087; CloudWatch&#12290;&#20108;&#21313;&#20998;&#37912;&#22914;&#26524;&#20320;&#38656;&#35201;&#26597; metric namespace&#12290;</p><p>&#26032;&#19990;&#30028;&#35041;&#65306;&#12300;&#25226; <code>/v1/users/export</code> &#21152;&#21040;&#35264;&#23519;&#28165;&#21934;&#12290;&#12301;&#25630;&#23450;&#12290;Agent &#24050;&#32147;&#22312;&#30435;&#25511;&#20102;&#12290;&#33457;&#36027;&#26178;&#38291;&#65306;&#22235;&#31186;&#37912;&#21152;&#19978;&#25171;&#19968;&#21477;&#35441;&#38656;&#35201;&#30340;&#21345;&#36335;&#37324;&#12290;</p><p>&#20294;&#26356;&#22909;&#30340;&#36996;&#22312;&#24460;&#38754;&#12290;&#21021;&#22987;&#30435;&#25511;&#26399;&#20043;&#24460;&#65292;&#25105;&#24847;&#35672;&#21040;&#25105;&#38656;&#35201;&#26356;&#32048;&#32251;&#30340; latency &#25976;&#25818;&#12290;&#38928;&#35373;&#26159; p50 &#21644; p95&#12290;&#23565; caching &#35722;&#26356;&#20358;&#35498;&#65292;&#25105;&#24819;&#30475; p99&#8212;&#8212;&#22240;&#28858; cache miss &#19981;&#25104;&#27604;&#20363;&#22320;&#24433;&#38911; tail latency&#12290;&#25105;&#20063;&#24819;&#30475;&#26368;&#23567;&#20540;&#65292;&#22240;&#28858;&#21487;&#30097;&#30340;&#20302;&#26368;&#23567;&#20540;&#21487;&#33021;&#20195;&#34920;&#26576;&#20491; endpoint &#22312;&#21040;&#36948; email module &#20043;&#21069;&#23601; short-circuit &#20102;&#12290;&#25105;&#36996;&#24819;&#30475; p99 <em>&#25490;&#38500; outlier</em>&#65292;&#22240;&#28858;&#25105;&#20497;&#26377;&#19968;&#20123;&#20225;&#26989;&#23458;&#25142;&#30340; request &#22240;&#28858;&#36039;&#26009;&#37327;&#22823;&#25152;&#20197;&#21512;&#29702;&#22320;&#27604;&#36611;&#24930;&#65292;&#23427;&#20497;&#26371; skew tail&#12290;</p><p>&#33290;&#19990;&#30028;&#65306;&#27599;&#20491; endpoint &#19977;&#20491;&#26032;&#30340; CloudWatch math expression&#12290;&#19968;&#31278; metric query &#35486;&#35328;&#65292;&#35712;&#36215;&#20358;&#20687;&#26377;&#20154;&#22312;&#25910;&#35338;&#24456;&#24046;&#30340;&#38651;&#35441;&#35041;&#36319;&#19968;&#20491; Perl &#24859;&#22909;&#32773;&#25551;&#36848; SQL&#12290;&#26368;&#23569;&#19977;&#21313;&#20998;&#37912;&#12290;</p><p>&#26032;&#19990;&#30028;&#65306;&#12300;&#20063;&#32102;&#25105;&#30475; p99&#12289;min&#12289;&#21644;&#25490;&#38500; response time &#21069; 1% &#30340; p99&#12290;&#12301;Agent &#26356;&#26032;&#20102;&#33258;&#24049;&#30340;&#22577;&#21578;&#12290;&#19979;&#27425;&#21047;&#26032;&#65292;&#26032;&#30340;&#27396;&#20301;&#23601;&#22312;&#37027;&#20102;&#12290;</p><p>&#28982;&#24460;&#36889;&#26159;&#35731;&#25105;&#21040;&#29694;&#22312;&#36996;&#39514;&#35357;&#30340;&#37096;&#20998;&#65292;&#21363;&#20351;&#24050;&#32147;&#36889;&#27171;&#24037;&#20316;&#20102;&#22909;&#24190;&#36913;&#65306;&#25105;&#21483; agent &#26356;&#26032; skill &#26412;&#36523;&#12290;&#19981;&#21482;&#26159;&#30070;&#21069;&#30340;&#30435;&#25511; session&#8212;&#8212;&#32780;&#26159; skill &#30340;&#23450;&#32681;&#12290;&#12300;&#26356;&#26032; skill&#65292;&#35731; p99&#12289;min &#21644; p99-excluding-outliers &#38928;&#35373;&#23601;&#21253;&#21547;&#22312;&#26410;&#20358;&#30340;&#22519;&#34892;&#20013;&#12290;&#12301;Agent &#20462;&#25913;&#20102;&#33258;&#24049;&#30340;&#25351;&#20196;&#12290;&#19979;&#27425;&#25105;&#22296;&#38538;&#30340;&#20219;&#20309;&#20154;&#36305; <code>/monitor-release</code>&#65292;&#37027;&#20123;&#32113;&#35336;&#25976;&#25818;&#24478;&#19968;&#38283;&#22987;&#23601;&#22312;&#37027;&#35041;&#12290;&#27794;&#20154;&#38656;&#35201;&#21435;&#35201;&#27714;&#12290;&#27794;&#20154;&#38656;&#35201;&#30693;&#36947;&#25105;&#26366;&#32147;&#33457;&#20102;&#19968;&#20491;&#19979;&#21320;&#25165;&#30332;&#29694;&#23427;&#20497;&#24456;&#37325;&#35201;&#12290;Skill &#21560;&#25910;&#20102;&#36889;&#20491;&#25945;&#35347;&#12290;</p><div><hr></div><h2>&#26371;&#33258;&#25105;&#23416;&#32722;&#30340;Skill</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png" width="2000" height="663" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:663,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" title="AI &#20856;&#31684;&#36681;&#31227; Ep.1&#65306;&#33258;&#25105;&#28436;&#21270;&#30340;&#30435;&#25511;Skill" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#36889;&#26159;&#25105;&#19968;&#30452;&#22312;&#24819;&#30340;&#27934;&#23519;&#65306;skill &#19981;&#26159;&#29992;&#23436;&#23601;&#19999;&#30340;&#26481;&#35199;&#12290;&#23427;&#26159;&#19968;&#20491;&#32047;&#31309;&#29151;&#36939;&#26234;&#24935;&#30340;&#29986;&#20986;&#29289;&#12290;</p><p>&#19968;&#20491;&#30435;&#25511; script&#65292;&#19968;&#26086;&#23531;&#23436;&#65292;&#23601;&#20941;&#32080;&#20102;&#12290;&#23427;&#21453;&#26144;&#30340;&#26159;&#19968;&#20491;&#24037;&#31243;&#24107;&#22312;&#26576;&#20491;&#26178;&#38291;&#40670;&#30340;&#29702;&#35299;&#12290;&#30070;&#20320;&#22312; release &#36942;&#31243;&#20013;&#23416;&#21040;&#26481;&#35199;&#8212;&#8212;&#36889;&#20491; endpoint &#37325;&#35201;&#12289;&#37027;&#20491; metric &#26159;&#38620;&#35338;&#12289;&#36889;&#20491; threshold &#22826;&#25935;&#24863;&#8212;&#8212;&#20320;&#21487;&#20197;&#26356;&#26032; script&#65292;&#20294;&#32769;&#23526;&#35498;&#22823;&#37096;&#20998;&#20154;&#19981;&#26371;&#12290;&#20182;&#20497;&#22312;&#24515;&#35041;&#35352;&#19968;&#19979;&#65292;&#19979;&#27425;&#25163;&#21205;&#34389;&#29702;&#65292;&#26368;&#32066;&#38626;&#38283;&#20844;&#21496;&#65292;&#24118;&#36208;&#37027;&#20123;&#30693;&#35672;&#12290;Script &#32380;&#32396;&#20941;&#32080;&#33879;&#12290;&#26576;&#20491;&#26032;&#20154;&#36305;&#20102;&#23427;&#65292;&#25343;&#21040;&#19981;&#23436;&#25972;&#30340;&#25976;&#25818;&#65292;&#24490;&#29872;&#37325;&#20358;&#12290;</p><p>Skill &#26377;&#19981;&#21516;&#30340;&#29983;&#21629;&#36913;&#26399;&#12290;&#27599;&#27425;&#20320;&#20351;&#29992;&#23427;&#65292;&#20320;&#37117;&#21487;&#20197;&#25945;&#23427;&#12290;&#12300;&#22079;&#65292;&#20063;&#35264;&#23519; connection pool exhaustion&#8212;&#8212;&#19978;&#27425;&#34987;&#36889;&#20491;&#21676;&#21040;&#12290;&#12301;Agent &#26356;&#26032; skill&#12290;&#12300;&#37096;&#32626;&#26399;&#38291; <code>/v1/health</code> &#30340; 404 spike &#21487;&#20197;&#24573;&#30053;&#65292;&#37027;&#26159;&#38928;&#26399;&#30340;&#12290;&#12301;Agent &#21152;&#20837;&#20363;&#22806;&#12290;Skill &#35722;&#25104;&#22296;&#38538;&#23565;&#26044; release &#26399;&#38291;&#20160;&#40636;&#37325;&#35201;&#30340;&#38598;&#39636;&#35352;&#25014;&#65292;&#32232;&#30908;&#22312;&#19968;&#31278;&#26082;&#20154;&#39006;&#21487;&#35712;&#21448;&#27231;&#22120;&#21487;&#22519;&#34892;&#30340;&#26684;&#24335;&#35041;&#12290;</p><p>&#25105;&#20497;&#30340; rollout &#32080;&#26463;&#26178;&#8212;&#8212;caching layer &#39511;&#35657;&#23436;&#25104;&#12289;bug &#20462;&#24489;&#12289;deprecated endpoint &#25171;&#20102; patch&#12289;incident report &#23531;&#23436;&#8212;&#8212;&#25105;&#25226; skill commit &#36914; repository&#12290;&#23427;&#26159;&#19968;&#20491; Markdown &#27284;&#26696;&#21152;&#19978; tool &#23450;&#32681;&#21644;&#30435;&#25511;&#25351;&#20196;&#12290;&#26032;&#24037;&#31243;&#24107;&#21487;&#20197;&#35712;&#23427;&#65292;&#29702;&#35299;&#22296;&#38538;&#22312; performance release &#26399;&#38291;&#30435;&#25511;&#20160;&#40636;&#20197;&#21450;&#28858;&#20160;&#40636;&#12290;&#20182;&#20497;&#20063;&#21487;&#20197;&#30452;&#25509;<em>&#36305;</em>&#23427;&#65292;&#38283;&#31665;&#21363;&#29992;&#22320;&#25343;&#21040;&#30435;&#25511;&#65292;&#19981;&#29992;&#29702;&#35299;&#35041;&#38754;&#27599;&#19968;&#20491;&#27770;&#31574;&#12290;</p><p>&#36319;&#33290;&#19990;&#30028;&#27604;&#19968;&#19979;&#12290;Release &#32080;&#26463;&#24460;&#20320;&#26377;&#30340;&#26159;&#65306;&#19968;&#20491;&#24050;&#32147;&#21322;&#36942;&#26399;&#30340; CloudWatch dashboard&#12289;&#19968;&#20491;&#21482;&#22312;&#20320;&#27231;&#22120;&#19978;&#33021;&#36305;&#30340; bash script&#12289;&#19968;&#20221;&#22312; Confluence &#35041;&#27794;&#20154;&#26371;&#35712;&#30340; incident report&#12289;&#36996;&#26377;&#25955;&#24067;&#22312; Slack thread &#35041;&#30340;&#37096;&#33853;&#30693;&#35672;&#12290;&#26032;&#24037;&#31243;&#24107;&#21152;&#20837;&#65292;&#21839;&#12300;&#25105;&#20497;&#24590;&#40636;&#30435;&#25511; release&#65311;&#12301;&#28982;&#24460;&#24471;&#21040;&#19968;&#20491;&#32883;&#32937;&#21644;&#19968;&#20491;&#20841;&#23395;&#20043;&#21069;&#30340; dashboard &#36899;&#32080;&#12290;</p><p>&#29694;&#22312;&#20182;&#20497;&#25343;&#21040;&#19968;&#20491; skill&#12290;&#20182;&#20497;&#36305;&#23427;&#12290;&#23427;&#33021;&#29992;&#12290;&#30070;&#20182;&#20497;&#22312;&#33258;&#24049;&#30340; release &#20013;&#23416;&#21040;&#26032;&#26481;&#35199;&#65292;&#20182;&#20497;&#25945;&#32102; skill&#65292;&#19979;&#19968;&#20491;&#20154;&#23601;&#21463;&#30410;&#12290;</p><div><hr></div><h2>&#25105;&#29694;&#22312;&#30495;&#27491;&#30456;&#20449;&#30340;</h2><p>&#25105;&#24819;&#22312;&#36889;&#35041;&#35641;&#24910;&#19968;&#40670;&#65292;&#22240;&#28858;&#25105;&#22312;&#36889;&#20491;&#29986;&#26989;&#24453;&#24471;&#22816;&#20037;&#65292;&#30693;&#36947;&#12300;&#29694;&#22312;&#19968;&#20999;&#37117;&#19981;&#21516;&#20102;&#12301;&#24190;&#20046;&#27704;&#36960;&#26159;&#37679;&#30340;&#65292;&#32780;&#37027;&#23569;&#25976;&#24190;&#27425;&#23427;&#26159;&#23565;&#30340;&#65292;&#23565;&#30340;&#26041;&#24335;&#20063;&#26159;&#27794;&#20154;&#38928;&#26009;&#21040;&#30340;&#12290;</p><p>AI skill &#27794;&#26377;&#21462;&#20195;&#30435;&#25511;&#12290;&#25105;&#36996;&#26159;&#26377; CloudWatch&#12290;&#36996;&#26159;&#26377; Grafana&#12290;Metrics &#31649;&#32218;&#27794;&#26377;&#35722;&#12290;&#35722;&#30340;&#26159;&#25105;&#21644;&#25105;&#30340;&#30435;&#25511;&#20043;&#38291;&#30340;&#20171;&#38754;&#8212;&#8212;&#20197;&#21450;&#25105;&#22312;&#20351;&#29992;&#36942;&#31243;&#20013;&#32047;&#31309;&#30340;&#29151;&#36939;&#30693;&#35672;&#30340;&#29983;&#21629;&#36913;&#26399;&#12290;</p><p>&#36889;&#20214;&#20107;&#30340;&#24433;&#38911;&#36229;&#20046;&#24819;&#20687;&#22320;&#22823;&#12290;</p><p>&#20659;&#32113;&#30340;&#38283;&#30332;&#29983;&#21629;&#36913;&#26399;&#26377;&#36889;&#20123;&#38626;&#25955;&#30340;&#12289;&#30171;&#33510;&#30340;&#20132;&#25509;&#65306;&#20320;&#20570;&#35336;&#30059;&#12289;&#24314;&#30435;&#25511;&#12289;&#37096;&#32626;&#12289;&#30332;&#29694;&#30435;&#25511;&#19981;&#23436;&#25972;&#12289;&#20462;&#30435;&#25511;&#12289;&#30332;&#29694;&#21839;&#38988;&#12289;&#20462;&#21839;&#38988;&#12289;&#20877;&#27425;&#26356;&#26032;&#30435;&#25511;&#12289;&#23531; incident report&#12289;&#38283; ticket&#65292;&#28982;&#24460;&#20320;&#32380;&#32396;&#21069;&#36914;&#65292;&#30435;&#25511;&#38283;&#22987;&#33104;&#29211;&#12290;&#27599;&#20491;&#38542;&#27573;&#26159;&#29544;&#31435;&#30340;&#27963;&#21205;&#65292;&#26377;&#33258;&#24049;&#30340;&#24037;&#20855;&#21644;&#33258;&#24049;&#30340;&#25705;&#25830;&#12290;</p><p>Skill &#25226;&#36889;&#19968;&#20999;&#22739;&#32302;&#25104;&#19968;&#20491;&#36899;&#32396;&#30340;&#23565;&#35441;&#12290;Release &#21069;&#65292;&#20320;&#25551;&#36848;&#20320;&#24819;&#35264;&#23519;&#20160;&#40636;&#12290;Release &#26399;&#38291;&#65292;&#20320;&#29992;&#35498;&#30340;&#21363;&#26178;&#35519;&#25972;&#12290;Release &#24460;&#65292;&#20320; commit skill&#65292;&#35519;&#25972;&#34987;&#20445;&#30041;&#19979;&#20358;&#12290;&#30435;&#25511;&#12289;incident &#35519;&#26597;&#12289;&#30693;&#35672;&#25429;&#29554;&#8212;&#8212;&#29694;&#22312;&#23427;&#20497;&#26159;&#21516;&#19968;&#20491;&#27963;&#21205;&#12290;&#20320;&#19981;&#29992;&#22312;&#12300;&#30435;&#25511;&#12301;&#21644;&#12300;incident response&#12301;&#21644;&#12300;&#25991;&#20214;&#25776;&#23531;&#12301;&#20043;&#38291;&#20999;&#25563; context&#12290;&#20320;&#21482;&#26159;&#25345;&#32396;&#36319; agent &#23565;&#35441;&#65292;skill &#21560;&#25910;&#19968;&#20999;&#12290;</p><p>&#36889;&#26159;&#20856;&#31684;&#36681;&#31227;&#21966;&#65311;&#25105;&#19981;&#30906;&#23450;&#25105;&#22312;&#24847;&#37027;&#20491;&#27161;&#31844;&#12290;&#25105;&#30693;&#36947;&#30340;&#26159;&#65292;&#36889;&#27425; release &#25105;&#33457;&#20102;&#22823;&#32004;&#20841;&#23567;&#26178;&#22312;&#30435;&#25511;&#19978;&#65292;&#19978;&#19968;&#27425;&#27794;&#26377; skill &#30340;&#21516;&#31561;&#35215;&#27169; release&#65292;&#25105;&#33457;&#20102;&#23559;&#36817;&#20841;&#22825;&#12290;&#25105;&#30693;&#36947;&#30435;&#25511;&#35206;&#33995;&#29575;&#26356;&#22909;&#8212;&#8212;skill &#25235;&#21040;&#20102;&#19968;&#20491;&#25105;&#26371;&#28431;&#25481;&#30340; endpoint&#12290;&#25105;&#30693;&#36947;&#25105; commit &#30340;&#37027;&#20491;&#29986;&#20986;&#29289;&#23565;&#25105;&#30340;&#22296;&#38538;&#27604;&#25105;&#24314;&#36942;&#30340;&#20219;&#20309; dashboard &#37117;&#26377;&#29992;&#12290;&#32780;&#19988;&#25105;&#30693;&#36947;&#19979;&#19968;&#27425;&#65292;skill &#26371;&#27604;&#36889;&#27425;&#26356;&#22909;&#65292;&#22240;&#28858;&#23427;&#24478;&#36889;&#27425; release &#23416;&#21040;&#20102;&#26481;&#35199;&#65292;&#19979;&#19968;&#27425;&#23427;&#20063;&#26371;&#32380;&#32396;&#23416;&#12290;</p><p>&#26368;&#22909;&#30340;&#24037;&#20855;&#26159;&#37027;&#20123;&#36234;&#29992;&#36234;&#32880;&#26126;&#30340;&#24037;&#20855;&#12290;&#25105;&#30340;&#30435;&#25511;&#35373;&#23450;&#65292;&#32887;&#28079;&#20013;&#31532;&#19968;&#27425;&#65292;&#31526;&#21512;&#36889;&#20491;&#27161;&#28310;&#12290;</p><p>&#19981;&#36942; CloudWatch dashboard &#25105;&#36996;&#26159;&#26371;&#30041;&#33879;&#12290;&#33290;&#32722;&#38627;&#25913;&#65292;&#38656;&#35201;&#25226;&#32047;&#31309;&#37325;&#35201;&#30340;&#25976;&#25818;&#36996;&#26159;&#25918;&#19978;&#21435;&#65292;&#32780;&#19988;&#32317;&#24471;&#26377;&#20154;&#25130;&#22294;&#32102; incident channel &#30475;&#12290;&#26377;&#20123;&#20856;&#31684;&#26371;&#36681;&#31227;&#12290;&#26377;&#20123;&#21482;&#26159;&#22810;&#20102;&#19968;&#20491;&#26356;&#22909;&#30340;&#21103;&#39381;&#39387;&#12290;</p>]]></content:encoded></item><item><title><![CDATA[AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution]]></title><description><![CDATA[I lead the SSO team at Ubiquiti.]]></description><link>https://blog.schwannden.com/p/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-paradigm-shift-ep-1-the-skill-that-monitored-its-own-evolution</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 20 Mar 2026 08:07:42 GMT</pubDate><enclosure url="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><a class="image-link image2" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" title="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/ai-paradign-shift-ep1.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I lead the SSO team at Ubiquiti. We handle authentication, token management, user provisioning &#8212; the kind of infrastructure that every other team depends on and nobody thinks about until it breaks. It is a thankless gig with excellent job security.</p><p>A few weeks ago we identified a bottleneck in our email module. Every API that touches email &#8212; password resets, MFA verification, invite flows, notification preferences &#8212; was slower than it should have been. The fix was straightforward: cache the critical components that the email module initializes on every call.</p><p>We were confident the caching layer was correct. Unit tests passed. Integration tests passed. The question was: what happens when we flip this on for real traffic? Every API that imports the email module should get faster. "Should" is the word that has ruined more weekends than any other in the English language.</p><p>Time to monitor the rollout.</p><div><hr></div><h2>The Old Way, or: How I Learned to Stop Worrying and Build Dashboards That Nobody Reads</h2><p>I have done this dance before. Many times. The steps are always the same.</p><p>First, you sit down and enumerate every API that could be affected. You open the codebase, grep for email module imports, build a list. You miss two because they go through an internal wrapper that doesn't import the module directly. You will discover this later, at the worst possible time. You don't blame yourself because people left this legacy 10 years ago, but other people sure do blame you when things go south.</p><p>Then you write a script. Or you build a CloudWatch dashboard. Or both, because the script gives you the raw data and the dashboard gives you the pretty graphs for the incident channel when someone asks "is everything okay?" and you need to respond with something more convincing than "I think so."</p><p>The dashboard has panels for each API's status code distribution, p50 and p95 latency, and request volume. You arrange them neatly. You set reasonable Y-axis ranges. You feel briefly competent.</p><p>You deploy.</p><p>The first hour looks good. Latencies are down across the board. You send a message to the team channel with a screenshot and a modest celebration emoji. Then someone reports that the legacy user-export endpoint &#8212; the one that was deprecated two quarters ago but that three enterprise customers still call because nobody enforced the deprecation &#8212; is returning 500s. It turns out the caching layer interacts badly with a code path that passes a mutable config object into the email module and expects the module to modify it as a side effect. The kind of thing you would never design on purpose but that accretes naturally in any codebase older than eighteen months.</p><p>Now you are in incident mode. You need data on an API that is not in your dashboard. You SSH into a box. You run ad-hoc queries against the metrics store. You build a mental model from grep output and good intentions. You find the bug, push a fix, verify the fix, and then start the paperwork: incident report, Jira tickets for the deprecated endpoint migration, a post-mortem action item to "improve monitoring coverage." You also need to update your dashboard to include the APIs you missed, because next time &#8212; and there is always a next time &#8212; you want to see the full picture.</p><p>The monitoring was supposed to help you through the release. Instead it became its own project, with its own bugs, its own maintenance burden, and its own technical debt. The dashboard you built is correct as of today. By next quarter, when someone adds a new email-dependent endpoint, it will be incomplete again, and nobody will update it, because nobody ever updates dashboards. They are the fruit flies of infrastructure: brief, prolific, and largely ignored after the first day.</p><p>I have lived this cycle a dozen times. I assumed it was just how things worked. The cost of doing business. The developer's version of death and taxes.</p><div><hr></div><h2>The New Way, or: Talking to Your Monitoring</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png" width="2000" height="870" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" title="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-3.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This time I did something different. Instead of writing a script or building a dashboard, I asked Claude Code to build me a skill.</p><p>A skill, in Claude Code, is a reusable command &#8212; a bundle of instructions and tool definitions that an agent can execute. Think of it as a script that can think. Where a bash script follows a fixed sequence of commands and crashes when reality deviates from the author's assumptions, a skill gives the agent a goal and lets it figure out how to get there.</p><p>Here is what I asked for, roughly: "Build a post-release monitoring skill. It should spawn two concurrent agents &#8212; one watching service-level metrics like status codes and latency for each API endpoint, and one watching infrastructure-level metrics like CPU, memory, and connection pool utilization. I want to be able to tell it how long to monitor and which service to focus on."</p><p>That was it. No enumerating APIs by hand. No designing dashboard layouts. No writing CloudWatch metric queries. The skill understands the monitoring goal, knows how to query our metrics systems, and figures out which endpoints exist by looking at the actual traffic data rather than my incomplete mental model of the codebase.</p><p>We wrote a command: <code>/monitor-release --service email --duration 2h</code>. The agent spins up, forks into the two monitoring threads, and starts watching. It gives me a running summary in the terminal. Service agent reports latency changes per endpoint with percentage improvements. Infra agent reports resource utilization trends. Both flag anomalies.</p><p>I deployed the caching layer. The skill started doing its job. Latencies dropped. The summary looked clean. I sent the screenshot to the team channel.</p><p>Then the legacy user-export endpoint started throwing 500s. Same bug as I would have hit in the old world. Same deprecated API that was not on my radar.</p><p>But this time, the monitoring agent <em>noticed</em>. It was not limited to a predefined list of endpoints I had hardcoded into a dashboard. It was watching the actual traffic patterns for the email service, and when an endpoint that had been returning 200s suddenly started returning 500s, it flagged it. I did not have to SSH into anything. I did not have to write an ad-hoc query. The agent told me: "The <code>/v1/users/export</code> endpoint is showing a spike in 500 status codes starting at 14:32 UTC. This endpoint was not in the initial monitoring scope but it imports the email module transitively through <code>UserBulkOperations</code>. Want me to add it to the primary watch list?"</p><p>Yes. Yes I do.</p><div><hr></div><h2>When You Can Just Ask for What You Want</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png" width="2000" height="1087" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1087,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" title="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-1.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here is where the old way and the new way diverge so completely that calling it an "improvement" undersells it. It is a different lifecycle.</p><p>In the old world, realizing you need to monitor a new endpoint means: go to CloudWatch, create a new widget, configure the metric query, choose the statistic, set the period, adjust the dashboard layout, save, go back to actually fixing the problem you were investigating. Minimum ten minutes if you know CloudWatch well. Twenty if you need to look up the metric namespace.</p><p>In the new world: "Add <code>/v1/users/export</code> to the watch list." Done. The agent is already monitoring it. Time spent: four seconds and the calories required to type one sentence.</p><p>But it got better. After the initial monitoring period, I realized I wanted more nuanced latency data. The default was p50 and p95. For a caching change, I wanted to see p99 &#8212; because cache misses affect tail latency disproportionately. I also wanted to see the minimum, because a suspiciously low minimum might indicate an endpoint short-circuiting before it reaches the email module. And I wanted p99 <em>excluding outliers</em>, because we have a handful of enterprise customers whose requests legitimately take longer due to data volume, and they skew the tail.</p><p>Old world: three new CloudWatch math expressions per endpoint. A metric query language that reads like someone described SQL to a Perl enthusiast over a bad phone connection. Thirty minutes of work, minimum.</p><p>New world: "Also show me p99, min, and p99 excluding the top 1% by response time." The agent updated its own reporting. Next refresh, the new columns were there.</p><p>And here is the part that still surprises me, even after weeks of working this way: I told the agent to update the skill itself. Not just the current monitoring session &#8212; the skill definition. "Update the skill so that p99, min, and p99-excluding-outliers are included by default for future runs." The agent modified its own instructions. The next time anyone on my team runs <code>/monitor-release</code>, those statistics are there from the start. Nobody needs to ask for them. Nobody needs to know that I once spent an afternoon discovering they were important. The skill absorbed the lesson.</p><div><hr></div><h2>The Artifact That Learns</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png" width="2000" height="663" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:663,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" title="AI Paradigm Shift Ep.1: The Skill That Monitored Its Own Evolution" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/03/image-2.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is the insight that I keep coming back to: the skill is not a throwaway. It is an artifact that accumulates operational wisdom.</p><p>A monitoring script, once written, is frozen. It reflects the understanding of one engineer at one point in time. When you learn something during a release &#8212; this endpoint matters, that metric is noise, this threshold is too sensitive &#8212; you can update the script, but honestly, most people do not. They make a mental note, handle it manually next time, and eventually leave the company, taking the knowledge with them. The script stays frozen. Some new person runs it, gets incomplete data, and the cycle repeats.</p><p>The skill has a different lifecycle. Every time you use it, you can teach it. "Hey, also watch for connection pool exhaustion &#8212; that bit us last time." The agent updates the skill. "Ignore 404 spikes on <code>/v1/health</code> during deployments, those are expected." The agent adds the exception. The skill becomes the team's collective memory of what matters during a release, encoded in a format that is both human-readable and machine-executable.</p><p>When our rollout was done &#8212; caching layer verified, bug fixed, deprecated endpoint patched, incident report filed &#8212; I committed the skill to the repository. It is a Markdown file with tool definitions and monitoring instructions. A new engineer can read it and understand what the team watches during a performance release and why. They can also just <em>run</em> it and get the monitoring out of the box, without understanding every decision baked into it.</p><p>Compare this to the old world. After a release, you have: a CloudWatch dashboard that is already half-stale, a bash script that works on your machine, an incident report in Confluence that nobody will read, and tribal knowledge distributed across Slack threads. The new engineer joins, asks "how do we monitor releases?" and gets a shrug and a link to a dashboard from two quarters ago.</p><p>Now they get a skill. They run it. It works. And when they learn something new during their own release, they teach it to the skill, and the next person benefits.</p><div><hr></div><h2>What I Actually Believe Now</h2><p>I want to be careful here because I have been in this industry long enough to know that "everything is different now" is almost always wrong, and the few times it is right, it is right in ways nobody predicted.</p><p>The AI skill did not replace monitoring. I still have CloudWatch. I still have Grafana. The metrics pipeline did not change. What changed is the interface between me and my monitoring &#8212; and the lifecycle of the operational knowledge I accumulate while using it.</p><p>That turns out to matter enormously.</p><p>The traditional development lifecycle has these discrete, painful handoffs: you plan, you build the monitoring, you deploy, you discover the monitoring is incomplete, you fix the monitoring, you discover problems, you fix the problems, you update the monitoring again, you write the incident report, you file the tickets, and then you move on and the monitoring rots. Every phase is a separate activity with its own tools and its own friction.</p><p>The skill collapses all of that into a continuous conversation. Pre-release, you describe what you want to watch. During the release, you adjust in real time by talking. Post-release, you commit the skill and the adjustments are preserved. The monitoring, the incident investigation, the knowledge capture &#8212; they are the same activity now. You do not context-switch between "monitoring" and "incident response" and "documentation." You just keep talking to the agent, and the skill absorbs everything.</p><p>Is this a paradigm shift? I am not sure I care about the label. What I know is that I spent roughly two hours on monitoring for this release, and in my previous comparable release without the skill, I spent closer to two days. I know that the monitoring coverage was better &#8212; the skill caught an endpoint I would have missed. I know that the artifact I committed is more useful to my team than any dashboard I have ever built. And I know that next time, the skill will be better than it was this time, because it learned from this release, and it will learn from the next one too.</p><p>The best tools are the ones that get smarter as you use them. For the first time in my career, my monitoring setup qualifies.</p><p>I am still going to keep the CloudWatch dashboards, though. We'll be accumulating the really critical metrics there, and someone needs something to screenshot for the incident channel. Some paradigms shift. Some just get a better co-pilot.</p>]]></content:encoded></item><item><title><![CDATA[大腦與骨架的協奏曲：解構 AI Agent 的系統設計哲學]]></title><description><![CDATA[&#22312;&#20154;&#24037;&#26234;&#24935;&#30340;&#29105;&#28526;&#20013;&#65292;&#12300;AI Agent&#65288;&#20195;&#29702;&#20154;&#65289;&#12301;&#34987;&#25551;&#32362;&#25104;&#28961;&#25152;&#19981;&#33021;&#30340;&#25976;&#20301;&#31649;&#23478;&#12290;&#20294;&#22312;&#25105;&#20497;&#36889;&#20123;&#23526;&#38555;&#37096;&#32626;&#31995;&#32113;&#30340;&#24037;&#31243;&#24107;&#30524;&#20013;&#65292;Agent &#20006;&#19981;&#26159;&#39764;&#27861;&#65292;&#32780;&#26159;&#19968;&#31278;&#31934;&#23494;&#30340;&#31995;&#32113;&#26550;&#27083;&#12290;]]></description><link>https://blog.schwannden.com/p/ai-agent-workflow-study</link><guid isPermaLink="false">https://blog.schwannden.com/p/ai-agent-workflow-study</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 06 Feb 2026 11:00:25 GMT</pubDate><enclosure url="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 1456w" sizes="100vw"><img src="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png" data-attrs="{&quot;src&quot;:&quot;https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#22823;&#33126;&#33287;&#39592;&#26550;&#30340;&#21332;&#22863;&#26354;&#65306;&#35299;&#27083; AI Agent &#30340;&#31995;&#32113;&#35373;&#35336;&#21746;&#23416;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="&#22823;&#33126;&#33287;&#39592;&#26550;&#30340;&#21332;&#22863;&#26354;&#65306;&#35299;&#27083; AI Agent &#30340;&#31995;&#32113;&#35373;&#35336;&#21746;&#23416;" title="&#22823;&#33126;&#33287;&#39592;&#26550;&#30340;&#21332;&#22863;&#26354;&#65306;&#35299;&#27083; AI Agent &#30340;&#31995;&#32113;&#35373;&#35336;&#21746;&#23416;" srcset="https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 424w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 848w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 1272w, https://storage.ghost.io/c/b1/89/b18927e8-0612-4118-8ae2-1f1e9bd57184/content/images/2026/02/Screenshot-2026-02-06-at-3.53.39---PM.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>&#22312;&#20154;&#24037;&#26234;&#24935;&#30340;&#29105;&#28526;&#20013;&#65292;&#12300;AI Agent&#65288;&#20195;&#29702;&#20154;&#65289;&#12301;&#34987;&#25551;&#32362;&#25104;&#28961;&#25152;&#19981;&#33021;&#30340;&#25976;&#20301;&#31649;&#23478;&#12290;&#20294;&#22312;&#25105;&#20497;&#36889;&#20123;&#23526;&#38555;&#37096;&#32626;&#31995;&#32113;&#30340;&#24037;&#31243;&#24107;&#30524;&#20013;&#65292;Agent &#20006;&#19981;&#26159;&#39764;&#27861;&#65292;&#32780;&#26159;&#19968;&#31278;&#31934;&#23494;&#30340;<strong>&#31995;&#32113;&#26550;&#27083;</strong>&#12290;</p><p>&#21407;&#22987;&#35443;&#32048;&#35519;&#26597;&#36319;&#23416;&#32722;&#31558;&#35352;&#22312;&#27492;&#65306;<a href="https://schwannden.github.io/ai-agent-study/zh-tw/">https://schwannden.github.io/ai-agent-study/zh-tw/</a></p><h2>&#26680;&#24515;&#35299;&#27083;&#65306;Workflow vs. Agent</h2><p>&#22312;&#28145;&#20837;&#35373;&#35336;&#27169;&#24335;&#20043;&#21069;&#65292;&#25105;&#20497;&#24517;&#38920;&#20808;&#37328;&#28165; Anthropic &#25552;&#20986;&#30340;&#19968;&#20491;&#38364;&#37749;&#21312;&#21029;&#65306;<strong>&#20320;&#26159;&#38656;&#35201;&#19968;&#20491; Workflow&#65288;&#24037;&#20316;&#27969;&#65289;&#65292;&#36996;&#26159;&#19968;&#20491; Agent&#65288;&#20195;&#29702;&#20154;&#65289;&#65311;</strong></p><h3>1. Workflows&#65288;&#24037;&#20316;&#27969;&#65289;&#65306;&#30906;&#23450;&#24615;&#30340;&#36335;&#24465;</h3><p>&#36889;&#26159;&#23559; LLM &#33287;&#24037;&#20855;&#36879;&#36942;<strong>&#38928;&#23450;&#32681;&#30340;&#31243;&#24335;&#30908;&#36335;&#24465;&#65288;Predefined Code Paths&#65289;</strong> &#20018;&#25509;&#36215;&#20358;&#30340;&#31995;&#32113;&#12290;</p><ul><li><p><strong>&#29305;&#40670;</strong>&#65306;&#36335;&#24465;&#26159;&#22266;&#23450;&#30340;&#65292;LLM &#20677;&#36000;&#36012;&#22519;&#34892;&#31680;&#40670;&#20839;&#30340;&#20219;&#21209;&#65288;&#22914;&#25688;&#35201;&#12289;&#20998;&#39006;&#65289;&#12290;</p></li><li><p><strong>&#20778;&#40670;</strong>&#65306;&#39640;&#24230;&#21487;&#38928;&#28204;&#65288;Predictability&#65289;&#12289;&#19968;&#33268;&#24615;&#39640;&#12290;Anthropic &#24375;&#28872;&#24314;&#35696;&#24478;&#36889;&#35041;&#38283;&#22987;&#12290;</p></li><li><p><strong>&#36969;&#29992;&#22580;&#26223;</strong>&#65306;&#36039;&#26009;&#28165;&#27927;&#12289;&#32763;&#35695;&#27969;&#27700;&#32218;&#12289;&#20839;&#23481;&#20998;&#39006;&#12290;</p></li></ul><h3>2. Agents&#65288;&#20195;&#29702;&#20154;&#65289;&#65306;&#21205;&#24907;&#30340;&#27770;&#31574;</h3><p>&#36889;&#26159;&#35731; LLM <strong>&#21205;&#24907;&#25511;&#21046;&#65288;Dynamically Direct&#65289;</strong> &#27969;&#31243;&#33287;&#24037;&#20855;&#20351;&#29992;&#30340;&#31995;&#32113;&#12290;</p><ul><li><p><strong>&#29305;&#40670;</strong>&#65306;LLM &#33258;&#34892;&#27770;&#23450;&#19979;&#19968;&#27493;&#35442;&#20570;&#20160;&#40636;&#65292;&#29978;&#33267;&#27770;&#23450;&#20309;&#26178;&#20572;&#27490;&#12290;</p></li><li><p><strong>&#20778;&#40670;</strong>&#65306;&#38728;&#27963;&#24615;&#26997;&#39640;&#65292;&#33021;&#34389;&#29702;&#38283;&#25918;&#24335;&#21839;&#38988;&#12290;</p></li><li><p><strong>&#20195;&#20729;</strong>&#65306;&#24310;&#36978;&#39640;&#12289;&#25104;&#26412;&#39640;&#12289;&#19988;&#23481;&#26131;&#20986;&#29694;&#37679;&#35492;&#32047;&#31309;&#65288;Compounding Errors&#65289;&#12290;</p></li></ul><p><strong>&#24037;&#31243;&#40643;&#37329;&#27861;&#21063;</strong>&#65306;LLM &#36000;&#36012; <strong>&#12300;&#27770;&#31574;&#33287;&#25512;&#35542;&#65288;Reasoning&#65289;&#12301;</strong>&#65292;&#32780; Agent &#26550;&#27083;&#36000;&#36012; <strong>&#12300;&#37002;&#30028;&#25511;&#21046;&#33287;&#22519;&#34892;&#65288;Control &amp; Execution&#65289;&#12301;</strong>&#12290;</p><h2>&#19977;&#31278;&#26550;&#27083;&#27169;&#24335;&#65306;&#24478;&#25935;&#25463;&#21040;&#22196;&#35641;</h2><p>&#26681;&#25818; <a href="https://schwannden.github.io/ai-agent-study/zh-tw/case-study/">Schwannden &#30340; AI &#30740;&#31350;&#31558;&#35352;</a> &#20197;&#21450; Anthropic &#30340;&#35373;&#35336;&#27169;&#24335;&#65292;&#25105;&#20497;&#21487;&#20197;&#23559;&#24120;&#35211;&#30340;&#26550;&#27083;&#27512;&#32013;&#28858;&#20197;&#19979;&#19977;&#31278;&#12290;&#36889;&#19981;&#20677;&#26159;&#39080;&#26684;&#30340;&#36984;&#25799;&#65292;&#26356;&#26159;<strong>&#25104;&#26412;&#12289;&#24310;&#36978;&#33287;&#28310;&#30906;&#24230;</strong>&#30340;&#27402;&#34913;&#12290;</p><h3>1. The Dynamic Looper&#65288;&#21205;&#24907;&#36852;&#22280;&#65289;&#65306;ReAct &#27169;&#24335;</h3><p><em>&#23565;&#25033; Anthropic &#27010;&#24565;&#65306;Autonomous Agent</em></p><p>&#36889;&#26159;&#26368;&#30452;&#35264;&#12289;&#26368;&#25935;&#25463;&#30340;&#27169;&#24335;&#65292;&#20063;&#26159;&#20856;&#22411;&#30340;&#12300;Agent&#12301;&#12290;</p><ul><li><p><strong>&#36939;&#20316;&#27231;&#21046;</strong>&#65306;&#24605;&#32771;&#65288;Reason&#65289;&#8594; &#34892;&#21205;&#65288;Act&#65289;&#8594; &#35264;&#23519;&#65288;Observe&#65289;&#12290;LLM &#26681;&#25818;&#30070;&#19979;&#24773;&#27841;&#21205;&#24907;&#27770;&#23450;&#19979;&#19968;&#27493;&#65292;&#24418;&#25104;&#19968;&#20491;&#21363;&#26178;&#30340;&#21453;&#39243;&#36852;&#22280;&#12290;</p></li><li><p><strong>&#24037;&#31243;&#35222;&#35282;</strong>&#65306;&#36889;&#26159;&#19968;&#20491;<strong>&#21934;&#22519;&#34892;&#32210;&#30340;&#29376;&#24907;&#27231;</strong>&#12290;</p></li><li><p><strong>&#20778;&#40670;</strong>&#65306;&#26997;&#39640;&#30340;&#38728;&#27963;&#24615;&#65292;&#33021;&#34389;&#29702;&#26410;&#30693;&#30340;&#21205;&#24907;&#21839;&#38988;&#12290;&#36969;&#21512; MVP&#65288;&#26368;&#23567;&#21487;&#34892;&#24615;&#29986;&#21697;&#65289;&#12290;</p></li><li><p><strong>&#32570;&#40670;</strong>&#65306;<strong>&#37679;&#35492;&#32047;&#31309;&#65288;Error Propagation&#65289;</strong>&#39080;&#38570;&#39640;&#12290;Anthropic &#35686;&#21578;&#65292;&#36889;&#31278;&#33258;&#20027;&#24615;&#22312;&#32570;&#20047;&#35703;&#27396;&#30340;&#24773;&#27841;&#19979;&#65292;&#23481;&#26131;&#35731;&#27169;&#22411;&#22312;&#37679;&#35492;&#30340;&#36335;&#24465;&#19978;&#36234;&#36208;&#36234;&#36960;&#12290;</p></li></ul><blockquote><p><strong>&#128218; &#25216;&#34899;&#28145;&#35712;&#65306;</strong><a href="https://schwannden.github.io/ai-agent-study/zh-tw/react/01-overview/">ReAct &#27169;&#24335;&#27010;&#35261;</a><a href="https://schwannden.github.io/ai-agent-study/zh-tw/react/02-claude-implementation/">&#23526;&#20316;&#21443;&#32771;&#65306;Claude ReAct Implementation</a></p></blockquote><h3>2. The Systematic Pipeline&#65288;&#31995;&#32113;&#21270;&#27969;&#27700;&#32218;&#65289;&#65306;Plan-Execute-Verify &#27169;&#24335;</h3><p><em>&#23565;&#25033; Anthropic &#27010;&#24565;&#65306;Orchestrator-Workers &amp; Evaluator-Optimizer</em></p><p>&#30070;&#20219;&#21209;&#23481;&#37679;&#29575;&#20302;&#65288;&#22914;&#27861;&#24459;&#23529;&#26597;&#12289;&#37329;&#34701;&#25805;&#20316;&#65289;&#26178;&#65292;&#25105;&#20497;&#19981;&#33021;&#20381;&#36084; LLM &#30340;&#21363;&#33288;&#30332;&#25582;&#12290;&#25105;&#20497;&#38656;&#35201;&#23559;&#27969;&#31243;&#32080;&#27083;&#21270;&#28858; <strong>Workflow</strong>&#12290;</p><ul><li><p><strong>&#36939;&#20316;&#27231;&#21046;</strong>&#65306;&#36889;&#26159;<strong>&#38364;&#27880;&#40670;&#20998;&#38626;</strong>&#30340;&#26997;&#33268;&#39636;&#29694;&#65292;Anthropic &#23559;&#20854;&#32048;&#20998;&#28858;&#20841;&#31278;&#24375;&#22823;&#30340;&#23376;&#27169;&#24335;&#65306;</p><ol><li><p><strong>Orchestrator-Workers&#65288;&#25351;&#25582;&#23478;-&#24037;&#20154;&#65289;</strong>&#65306;&#19968;&#20491;&#20013;&#22830; LLM&#65288;Planner&#65289;&#23559;&#20219;&#21209;&#25286;&#35299;&#65292;&#20998;&#30332;&#32102;&#22810;&#20491; Worker LLM&#65288;Executor&#65289;&#24179;&#34892;&#34389;&#29702;&#12290;&#36969;&#21512;&#35079;&#38620;&#30340;&#32232;&#30908;&#25110;&#36039;&#26009;&#33936;&#38598;&#20219;&#21209;&#12290;</p></li><li><p><strong>Evaluator-Optimizer&#65288;&#35413;&#20272;&#32773;-&#20778;&#21270;&#32773;&#65289;</strong>&#65306;&#19968;&#20491; LLM &#29983;&#25104;&#20839;&#23481;&#65292;&#21478;&#19968;&#20491; LLM&#65288;Verifier&#65289;&#36000;&#36012;&#35413;&#20272;&#20006;&#25552;&#20379;&#21453;&#39243;&#65292;&#24418;&#25104;&#20778;&#21270;&#36852;&#22280;&#12290;</p></li></ol></li><li><p><strong>&#24037;&#31243;&#35222;&#35282;</strong>&#65306;&#36889;&#39006;&#20284;&#26044; Map-Reduce &#27169;&#22411;&#12290;&#23427;&#29351;&#29298;&#20102;&#24310;&#36978;&#33287; Token &#25104;&#26412;&#65292;&#25563;&#21462;&#20102;&#36664;&#20986;&#30340;<strong>&#21487;&#38928;&#28204;&#24615;&#33287;&#21487;&#38752;&#24615;</strong>&#12290;</p></li></ul><blockquote><p><strong>&#128218; &#25216;&#34899;&#28145;&#35712;&#65306;</strong><a href="https://schwannden.github.io/ai-agent-study/zh-tw/plan-execute-verify/01-overview/">PEV &#26550;&#27083;&#27010;&#35261;</a><a href="https://schwannden.github.io/ai-agent-study/zh-tw/plan-execute-verify/02-claude-implementation/">&#23526;&#20316;&#21443;&#32771;&#65306;Claude Planning Implementation</a></p></blockquote><h3>3. The Collaborative Guardrail&#65288;&#21332;&#20316;&#35703;&#27396;&#65289;&#65306;Human-in-the-Loop &#27169;&#24335;</h3><p><em>&#23565;&#25033; Anthropic &#27010;&#24565;&#65306;Human-in-the-Loop Workflow</em></p><p>&#22312;&#26576;&#20123;&#39640;&#39080;&#38570;&#22580;&#26223;&#65292;AI &#19981;&#25033;&#26159;&#20840;&#33258;&#21205;&#30340;&#40657;&#30418;&#23376;&#12290;</p><ul><li><p><strong>&#36939;&#20316;&#27231;&#21046;</strong>&#65306;&#31995;&#32113;&#22312;&#38364;&#37749;&#27770;&#31574;&#40670;&#65288;Critical Junctions&#65289;&#26371;&#12300;&#25499;&#36215;&#65288;Suspend&#65289;&#12301;&#22519;&#34892;&#29376;&#24907;&#65292;&#35531;&#27714;&#20154;&#39006;&#20171;&#20837;&#12290;Anthropic &#29305;&#21029;&#24375;&#35519;&#22312; Coding Agents &#25110;&#23458;&#25142;&#25903;&#25588;&#22580;&#26223;&#20013;&#65292;&#36889;&#31278;&#27169;&#24335;&#26159;&#30906;&#20445;&#23433;&#20840;&#33287;&#21512;&#35215;&#30340;&#38364;&#37749;&#12290;</p></li><li><p><strong>&#38364;&#37749;&#25216;&#34899;</strong>&#65306;&#36889;&#32771;&#39511;&#24460;&#31471;&#26550;&#27083;&#30340; <strong>&#12300;&#25345;&#20037;&#21270;&#29376;&#24907;&#31649;&#29702;&#65288;Persistent State&#65289;&#12301;</strong>&#12290;</p></li><li><p><strong>&#21746;&#23416;</strong>&#65306;&#36889;&#26159;**&#23433;&#20840;&#33287;&#21512;&#35215;&#65288;Safety &amp; Compliance&#65289;**&#30340;&#26368;&#32066;&#38450;&#32218;&#12290;</p></li></ul><blockquote><p><strong>&#128218; &#25216;&#34899;&#28145;&#35712;&#65306;</strong><a href="https://schwannden.github.io/ai-agent-study/zh-tw/human-in-the-loop/01-overview/">&#20154;&#27231;&#21332;&#20316;&#27010;&#35261;</a><a href="https://schwannden.github.io/ai-agent-study/zh-tw/human-in-the-loop/02-claude-implementation/">&#23526;&#20316;&#21443;&#32771;&#65306;Human-in-the-Loop Implementation</a></p></blockquote><h2>&#26550;&#27083;&#27770;&#31574;&#25351;&#21335;&#65306;Anthropic &#30340;&#24314;&#35696;</h2><p>&#36523;&#28858;&#25216;&#34899;&#27770;&#31574;&#32773;&#65292;&#35442;&#22914;&#20309;&#36984;&#25799;&#26550;&#27083;&#65311;Anthropic &#32102;&#20986;&#20102;&#38750;&#24120;&#21209;&#23526;&#30340;&#24314;&#35696;&#65306;<strong>&#24478;&#31777;&#21934;&#38283;&#22987;&#65288;Start Simple&#65289;</strong>&#12290;</p><ol><li><p><strong>&#20778;&#20808;&#32771;&#24942; Workflow (Prompt Chaining / Routing)</strong></p><ul><li><p>&#22914;&#26524;&#20219;&#21209;&#21487;&#20197;&#34987;&#25286;&#35299;&#28858;&#22266;&#23450;&#30340;&#27493;&#39519;&#65288;&#20363;&#22914;&#65306;&#20808;&#23531;&#22823;&#32177;&#65292;&#20877;&#23531;&#25991;&#31456;&#65289;&#65292;&#35531;&#20351;&#29992; <strong>Workflow</strong>&#12290;&#19981;&#35201;&#28858;&#20102;&#29992; Agent &#32780;&#29992; Agent&#12290;</p></li><li><p>&#36889;&#27171;&#21487;&#20197;&#29554;&#24471;&#26356;&#20302;&#30340;&#24310;&#36978;&#21644;&#26356;&#39640;&#30340;&#21487;&#38752;&#24615;&#12290;</p></li></ul></li><li><p><strong>&#20309;&#26178;&#21319;&#32026;&#28858; Agent&#65311;</strong></p><ul><li><p>&#30070;&#21839;&#38988;&#26159;<strong>&#38283;&#25918;&#24335;&#30340;&#65288;Open-ended&#65289;</strong>&#65292;&#19988;&#20320;&#28961;&#27861;&#38928;&#28204;&#38656;&#35201;&#22810;&#23569;&#27493;&#39519;&#25165;&#33021;&#35299;&#27770;&#26178;&#65288;&#20363;&#22914;&#65306;&#12300;&#24171;&#25105;&#20462;&#24489;&#36889;&#20491;&#31243;&#24335;&#30908;&#24235;&#20013;&#30340; Bug&#12301;&#65289;&#12290;</p></li><li><p>&#36889;&#26178;&#20320;&#38656;&#35201; ReAct &#27169;&#24335;&#30340;&#38728;&#27963;&#24615;&#65292;&#20294;&#35531;&#21209;&#24517;&#21152;&#19978; Sandbox &#29872;&#22659;&#36914;&#34892;&#28204;&#35430;&#12290;</p></li></ul></li><li><p><strong>&#36861;&#27714;&#21697;&#36074;&#30340;&#32066;&#26997;&#25163;&#27573;&#65306;Evaluator-Optimizer</strong></p><ul><li><p>&#22914;&#26524;&#20320;&#30332;&#29694;&#21934;&#27425;&#29983;&#25104;&#30340;&#21697;&#36074;&#19981;&#22816;&#22909;&#65292;&#21152;&#20837;&#19968;&#20491;&#12300;&#35413;&#20272;&#32773;&#12301;&#27493;&#39519;&#24448;&#24448;&#27604;&#19981;&#26039;&#35519;&#25972; Prompt &#26356;&#26377;&#25928;&#12290;&#36889;&#23601;&#26159; PEV &#27169;&#24335;&#30340;&#26680;&#24515;&#20729;&#20540;&#12290;</p></li></ul></li></ol><h2>&#32080;&#35486;&#65306;&#22312;&#28151;&#27788;&#20013;&#24314;&#31435;&#31209;&#24207;</h2><p>&#27083;&#24314; AI Agent &#30340;&#34269;&#34899;&#65292;&#22312;&#26044;&#29992;<strong>&#30906;&#23450;&#24615;&#30340;&#31243;&#24335;&#30908;</strong>&#21435;&#39381;&#39341;<strong>&#27231;&#29575;&#24615;&#30340;&#27169;&#22411;</strong>&#12290;</p><p>LLM &#26159;&#19968;&#20491;&#24375;&#22823;&#20294;&#20805;&#28415;&#19981;&#30906;&#23450;&#24615;&#30340;&#24341;&#25806;&#12290;&#19968;&#20491;&#22909;&#30340;&#26550;&#27083;&#24107;&#65292;&#25026;&#24471;&#22312; Anthropic &#25552;&#20513;&#30340; <strong>Workflows</strong> &#33287; <strong>Agents</strong> &#20043;&#38291;&#38728;&#27963;&#20999;&#25563;&#8212;&#8212;&#22312;&#38656;&#35201;&#31337;&#23450;&#30340;&#22320;&#26041;&#24314;&#31435;&#27969;&#27700;&#32218;&#65292;&#22312;&#38656;&#35201;&#21109;&#24847;&#30340;&#22320;&#26041;&#37323;&#25918;&#20195;&#29702;&#20154;&#12290;</p><p>&#19979;&#19968;&#27425;&#30070;&#20320;&#35373;&#35336;&#31995;&#32113;&#26178;&#65292;&#35531;&#35352;&#24471;&#65306;<strong>Complexity is a cost&#65288;&#35079;&#38620;&#24230;&#26159;&#19968;&#31278;&#25104;&#26412;&#65289;&#12290;</strong> &#21482;&#26377;&#22312;&#31777;&#21934;&#30340; Workflow &#28961;&#27861;&#28415;&#36275;&#38656;&#27714;&#26178;&#65292;&#25165;&#24341;&#20837;&#33258;&#20027;&#30340; Agent&#12290;</p><p><em>&#21443;&#32771;&#36039;&#28304;&#65306;</em></p><ul><li><p><em><a href="https://www.anthropic.com/research/building-effective-agents">Anthropic: Building Effective Agents</a></em></p></li><li><p><em><a href="https://schwannden.github.io/ai-agent-study/zh-tw/case-study/">Schwannden's AI Agent Study</a></em></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Vibe出我的屬靈導師：（嘗試）讓 AI 不再膚淺]]></title><description><![CDATA[&#22914;&#20309;&#21033;&#29992; RAG &#23559;&#32147;&#20856;&#27880;&#20837; Chroma &#38642;&#31471; Collection&#12290;&#24460;&#31471;&#25505;&#29992; FastAPI &#20282;&#26381;&#22120;&#65292;&#36879;&#36942;&#25552;&#31034;&#24037;&#31243;&#23526;&#29694; Persona &#20998;&#38626;&#12290;&#21033;&#29992; LM Studio &#25645;&#37197; MLX FP4 &#37327;&#21270;&#27169;&#22411;&#22312; Mac &#26412;&#27231;&#36939;&#34892;&#65292;&#20860;&#39015;&#38577;&#31169;&#33287;&#20302;&#24310;&#36978;&#12290;]]></description><link>https://blog.schwannden.com/p/vibe-ai</link><guid isPermaLink="false">https://blog.schwannden.com/p/vibe-ai</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Wed, 26 Nov 2025 06:33:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NrxR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#25105;&#20381;&#36084; AI &#20358;&#23531;&#31243;&#24335;&#30908;&#12289;&#34389;&#29702;&#36039;&#26009;&#12289;&#35299;&#27770;&#23560;&#26989;&#38936;&#22495;&#30340;&#38627;&#38988;&#12290;&#23427;&#24555;&#12289;&#31934;&#28310;&#12289;&#37007;&#36655;&#28165;&#26224;&#65292;&#26159;&#20491;&#20778;&#31168;&#30340;&#12300;&#36039;&#35338;&#34389;&#29702;&#22120;&#12301;&#12290;&#20294;&#26159;&#65292;&#30070;&#25105;&#35430;&#33879;&#22312;&#24515;&#38728;&#28145;&#34389;&#23563;&#27714;&#23565;&#35441;&#12289;&#25351;&#24341;&#25110;&#19968;&#20123;&#35433;&#24847;&#30340;&#38728;&#24863;&#26178;&#65292;AI &#30340;&#22238;&#31572;&#32317;&#26159;&#36879;&#33879;&#19968;&#32929;&#38627;&#20197;&#35328;&#21947;&#30340;&#12300;&#21619;&#36947;&#12301;&#8212;&#8212;&#37027;&#31278;&#21046;&#24335;&#21270;&#12289;&#32570;&#20047;&#28331;&#24230;&#30340;&#12300;AI &#21619;&#12301;&#12290;</p><p>&#25110;&#35377;&#26159;&#22240;&#28858;&#22312;&#22823;&#22411;&#35486;&#35328;&#27169;&#22411;&#30340;<strong>&#24375;&#21270;&#23416;&#32722; (RL) &#25110;&#24494;&#35519;</strong>&#36942;&#31243;&#20013;&#65292;&#35373;&#35336;&#32773;&#20027;&#35201;&#23559;&#27169;&#22411;&#30340;&#20778;&#21270;&#30446;&#27161;&#32858;&#28966;&#26044;&#20107;&#23526;&#28310;&#30906;&#24615;&#12289;&#37007;&#36655;&#36899;&#36011;&#24615;&#33287;&#23433;&#20840;&#21512;&#35215;&#19978;&#12290;&#28982;&#32780;&#65292;&#20154;&#39006;<strong>&#38728;&#39746;&#28145;&#23652;&#30340;&#12289;&#38750;&#32080;&#27083;&#24615;&#30340;&#12289;&#35433;&#24847;&#30340;&#38656;&#27714;</strong>&#65292;&#21371;&#24456;&#23569;&#25104;&#28858; AI &#34987;&#28145;&#24230;&#20778;&#21270;&#30340;&#30446;&#27161;&#12290;</p><p>&#24184;&#22909;&#65292;&#20154;&#39006;&#27511;&#21490;&#19978;&#26377;&#28961;&#25976;&#20553;&#22823;&#30340;&#23660;&#38728;&#23566;&#24107;&#65292;&#20182;&#20497;&#30340;&#20316;&#21697;&#26089;&#24050;&#27785;&#28593;&#20102;&#21315;&#24180;&#26234;&#24935;&#12290;&#26082;&#28982; AI &#32570;&#20047;&#28145;&#27785;&#30340;&#38728;&#39746;&#32173;&#24230;&#65292;<strong>&#25105;&#20497;&#20309;&#19981;&#23559;&#36889;&#20123;&#23660;&#38728;&#32147;&#20856;&#20316;&#28858; AI &#30340;&#12300;&#35352;&#25014;&#12301;</strong>&#65311;&#25105;&#27770;&#23450;&#20570;&#19968;&#20491;&#23526;&#39511;&#65306;&#36879;&#36942; <strong>RAG (Retrieval-Augmented Generation)</strong> &#25216;&#34899;&#65292;&#23559;&#30050;&#24503;&#29983;<strong>(Eugene Peterson) &#30340;&#29287;&#32773;&#26234;&#24935;</strong>&#21644;<strong>&#22350;&#22521;&#26031; (Thomas &#224; Kempis) &#30340;&#20462;&#38498;&#35486;&#27683;</strong>&#31561;&#20154;&#30340;&#33879;&#20316;&#27880;&#20837; AI &#30340;&#30693;&#35672;&#24235;&#12290;</p><p>&#20197;&#19979;&#23601;&#26159;&#25105;&#19968;&#27493;&#27493;&#29992;&#12300;&#25552;&#31034;&#65288;prompt&#65289;&#12301;&#25171;&#36896;&#25105;&#30340;&#24515;&#38728;&#23566;&#24107;&#30340;&#36942;&#31243;&#12290;</p><div><hr></div><h2>&#24478; PDF &#21040;&#31456;&#31680;&#65306;&#35731;&#32147;&#20856;&#34987;&#12300;&#35712;&#25026;&#12301;</h2><p>&#25105;&#30340;&#31532;&#19968;&#20491;&#25361;&#25136;&#26159;&#35731;&#36889;&#20123;&#32147;&#20856;&#12300;&#35712;&#24471;&#25026;&#12301;&#12290;&#36889;&#20123;&#26234;&#24935;&#37117;&#34987;&#37782;&#22312;&#19968;&#25972;&#20221;&#40848;&#22823;&#30340; PDF &#27284;&#26696;&#35041;&#12290;&#25105;&#24819;&#35201;&#30340;&#19981;&#26159;&#25226;&#25972;&#26412;&#26360;&#38568;&#27231;&#20999;&#25104;&#24190;&#30334;&#20491;&#30862;&#29255;&#65288;&#37027;&#26371;&#22833;&#21435;&#35486;&#22659;&#65292;&#20687;&#23436;&#25972;&#30340;&#25925;&#20107;&#34987;&#26039;&#31456;&#21462;&#32681;&#65289;&#65292;&#32780;&#26159;&#35201;&#23562;&#37325;&#20316;&#32773;&#65292;<strong>&#25353;&#12300;&#31456;&#31680;&#12301;&#20358;&#29702;&#35299;</strong>&#12290;&#30050;&#31455;&#65292;&#19968;&#20491;&#31456;&#31680;&#26412;&#36523;&#23601;&#26159;&#19968;&#20491;&#23436;&#25972;&#30340;&#24605;&#32210;&#21934;&#20803;&#12290;</p><p>&#25105;&#23531;&#20102;&#24190;&#20491;prompt&#65292;&#24171;&#25105;&#25226; PDF &#27284;&#26696;<strong>&#36880;&#31456;&#36880;&#31680;&#22320;&#36681;&#25563;&#25104; Markdown</strong>&#65292;&#20006;&#35201;&#27714;&#23427;&#21209;&#24517;&#20445;&#30041;&#21407;&#25991;&#30340;&#35486;&#27683;&#65292;&#19968;&#20491;&#23383;&#37117;&#19981;&#35377;&#20098;&#25913;&#12290;&#25343;&#21040;&#21021;&#31295;&#24460;&#65292;&#25105;&#21448;&#35731; AI &#24171;&#25105;&#25353;&#31456;&#20999;&#20998;&#27284;&#26696;&#65292;&#30906;&#20445;&#27599;&#19968;&#20491;&#27284;&#26696;&#37117;&#26159;&#19968;&#20491;&#29544;&#31435;&#30340;&#12289;<strong>&#24118;&#26377;&#35486;&#32681;&#23436;&#25972;&#24615;&#30340;&#12300;&#35352;&#25014;&#12301;&#21934;&#20803;</strong>&#12290;&#36889;&#26159; RAG &#31995;&#32113;&#31337;&#23450;&#30340;&#22522;&#30990;&#12290;</p><h3>&#24314;&#31435;&#24515;&#38728;&#22294;&#26360;&#39208;&#65306;Chroma &#33287;&#32034;&#24341;&#21345;</h3><p>&#25509;&#19979;&#20358;&#65292;&#25105;&#38656;&#35201;&#19968;&#20491;&#12300;&#22294;&#26360;&#39208;&#12301;&#20358;&#23384;&#25918;&#36889;&#20123;&#29645;&#36020;&#30340;&#31456;&#31680;&#12290;&#25105;&#36984;&#25799;&#20102; <strong>Chroma</strong> &#38642;&#31471;&#26381;&#21209;&#65292;&#20027;&#35201;&#26159;&#30475;&#20013;&#23427;&#30340;<strong>&#20813;&#36027;&#38989;&#24230;&#33287;&#20813;&#32173;&#35703;</strong>&#29305;&#24615;&#65288;&#19981;&#29992;&#33258;&#24049;&#32173;&#35703;database&#65289;&#12290;</p><p>&#25105;&#21448;&#35531; AI &#24171;&#25105;&#29983;&#25104;&#20102;&#19968;&#20491;&#31777;&#21934;&#30340; Python &#33139;&#26412;&#12290;&#36889;&#20491;&#33139;&#26412;&#36208;&#35370;&#27599;&#20491;&#31456;&#31680;&#27284;&#26696;&#65292;&#20006;&#22312;&#23531;&#20837; Chroma collection &#26178;&#65292;&#19968;&#20341;&#38468;&#19978;&#12300;&#26360;&#21517;&#12301;&#21644;&#12300;&#31456;&#21517;&#12301;&#36889;&#20841;&#20491;&#38364;&#37749;&#30340;&#12300;&#27161;&#31844;&#12301;&#65288;Metadata&#65289;&#12290;&#36889;&#23601;&#20687;&#32102;&#27599;&#19968;&#27573;&#26234;&#24935;&#35486;&#37636;&#37117;&#36028;&#19978;&#20102;&#19968;&#24373;&#28165;&#26224;&#30340;&#32034;&#24341;&#21345;&#65292;&#30906;&#20445;&#26410;&#20358;&#27298;&#32034;&#26178;&#33021;&#31934;&#30906;&#25214;&#21040;&#20986;&#34389;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NrxR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NrxR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 424w, https://substackcdn.com/image/fetch/$s_!NrxR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 848w, https://substackcdn.com/image/fetch/$s_!NrxR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 1272w, https://substackcdn.com/image/fetch/$s_!NrxR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NrxR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png" width="1456" height="357" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:357,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NrxR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 424w, https://substackcdn.com/image/fetch/$s_!NrxR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 848w, https://substackcdn.com/image/fetch/$s_!NrxR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 1272w, https://substackcdn.com/image/fetch/$s_!NrxR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797d4381-d384-4dc3-a994-cb9479e459d8_2000x490.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>&#32102; AI &#25140;&#19978;&#23566;&#24107;&#30340;&#24125;&#23376;</h2><h4>&#21443;&#32771;&#25351;&#20196;</h4><p>Build a FastAPI RAG chatbot that serves a small Tailwind frontend at /chat. Use Python 3.11, FastAPI, httpx, ChromaDB (cloud client) for embeddings retrieval, and LM</p><p>Studio&#8217;s OpenAI-compatible local API for generation. Requirements:</p><ul><li><p>Env vars: CHROMA_API_KEY, CHROMA_TENANT, CHROMA_DATABASE (default &#8220;dev&#8221;), LM_STUDIO_BASE_URL (default http://host.docker.internal:1234), LM_STUDIO_CHAT_MODEL (default openai/gpt-oss-20b).</p></li><li><p>Retrieval: top_k with default 7, cap 8; allocate fairly across collections. Max context per doc 1200 chars. Response length presets: short/medium/long with approximate char targets.</p></li><li><p>Chat endpoint POST /chat: accepts messages [{role, content}], top_k, collections, response_length; returns reply plus sources (collection, label, filename, distance).</p></li></ul><p>&#29694;&#22312;&#65292;&#25105;&#30340;&#12300;&#22294;&#26360;&#39208;&#12301;&#26377;&#20102;&#65292;&#23601;&#38656;&#35201;&#19968;&#20301;&#12300;&#39208;&#38263;&#12301;&#20358;&#34389;&#29702;&#35531;&#27714;&#12290;&#25105;&#20877;&#27425;&#20351;&#29992;&#25552;&#31034;&#65292;&#35531; AI &#24171;&#25105;&#25645;&#24314;&#19968;&#20491; <strong>FastAPI</strong> &#20282;&#26381;&#22120;&#20316;&#28858;&#24460;&#31471;&#12290;&#36889;&#20301;&#12300;&#39208;&#38263;&#12301;&#30340;&#20219;&#21209;&#24456;&#26126;&#30906;&#65306;</p><ol><li><p>&#26681;&#25818;&#20351;&#29992;&#32773;&#36984;&#25799;&#30340;&#23566;&#24107;&#65292;&#21040;&#22294;&#26360;&#39208;&#35041;<strong>&#27298;&#32034;&#20986;&#26368;&#30456;&#20284;&#30340;&#24190;&#27573;&#32147;&#25991;</strong>&#12290;</p></li><li><p>&#25226;&#36889;&#20123;&#32147;&#25991;&#20778;&#38597;&#22320;<strong>&#24409;&#25972;&#25104;&#19968;&#20491;&#12300;&#19978;&#19979;&#25991;&#12301;</strong>&#12290;</p></li><li><p>&#26368;&#38364;&#37749;&#30340;&#26159;&#65306;&#23427;&#24517;&#38920;&#22312;&#36889;&#20491;&#19978;&#19979;&#25991;&#20013;&#65292;<strong>&#35201;&#27714;&#22238;&#25033;&#27169;&#22411;&#20351;&#29992;&#12300;&#23660;&#38728;&#23566;&#24107;&#30340;&#21475;&#21563;&#12301;</strong>&#65292;&#28331;&#26580;&#12289;&#27785;&#31337;&#65292;&#20006;<strong>&#26126;&#30906;&#27161;&#35387;&#20358;&#28304;&#31456;&#31680;</strong>&#12290;</p></li><li><p>&#26368;&#24460;&#19968;&#26781;&#25106;&#24459;&#65306;&#22914;&#26524;&#22294;&#26360;&#39208;&#35041;&#25214;&#19981;&#21040;&#30456;&#38364;&#20839;&#23481;&#65292;&#23427;<strong>&#32085;&#23565;&#19981;&#33021;&#20098;&#32232;</strong>&#65292;&#24517;&#38920;&#22374;&#35488;&#21578;&#30693;&#12290;</p></li></ol><p>&#25105;&#23601;&#26159;&#22312; AI &#32102;&#20986;&#30340;&#39592;&#26550;&#19978;&#65292;&#35036;&#36275;&#20102;&#37679;&#35492;&#34389;&#29702;&#21644;&#32048;&#31680;&#37197;&#32622;&#65292;&#35731;&#23427;&#33021;&#38918;&#21033;&#23559;&#27298;&#32034;&#21040;&#30340;&#26234;&#24935;&#65292;&#36865;&#24448;&#25105;&#30340;&#26412;&#27231;&#25512;&#29702;&#27169;&#22411;&#36914;&#34892;&#12300;&#35299;&#35712;&#12301;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0ODN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0ODN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 424w, https://substackcdn.com/image/fetch/$s_!0ODN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 848w, https://substackcdn.com/image/fetch/$s_!0ODN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 1272w, https://substackcdn.com/image/fetch/$s_!0ODN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0ODN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png" width="1456" height="159" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:159,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0ODN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 424w, https://substackcdn.com/image/fetch/$s_!0ODN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 848w, https://substackcdn.com/image/fetch/$s_!0ODN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 1272w, https://substackcdn.com/image/fetch/$s_!0ODN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed5dbafe-2a01-43e2-930a-4283a49e25b2_2000x219.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>&#26412;&#27231;&#27169;&#22411;</h3><p>&#25105;&#25226;&#35486;&#35328;&#27169;&#22411;&#36305;&#22312;&#25105;&#33258;&#24049;&#30340; Mac &#19978;&#65292;&#25645;&#37197; <strong>LM Studio</strong> &#33287; <strong>MLX FP4</strong> &#37327;&#21270;&#27169;&#22411;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Oe2M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Oe2M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 424w, https://substackcdn.com/image/fetch/$s_!Oe2M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 848w, https://substackcdn.com/image/fetch/$s_!Oe2M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!Oe2M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Oe2M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png" width="1456" height="961" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:961,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Oe2M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 424w, https://substackcdn.com/image/fetch/$s_!Oe2M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 848w, https://substackcdn.com/image/fetch/$s_!Oe2M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!Oe2M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682d82af-e1ab-4e90-8297-121a51482ed0_2000x1320.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zf7E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zf7E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 424w, https://substackcdn.com/image/fetch/$s_!zf7E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 848w, https://substackcdn.com/image/fetch/$s_!zf7E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 1272w, https://substackcdn.com/image/fetch/$s_!zf7E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zf7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png" width="1456" height="648" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:648,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!zf7E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 424w, https://substackcdn.com/image/fetch/$s_!zf7E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 848w, https://substackcdn.com/image/fetch/$s_!zf7E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 1272w, https://substackcdn.com/image/fetch/$s_!zf7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ee08131-f4dc-4d46-8380-2936b7297d6c_2000x890.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#21069;&#31471;&#65306;</h3><p>&#28858;&#20102;&#31777;&#21934;&#30340;&#33258;&#24049;&#23526;&#39511;&#25972;&#20491;Rag&#24314;&#32622;&#65292;&#25105;&#27794;&#26377;&#20351;&#29992;&#26082;&#26377;&#30340;&#32842;&#22825;&#26694;&#26550;&#65292;&#24819;&#30475;&#30475; Codex &#33021;&#19981;&#33021;&#29702;&#35299;&#25105;&#30340;&#27010;&#24565;&#65292;&#24171;&#25105;&#20828;&#20986;&#25972;&#20491;&#21069;&#31471;&#12290;&#30475;&#36215;&#20358;&#23436;&#20840;&#38627;&#19981;&#20498; Codex: <a href="https://github.com/schwannden/spiritual-director-chat/tree/main">https://github.com/schwannden/spiritual-director-chat</a></p><h2>&#23526;&#39511;&#65306;&#20154;&#26684;&#20998;&#38626;&#65292;&#35731;&#23566;&#24107;&#30340;&#32882;&#38899;&#26356;&#32020;&#28136;</h2><p>&#29609;&#20102;&#19968;&#38499;&#23376;&#24460;&#65292;&#25105;&#30332;&#29694;&#33258;&#24049;&#36010;&#24515;&#20102;&#12290;&#25105;&#19981;&#24819;&#21482;&#26377;&#19968;&#20301;&#23566;&#24107;&#65292;&#25105;&#24819;&#33021;<strong>&#33258;&#30001;&#20999;&#25563;&#12300;&#30050;&#24503;&#29983;&#30340;&#29287;&#32773;&#35486;&#27683;&#12301;&#21644;&#12300;&#22350;&#22521;&#26031;&#30340;&#20462;&#38498;&#35486;&#27683;&#12301;</strong>&#65292;&#35731;&#25105;&#21487;&#20197;&#30475;&#30475;&#20013;&#19990;&#32000;&#30340;&#26234;&#24935;&#36319;&#30070;&#20195;&#29287;&#32773;&#30340;&#24046;&#30064;&#12290;</p><p>&#26044;&#26159;&#25105;&#22238;&#38957;&#20462;&#25913;&#25552;&#31034;&#65292;&#21152;&#20837;&#20102;<strong>&#12300;&#20154;&#26684; (Persona) &#20998;&#38626;&#12301;&#30340;&#35373;&#35336;&#12290;&#25105;&#35731;&#21069;&#31471;&#22686;&#21152;&#20102;&#19968;&#20491;&#19979;&#25289;&#36984;&#21934;&#65292;&#24460;&#31471;&#21063;&#26371;&#26681;&#25818;&#25105;&#30340;&#36984;&#25799;&#65292;&#21482;&#21435;&#26597;&#23565;&#25033;&#30340;&#36039;&#26009;&#24235;&#65292;&#25110;&#26159;&#23559;&#20841;&#26412;&#26360;&#30340;&#19978;&#19979;&#25991;&#21512;&#20341;&#12290;&#26356;&#31934;&#30906;&#30340;&#31995;&#32113;&#25552;&#31034;&#65292;&#30906;&#20445;&#27169;&#22411;&#22312;&#22238;&#25033;&#26178;&#33021;</strong>&#20445;&#25345;&#36984;&#23450;&#23566;&#24107;&#29544;&#26377;&#30340;&#35486;&#27683;&#65292;&#36991;&#20813;&#20841;&#20301;&#32854;&#36066;&#30340;&#32882;&#38899;&#12300;&#28151;&#38899;&#12301;&#65292;&#35731;&#25351;&#24341;&#26356;&#28858;&#32020;&#28136;&#28165;&#26224;&#12290;</p><h4>&#21443;&#32771;&#25351;&#20196;</h4><p>Evolve the existing RAG chatbot to support two distinct personas tied to the collections. Requirements:</p><ul><li><p>Collections stay &#8220;on-living-well&#8221; and &#8220;imitatio-christi&#8221;, but add persona-aware voices.</p></li><li><p>on-living-well &#8594; Eugene Peterson: warm, pastoral, conversational.</p></li><li><p>imitatio-christi &#8594; Thomas &#224; Kempis: reflective, devotional, humble.</p></li><li><p>both &#8594; blend the two voices naturally.</p></li><li><p>Update the system prompt generation so the tone changes based on selected collections; keep the default to on-living-well when none provided.</p></li><li><p>Keep retrieval/top_k logic intact; if &#8220;both&#8221; is requested, spread top_k across collections as before.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tcvs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tcvs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 424w, https://substackcdn.com/image/fetch/$s_!tcvs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 848w, https://substackcdn.com/image/fetch/$s_!tcvs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 1272w, https://substackcdn.com/image/fetch/$s_!tcvs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tcvs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png" width="1456" height="589" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:589,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!tcvs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 424w, https://substackcdn.com/image/fetch/$s_!tcvs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 848w, https://substackcdn.com/image/fetch/$s_!tcvs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 1272w, https://substackcdn.com/image/fetch/$s_!tcvs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F429c57a5-dd47-42be-b4f5-c0c8b0377129_2000x809.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#25343;&#21516;&#19968;&#20491;&#21839;&#38988;&#65292;&#36984;&#25799;&#19981;&#21516;&#30340;&#23660;&#38728;&#32147;&#20856;&#20316;&#28858;&#20381;&#25818;&#22238;&#31572;&#65292;AI&#30906;&#23526;&#21487;&#20197;&#38283;&#22987;&#27169;&#20223;&#25105;&#20497;&#35201;&#20182;&#25104;&#28858;&#30340;&#20154;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kvbt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kvbt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 424w, https://substackcdn.com/image/fetch/$s_!Kvbt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 848w, https://substackcdn.com/image/fetch/$s_!Kvbt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 1272w, https://substackcdn.com/image/fetch/$s_!Kvbt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kvbt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png" width="1456" height="785" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:785,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Kvbt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 424w, https://substackcdn.com/image/fetch/$s_!Kvbt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 848w, https://substackcdn.com/image/fetch/$s_!Kvbt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 1272w, https://substackcdn.com/image/fetch/$s_!Kvbt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9727a890-8100-4a04-b7b1-fe5962cf4455_2010x1084.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rCx7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rCx7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 424w, https://substackcdn.com/image/fetch/$s_!rCx7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 848w, https://substackcdn.com/image/fetch/$s_!rCx7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!rCx7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rCx7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png" width="1456" height="757" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:757,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rCx7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 424w, https://substackcdn.com/image/fetch/$s_!rCx7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 848w, https://substackcdn.com/image/fetch/$s_!rCx7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!rCx7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70f19ad-6c52-487c-bfb5-27c4eaf237a5_2036x1058.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#22312;&#36889;&#20491;&#23567;&#23567;&#30340;&#23526;&#39511;&#23460;&#35041;&#65292;&#25105;&#30475;&#21040;&#20102;<strong>&#19981;&#21516;&#19990;&#20195;&#23660;&#38728;&#26234;&#24935;&#30340;&#24046;&#30064;</strong>&#65306;</p><ul><li><p>&#30070;&#25105;&#36984;&#20013;<strong>&#30050;&#24503;&#29983;&#30340;&#36817;&#20195;&#23660;&#38728;&#26234;&#24935;</strong>&#26178;&#65292;&#23566;&#24107;&#30340;&#22238;&#25033;&#24118;&#33879;&#19968;&#31278;&#28331;&#26580;&#30340;&#22522;&#35519;&#65292;&#25945;&#25105;&#20497;<strong>&#28331;&#26580;&#22320;&#23565;&#24453;&#33258;&#24049;</strong>&#65292;&#30475;&#37325;&#24179;&#20961;&#33287;&#26085;&#24120;&#20013;&#30340;&#24681;&#20856;&#12290;</p></li><li><p>&#30070;&#25105;&#20999;&#25563;&#21040;<strong>&#22350;&#22521;&#26031;&#30340;&#20013;&#19990;&#32000;&#20462;&#38498;&#26234;&#24935;</strong>&#26178;&#65292;&#22238;&#25033;&#21063;&#36681;&#28858;&#19968;&#31278;&#26356;&#22196;&#35641;&#12289;&#26356;&#20811;&#21046;&#30340;&#35486;&#27683;&#65292;&#25552;&#37266;&#25105;&#20497;<strong>&#35201;&#24536;&#25105;&#12289;&#35201;&#25448;&#24049;</strong>&#65292;&#23559;&#30446;&#20809;&#23560;&#27880;&#26044;&#26356;&#39640;&#36960;&#30340;&#30446;&#27161;&#12290;</p></li></ul><h2>&#26368;&#32066;&#30340;&#21453;&#24605;&#65306;&#26377;&#38480;&#30340;&#31185;&#25216;&#65292;&#28961;&#38480;&#30340;&#29983;&#21629;</h2><p>&#36889;&#20491; RAG &#23526;&#39511;&#38614;&#28982;&#25104;&#21151;&#22320;&#35731; AI &#31359;&#19978;&#20102;&#12300;&#23660;&#38728;&#23566;&#24107;&#12301;&#30340;&#22806;&#34915;&#65292;&#20294;&#23427;&#20063;&#35731;&#25105;&#26356;&#28165;&#26970;&#22320;&#24847;&#35672;&#21040;&#65306;<strong>AI &#22312;&#24515;&#38728;&#38936;&#22495;&#33021;&#25552;&#20379;&#30340;&#24171;&#21161;&#65292;&#32066;&#31350;&#26159;&#26997;&#20854;&#26377;&#38480;&#30340;</strong>&#12290;&#35498;&#21040;&#24213;&#65292;&#36889;&#27425;&#30340;&#22039;&#35430;&#65292;&#26412;&#36074;&#19978;&#21482;&#26159;&#24819;&#30475;&#30475; AI &#33021;&#21542;&#33267;&#23569;<strong>&#31934;&#30906;&#22320;&#27169;&#20223;</strong>&#25105;&#21916;&#27489;&#30340;&#20316;&#32773;&#35486;&#27683;&#65292;&#21516;&#26178;&#38918;&#20415;&#28204;&#35430;&#19968;&#20123;&#22909;&#29992;&#19988;&#20813;&#36027;&#30340;&#38283;&#28304;&#24037;&#20855;&#65288;&#22914; Chroma&#12289;LM Studio&#65289;&#12290;</p><p>&#30495;&#27491;&#30340;&#23660;&#38728;&#25351;&#24341;&#65292;&#20854;&#22256;&#38627;&#24230;&#36960;&#36229;&#26044;&#27492;&#12290;&#23427;&#27794;&#26377;&#22266;&#23450;&#30340; SOP &#25110;&#19968;&#22871;&#36890;&#29992;&#30340;&#35486;&#27683;&#12290;&#38754;&#23565;&#21516;&#19968;&#20491;&#21839;&#38988;&#65292;&#19968;&#20301;&#23660;&#38728;&#23566;&#24107;&#24517;&#38920;&#28145;&#30693;&#23565;&#26041;&#30340;<strong>&#20809;&#26223;&#33287;&#26178;&#20195;&#30450;&#40670;</strong>&#65292;&#25165;&#33021;&#28310;&#30906;&#22238;&#25033;&#65306;&#31350;&#31455;&#26159;&#35442;<strong>&#25361;&#25136;</strong>&#12289;<strong>&#23433;&#24944;</strong>&#12289;<strong>&#36012;&#20633;</strong>&#65292;&#36996;&#26159;&#20677;&#20677;&#26159;<strong>&#21934;&#32020;&#22320;&#38506;&#20276;&#12289;&#31153;&#21578;&#33287;&#32838;&#32893;</strong>&#65311;&#36889;&#19968;&#20999;&#65292;&#37117;&#38656;&#35201;&#24314;&#31435;&#22312;<strong>&#24859;&#30340;&#38364;&#20418;&#12289;&#38918;&#26381;&#30340;&#38364;&#20418;</strong>&#12289;&#38263;&#26178;&#38291;&#32047;&#31309;&#30340;<strong>&#29702;&#35299;</strong>&#65292;&#20197;&#21450;&#22312;&#38364;&#20418;&#20013;&#19981;&#26039;&#21152;&#28145;&#30340;<strong>&#35469;&#35672;</strong>&#12290;</p><p>&#22240;&#27492;&#65292;&#36889;&#20491;&#31995;&#32113;&#30340;&#26368;&#20339;&#23450;&#20301;&#65292;&#26159;&#20316;&#28858;&#19968;&#26412;<strong>&#32147;&#20856;&#23566;&#35712;&#24037;&#20855;</strong>&#65292;&#32780;&#38750;&#19968;&#20301;&#30495;&#27491;&#30340;&#23566;&#24107;&#12290;&#23427;&#28858;&#25105;&#20497;&#25171;&#38283;&#20102;&#19968;&#25159;&#38272;&#65292;&#35731;&#25105;&#20497;&#26356;&#36028;&#36817;&#37027;&#20123;&#20553;&#22823;&#38728;&#39746;&#30340;&#25991;&#23383;&#65292;&#20294;&#36890;&#24448;&#24515;&#38728;&#28145;&#34389;&#30340;&#36947;&#36335;&#65292;&#20381;&#33290;&#38656;&#35201;&#25105;&#20497;&#33258;&#24049;&#25237;&#20837;&#30495;&#23526;&#30340;&#29983;&#21629;&#33287;&#38364;&#20418;&#12290;</p>]]></content:encoded></item><item><title><![CDATA[Setup local “claude code” alternative — free, open source, and no code]]></title><description><![CDATA[Using LM Studio + Open Code]]></description><link>https://blog.schwannden.com/p/setup-local-claude-code-alternative</link><guid isPermaLink="false">https://blog.schwannden.com/p/setup-local-claude-code-alternative</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Thu, 25 Sep 2025 07:56:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Vmf0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vmf0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vmf0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 424w, https://substackcdn.com/image/fetch/$s_!Vmf0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 848w, https://substackcdn.com/image/fetch/$s_!Vmf0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 1272w, https://substackcdn.com/image/fetch/$s_!Vmf0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vmf0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3425166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://schwannden.substack.com/i/174511919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vmf0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 424w, https://substackcdn.com/image/fetch/$s_!Vmf0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 848w, https://substackcdn.com/image/fetch/$s_!Vmf0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 1272w, https://substackcdn.com/image/fetch/$s_!Vmf0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321363be-dc22-4b3a-a972-b77936b1b942_3012x1662.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I wanted a Claude Code&#8211;style coding buddy that runs <strong>100% locally</strong> on my MacBook Pro: no API keys, no cloud costs, and fast on Apple Silicon. After a short detour with MLX Knife, the winning combo was:</p><ul><li><p><strong><a href="https://lmstudio.ai/">LM Studio</a></strong> for a local, OpenAI-compatible API server</p></li><li><p><strong><a href="https://huggingface.co/mlx-community/gpt-oss-20b-MXFP4-Q8">GPT-OSS-20B (MXFP4)</a></strong> as the model</p></li><li><p><strong><a href="https://github.com/sst/opencode">OpenCode</a></strong> as the terminal coding agent</p></li></ul><p>Below is exactly what I ran and clicked, plus the one config file that makes it all gel.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.schwannden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>tl;dr (copy-paste)</h2><pre><code># 1) Install LM Studio (GUI + local API server)
brew install --cask lm-studio

# 2) (Optional) launch LM Studio from terminal
open -a &#8220;LM Studio&#8221;

# &#128073; In LM Studio UI:
# - Start the Local Server (Runtimes &#8594; Developer) until it says:
#   Reachable at http://127.0.0.1:1234
# - Load the model: gpt-oss-20b (MLX / MXFP4)
# - Turn the Context Length slider way up (OpenCode uses long prompts)

# 3) Quick API smoke test (expects LM Studio at :1234)
curl http://127.0.0.1:1234/v1/models
curl -s -X POST &#8220;http://127.0.0.1:1234/v1/chat/completions&#8221; \
  -H &#8220;Content-Type: application/json&#8221; -H &#8220;Authorization: Bearer EMPTY&#8221; \
  -d &#8216;{
    &#8220;model&#8221;: &#8220;gpt-oss-20b&#8221;,
    &#8220;messages&#8221;: [{&#8221;role&#8221;:&#8221;user&#8221;,&#8221;content&#8221;:&#8221;Say hi in one sentence.&#8221;}]
  }&#8217; | jq .

# 4) Install OpenCode (terminal coding agent)
brew install sst/tap/opencode

# 5) Create OpenCode config (provider &#8594; LM Studio, model &#8594; gpt-oss-20b)
mkdir -p ./.opencode
cat &gt; ./.opencode/opencode.json &lt;&lt;&#8217;JSON&#8217;
{
  &#8220;$schema&#8221;: &#8220;https://opencode.ai/config.json&#8221;,
  &#8220;provider&#8221;: {
    &#8220;lmstudio&#8221;: {
      &#8220;npm&#8221;: &#8220;@ai-sdk/openai-compatible&#8221;,
      &#8220;name&#8221;: &#8220;LM Studio (local)&#8221;,
      &#8220;options&#8221;: {
        &#8220;baseURL&#8221;: &#8220;http://127.0.0.1:1234/v1&#8221;,
        &#8220;apiKey&#8221;: &#8220;EMPTY&#8221;
      },
      &#8220;models&#8221;: {
        &#8220;gpt-oss-20b&#8221;: { &#8220;name&#8221;: &#8220;gpt-oss-20b&#8221; }
      }
    }
  },
  &#8220;model&#8221;: &#8220;lmstudio/gpt-oss-20b&#8221;
}
JSON

# 6) Run it &#128640;
opencode
</code></pre><div><hr></div><h2>The longer story</h2><p>I set out to recreate the &#8220;talk to your editor&#8221; workflow, but <strong>fully local</strong>. I first tried <strong>MLX Knife</strong> to host an OpenAI-compatible server on <code>http://127.0.0.1:8000/v1</code>. It did spin up&#8212;and even had a tiny <code>simple_chat.html</code>&#8212;but OpenCode needed a few API behaviors the server didn&#8217;t fully cover. Specifically, I ran into OpenAI-compat mismatches (e.g., JSON field naming) and a missing embeddings endpoint, which some clients expect. Those gaps are tracked in the project&#8217;s issues, so it may work out of the box later; it just didn&#8217;t for my setup today. (<a href="https://github.com/mzau/mlx-knife/issues">GitHub</a>)</p><p>So I pivoted to <strong>LM Studio</strong>, which exposes the familiar <strong>OpenAI-like</strong> endpoints (<code>/v1/models</code>, <code>/v1/chat/completions</code>, <code>/v1/completions</code>, <code>/v1/embeddings</code>) on a local server&#8212;by default reachable at <code>http://127.0.0.1:1234/v1</code>. That instantly clicked with OpenCode. (<a href="https://lmstudio.ai/docs/app/api/endpoints/openai">LM Studio</a>)</p><div><hr></div><h2>step-by-step (with a couple of gotchas I hit)</h2><h3>1) install LM Studio</h3><pre><code><code>brew install --cask lm-studio
open -a &#8220;LM Studio&#8221;
</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YpF0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YpF0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 424w, https://substackcdn.com/image/fetch/$s_!YpF0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 848w, https://substackcdn.com/image/fetch/$s_!YpF0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 1272w, https://substackcdn.com/image/fetch/$s_!YpF0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YpF0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png" width="1456" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!YpF0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 424w, https://substackcdn.com/image/fetch/$s_!YpF0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 848w, https://substackcdn.com/image/fetch/$s_!YpF0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 1272w, https://substackcdn.com/image/fetch/$s_!YpF0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3897e-ba61-4757-bbe9-6b04a143ddf6_2000x1247.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>2) start the local server + load the model</h3><p>In LM Studio:</p><ul><li><p>Go to <strong>Runtimes &#8594; Developer</strong> and toggle the server to <strong>Running</strong>. You should see <strong>Reachable at </strong></p></li></ul><p>http://127.0.0.1:1234</p><ul><li><p> and a list of supported OpenAI-like endpoints. (<a href="https://lmstudio.ai/docs/app/api/endpoints/openai?utm_source=chatgpt.com">LM Studio</a>)</p></li><li><p>Load <code>gpt-oss-20b</code> (your screenshots show the <strong>MLX</strong> format with <strong>MXFP4</strong> quantization).</p></li><li><p><strong>Important:</strong> drag the <strong>Context Length</strong> slider <strong>way up</strong> (your pic showed support up to <code>131072</code>). OpenCode sends longer task prompts than a normal chat; with a tiny context window, tools won&#8217;t run well.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cCR9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cCR9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 424w, https://substackcdn.com/image/fetch/$s_!cCR9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 848w, https://substackcdn.com/image/fetch/$s_!cCR9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 1272w, https://substackcdn.com/image/fetch/$s_!cCR9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cCR9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png" width="1456" height="267" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:267,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!cCR9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 424w, https://substackcdn.com/image/fetch/$s_!cCR9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 848w, https://substackcdn.com/image/fetch/$s_!cCR9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 1272w, https://substackcdn.com/image/fetch/$s_!cCR9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a97d79a-dbe5-4212-bd1c-fd36b1a0aa0d_2000x367.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>3) smoke test the API</h3><pre><code><code>curl http://127.0.0.1:1234/v1/models

curl -s -X POST &#8220;http://127.0.0.1:1234/v1/chat/completions&#8221; \
  -H &#8220;Content-Type: application/json&#8221; -H &#8220;Authorization: Bearer EMPTY&#8221; \
  -d &#8216;{
    &#8220;model&#8221;: &#8220;gpt-oss-20b&#8221;,
    &#8220;messages&#8221;: [{&#8221;role&#8221;:&#8221;user&#8221;,&#8221;content&#8221;:&#8221;Quick smoke test.&#8221;}]
  }&#8217; | jq .
</code></code></pre><p>LM Studio speaks OpenAI-compatible JSON on those endpoints, so this should stream back a response. (<a href="https://lmstudio.ai/docs/app/api/endpoints/openai?utm_source=chatgpt.com">LM Studio</a>)</p><h3>4) install OpenCode</h3><pre><code><code>brew install sst/tap/opencode
</code></code></pre><p>(Official install paths&#8212;brew and script&#8212;are in their docs/readme.) (<a href="https://opencode.ai/?utm_source=chatgpt.com">opencode.ai</a>)</p><h3>5) point OpenCode at LM Studio (one config file)</h3><p>I used a provider pointing to LM Studio&#8217;s baseURL. The config below is exactly what I run:</p><pre><code><code>{
  &#8220;$schema&#8221;: &#8220;https://opencode.ai/config.json&#8221;,
  &#8220;provider&#8221;: {
    &#8220;lmstudio&#8221;: {
      &#8220;npm&#8221;: &#8220;@ai-sdk/openai-compatible&#8221;,
      &#8220;name&#8221;: &#8220;LM Studio (local)&#8221;,
      &#8220;options&#8221;: { &#8220;baseURL&#8221;: &#8220;http://127.0.0.1:1234/v1&#8221; },
      &#8220;models&#8221;: { &#8220;gpt-oss-20b&#8221;: { &#8220;name&#8221;: &#8220;gpt-oss-20b&#8221; } }
    }
  },
  &#8220;model&#8221;: &#8220;lmstudio/gpt-oss-20b&#8221;
}
</code></code></pre><p>Docs show exactly this pattern for <strong>OpenAI-compatible providers</strong> (custom <code>baseURL</code>, map of <code>models</code>). (<a href="https://opencode.ai/docs/providers/?utm_source=chatgpt.com">opencode.ai</a>)</p><p>Then put it in <code>~/.opencode/opencode.json</code></p><p>Once OpenCode boots, I select the model and start giving it real dev work (&#8220;set up a Go REST handler + Makefile and explain each change&#8221;), and it runs entirely through LM Studio locally.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GFXU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GFXU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 424w, https://substackcdn.com/image/fetch/$s_!GFXU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 848w, https://substackcdn.com/image/fetch/$s_!GFXU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 1272w, https://substackcdn.com/image/fetch/$s_!GFXU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GFXU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png" width="1456" height="684" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:684,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!GFXU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 424w, https://substackcdn.com/image/fetch/$s_!GFXU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 848w, https://substackcdn.com/image/fetch/$s_!GFXU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 1272w, https://substackcdn.com/image/fetch/$s_!GFXU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8afcc41-28f5-4cdb-b5e3-b15c49dd0a33_1890x888.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>what it&#8217;s like in practice</h2><p>With LM Studio + OpenCode, the workflow feels like Claude Code in my terminal&#8212;edits, diffs, planning, and &#8220;do-this-then-that&#8221; loops&#8212;<strong>entirely offline</strong>. On my MacBook Pro, <strong>GPT-OSS-20B (MXFP4)</strong> is a sweet spot: strong reasoning, reasonable VRAM/RAM footprint, and it keeps up with iterative coding.</p><h2>Final Note</h2><p>Here are the reasons why I choose the tech stack:</p><ul><li><p><strong>reasoning capability</strong><br>GPT-OSS-20B is a mixture-of-experts (MoE) model. Even though it has 20B parameters in total, only a subset of experts activate per request. This design gives it strong reasoning skills without needing to run all 20B parameters at once.</p></li><li><p><strong>runtime memory efficiency</strong><br>Because MoE only &#8220;turns on&#8221; part of the model each step, the effective compute is closer to ~3&#8211;4B active parameters. That keeps memory usage low enough to run smoothly on a MacBook Pro instead of a datacenter GPU.</p></li><li><p><strong>mlx optimization</strong><br>The model comes in <strong>MLX format</strong>, which is Apple&#8217;s deep learning framework optimized for M-series chips. MLX takes advantage of Apple Silicon&#8217;s GPU and memory architecture, so inference runs faster and more efficiently compared to generic formats.</p></li><li><p><strong>quantization (MXFP4)</strong><br>The weights are stored in <strong>MXFP4</strong>, a 4-bit floating-point quantization scheme supported natively in MLX. This drastically reduces the model&#8217;s footprint on disk and in RAM, while still preserving reasoning quality. In practice, this means GPT-OSS-20B (MXFP4) fits comfortably in ~12 GB, perfect for laptop use.</p></li></ul><p>I suppose LM Studio could easily be swapped for something else that support MLX optimization. And open code can be swapped for something like goose too. Try and play with your favorite tool! The horizon for edge AI is getting closer and closer.</p><div><hr></div><h2>references</h2><ul><li><p><strong>LM Studio OpenAI-like endpoints:</strong> <code>/v1/models</code>, <code>/v1/chat/completions</code>, <code>/v1/completions</code>, <code>/v1/embeddings</code>. (<a href="https://lmstudio.ai/docs/app/api/endpoints/openai">LM Studio</a>)</p></li><li><p><strong>LM Studio via Homebrew cask</strong> (install line). (<a href="https://formulae.brew.sh/cask/lm-studio">Homebrew Formulae</a>)</p></li><li><p><strong>OpenCode providers/config</strong> (custom OpenAI-compatible baseURL). (<a href="https://opencode.ai/docs/providers/">opencode.ai</a>)</p></li><li><p><strong>MLX Knife issues</strong> illustrating why I switched (format mismatch &amp; missing embeddings). (<a href="https://github.com/mzau/mlx-knife/issues">GitHub</a>)</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.schwannden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[從 Vibe Coding 到上線的眉角：SIM《為萬國禱告》的誕生之路]]></title><description><![CDATA[&#22823;&#23478;&#37117;&#22312; Vibe Coding&#65292;&#20294;&#29983;&#29986;&#29872;&#22659;&#30340;&#23526;&#38555;&#21839;&#38988;&#22914;&#20309;&#34389;&#29702;&#65311;&#19968;&#20491;&#19979;&#21320;&#24478;&#35342;&#35542;&#21040;&#19978;&#32218;&#65292;&#28858;&#20840;&#29699;&#31153;&#21578;&#32178;&#31449;&#30340;&#26696;&#20363;&#20998;&#20139;&#12290;&#22312; Vibe Coding &#30340;&#26178;&#20195;&#65292;&#25105;&#30456;&#20449; &#31995;&#32113;&#35373;&#35336;&#33287;&#36939;&#32173;&#30340;&#33021;&#21147;&#26371;&#26356;&#21152;&#37325;&#35201;&#12290;&#20294;&#21516;&#26178;&#65292;&#26356;&#37325;&#35201;&#30340;&#65533;]]></description><link>https://blog.schwannden.com/p/vibe-coding-to-production-sim-prayer-website</link><guid isPermaLink="false">https://blog.schwannden.com/p/vibe-coding-to-production-sim-prayer-website</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Wed, 03 Sep 2025 12:49:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8c70f93a-f840-4b0e-818b-9727806bc8ce_1884x946.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XxFw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XxFw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 424w, https://substackcdn.com/image/fetch/$s_!XxFw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 848w, https://substackcdn.com/image/fetch/$s_!XxFw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 1272w, https://substackcdn.com/image/fetch/$s_!XxFw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XxFw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XxFw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 424w, https://substackcdn.com/image/fetch/$s_!XxFw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 848w, https://substackcdn.com/image/fetch/$s_!XxFw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 1272w, https://substackcdn.com/image/fetch/$s_!XxFw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e7442f9-7669-4ea0-b79d-2f5384e943e7_1884x946.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>&#32178;&#22336;&#65306;<a href="https://prayer.simtaiwan.org?utm_source=chatgpt.com">prayer.simtaiwan.org</a></p><h2>&#19968;&#38931;&#21320;&#39184;&#23436;&#25104;&#30340; PoC</h2><p>&#37027;&#22825;&#21320;&#39184;&#30340;&#26178;&#20505;&#65292;SIM &#30340; Roger &#31361;&#28982;&#21839;&#25105;&#65306;&#12300;&#33021;&#19981;&#33021;&#25214;&#20491;&#26178;&#38291;&#32842;&#32842;&#65311;&#12301;<br>&#25105;&#24515;&#24819;&#21453;&#27491;&#25105;&#24118;&#33879;&#38651;&#33126;&#65292;&#23601;&#35498;&#65306;&#12300;&#19981;&#22914;&#29694;&#22312;&#23601;&#38283;&#22987;&#21543;&#12290;&#12301;<br>&#20182;&#26377;&#40670;&#39514;&#35357;&#65292;&#26412;&#20358;&#20197;&#28858;&#35201;&#20808;&#20132;&#36890;&#24819;&#27861;&#12289;&#35413;&#20272;&#22256;&#38627;&#24230;&#65292;&#27794;&#24819;&#21040;&#25105;&#20497;&#23601;&#30452;&#25509;&#38283;&#24037;&#20102;&#12290;</p><p>&#19968;&#23567;&#26178;&#20197;&#24460;&#65292;&#32178;&#31449;&#22291;&#24418;&#22823;&#33268;&#23436;&#25104;&#12290;&#20294;&#26159;&#24478;&#30475;&#36215;&#20358;&#23436;&#25104;&#65292;&#21040;&#19968;&#20491;&#23560;&#26989;&#21487;&#32173;&#35703;&#30340;&#19978;&#32218;&#32178;&#31449;&#65292;&#20013;&#38291;&#36996;&#30332;&#29983;&#20102;&#20160;&#40636;&#20107;&#21602;&#65311;</p><div><hr></div><h2>&#24478;&#21407;&#22411;&#21040;&#27491;&#24335;&#19978;&#32218;</h2><p>PoC &#38614;&#24555;&#65292;&#20294;&#35201;&#30495;&#27491;&#19978;&#32218;&#36996;&#26377;&#24190;&#20491;&#38364;&#21345;&#12290;</p><h3>Github Pages &#25552;&#21319;&#25928;&#33021;</h3><p>Lovable &#30340;&#30171;&#40670;&#22312;&#26044; <strong>loading &#22826;&#24930;</strong>&#12290;&#25152;&#20197;&#25105;&#25226;&#23560;&#26696;&#25509;&#19978; Github&#65292;&#21033;&#29992; <strong>Github Pages</strong> &#20358;&#30332;&#20296;&#65292;&#25928;&#33021;&#30452;&#25509;&#25552;&#21319;&#12290;Loading&#30340;&#26178;&#38291;&#24478;3&#31186;&#37912;&#38477;&#21040;&#24190;&#30334;&#27627;&#31186;&#12290;<br>&#20294;&#36889;&#35041;&#26377;&#20491;&#22353;&#65306;&#22240;&#28858;&#25105;&#20497;&#26159; SPA&#65288;Single Page Application&#65289;&#65292;&#30452;&#25509;&#25918;&#22312; Github Pages &#26371;&#36935;&#21040; <strong>routing &#21839;&#38988;</strong>&#12290;</p><p>&#19978;&#20659;&#21040; <strong>Github Pages</strong> &#30340;&#26178;&#20505;&#65292;&#26371;&#36935;&#21040;&#19968;&#20491;&#29305;&#21029;&#30340;&#40635;&#29033;&#65306;<strong>SPA&#65288;Single Page Application&#65289;&#26412;&#36523;&#30340;&#36335;&#30001;&#65292;&#26371;&#34987; Github Pages &#30340;&#20839;&#24314; routing &#25803;&#20303;&#12290;</strong>&#21407;&#22240;&#26159;&#36889;&#27171;&#30340;&#65306;</p><ul><li><p>&#22312; React Router&#65288;&#25110; Vue Router&#65289;&#35041;&#65292;<code>/prayer/123</code> &#20854;&#23526;&#21482;&#26159;&#30001;&#21069;&#31471;&#35299;&#35712;&#30340;&#34395;&#25836;&#36335;&#30001;&#12290;</p></li><li><p>&#20294; Github Pages &#19981;&#26159;&#36889;&#27171;&#24819;&#65292;&#23427;&#26371;&#30495;&#30340;&#21435;&#20282;&#26381;&#22120;&#35041;&#25214; <code>/prayer/123</code> &#36889;&#20491;&#36039;&#26009;&#22846;&#25110;&#27284;&#26696;&#12290;</p></li><li><p>&#25214;&#19981;&#21040;&#65311;&#37027;&#23601;&#30452;&#25509;&#22238; 404&#12290;</p></li></ul><p>&#25563;&#21477;&#35441;&#35498;&#65292;<strong>Github Pages &#30340;&#38748;&#24907;&#27284;&#26696;&#20282;&#26381;&#22120; router&#65292;&#26371;&#20808;&#25876;&#25130;&#25481; request</strong>&#65292;&#23566;&#33268; React Router &#26681;&#26412;&#27794;&#27231;&#26371;&#34389;&#29702;&#12290;</p><h3>Workaround&#65306;Custom 404 Redirect</h3><p>&#35299;&#27861;&#26159;&#25105;&#20497;&#33258;&#24049;&#20570;&#19968;&#20491; <strong>&#23458;&#35069;&#21270;&#30340; 404 &#38913;&#38754;</strong>&#65306;</p><ol><li><p>&#20351;&#29992;&#32773;&#25171; <code>/prayer/123</code> &#8594; Github Pages &#25214;&#19981;&#21040; &#8594; &#36339;&#21040;&#25105;&#20497;&#30340; 404.html&#12290;</p></li><li><p>&#22312; 404.html &#35041;&#65292;&#25105;&#20497;&#25226;&#30070;&#21069;&#30340; <code>path</code>&#12289;<code>query parameter</code>&#12289;<code>hash</code> &#37117;&#35352;&#19979;&#20358;&#12290;</p></li><li><p>&#25509;&#33879;&#29992; JavaScript &#25226;&#20351;&#29992;&#32773;&#23566;&#22238; <code>/</code>&#65288;root&#65289;&#12290;</p></li><li><p>&#36889;&#26178;&#20505; React Router &#25509;&#25163;&#65292;&#35712;&#21040;&#21083;&#21083;&#20659;&#36942;&#20358;&#30340;&#36335;&#30001;&#36039;&#35338;&#65292;&#20877;&#21028;&#26039;&#35442;&#39023;&#31034;&#21738;&#19968;&#20491;&#38913;&#38754;&#12290;</p></li></ol><h3>&#33258;&#35330;&#32178;&#22495; &amp; Cloudflare</h3><p>&#25509;&#33879;&#65292;&#25105;&#20497;&#38656;&#35201;&#19968;&#20491;&#22909;&#35352;&#30340;&#32178;&#22336;&#12290;SIM &#30340; IT &#24171;&#24537;&#22312; DNS &#21152;&#20102; CNAME&#65292;&#25351;&#21040; Github Pages&#12290;&#20877;&#36879;&#36942; <strong>Cloudflare</strong> &#35373;&#23450; Custom Domain&#65292;&#23601;&#33021;&#29992;&#19978; <strong>prayer.simtaiwan.org (</strong>&#35531;&#30475;<a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/about-custom-domains-and-github-pages">Github&#23448;&#26041;&#25945;&#23416;</a>)&#12290;</p><h3>Supabase &#24115;&#34399;&#20999;&#25563;</h3><p>&#30001;&#26044;&#25105;&#33258;&#24049;&#30340; Supabase &#20813;&#36027;&#38989;&#24230;&#24050;&#32147;&#29190;&#25481;&#65292;&#25152;&#20197;&#20094;&#33030;&#29992; SIM &#30340; email &#30003;&#35531;&#26032;&#30340;&#23560;&#26696;&#65292;&#20877;&#36992;&#35531;&#25105;&#33258;&#24049;&#36914;&#21435;&#20570;&#31649;&#29702;&#21729;&#65292;&#26041;&#20415;&#38263;&#26399;&#32173;&#35703;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZY3Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 424w, https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 848w, https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 1272w, https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png" width="1612" height="310" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:310,&quot;width&quot;:1612,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 424w, https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 848w, https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 1272w, https://substackcdn.com/image/fetch/$s_!ZY3Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d638434-0ff4-452c-a861-65e7bf7b882f_1612x310.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>&#24037;&#31243;&#21697;&#36074;&#65306;&#24478; README &#21040; Release</h2><p>&#31337;&#23450;&#19978;&#32218;&#24460;&#65292;&#23560;&#26696;&#19981;&#21482;&#35201;&#33021;&#36305;&#65292;&#26356;&#35201;&#12300;&#21487;&#32173;&#35703;&#12301;&#12290;</p><ol><li><p><strong>README / Contributing Guide</strong><br>&#25105;&#29992; Cursor &#21644; Claude Code &#24171;&#24537;&#29983;&#25104;&#25991;&#20214;&#65292;&#35731;&#20219;&#20309;&#24460;&#32396;&#30340;&#21516;&#24037;&#21487;&#20197;&#24555;&#36895;&#19978;&#25163;&#12290;</p></li><li><p><strong>CI/CD &#21697;&#36074;&#25511;&#31649;</strong><br>&#35373;&#23450;&#20102; linter&#12289;type check&#12289;prettier &#31561;&#33258;&#21205;&#27298;&#26597;&#65292;&#36991;&#20813;&#21697;&#36074;&#19979;&#28369;&#12290;</p></li><li><p>Dependabot &#33258;&#21205;&#26356;&#26032;<br>&#22871;&#20214;&#27794;&#26377;&#23450;&#26399;&#26356;&#26032;&#65292;&#26159;&#24456;&#22810;&#23560;&#26696;&#30340;&#20027;&#35201;&#27515;&#22240;...</p></li><li><p><strong>&#29256;&#26412;&#31649;&#29702; Conventional Commit + Release Please</strong></p></li></ol><p>&#36889;&#20491;&#32068;&#21512;&#26159;&#25105;&#22312;&#33258;&#24049;&#30340;&#38283;&#28304;&#23560;&#26696;&#35041;&#24859;&#19978;&#30340;&#19968;&#22871;&#27969;&#31243;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!47Je!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!47Je!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 424w, https://substackcdn.com/image/fetch/$s_!47Je!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 848w, https://substackcdn.com/image/fetch/$s_!47Je!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 1272w, https://substackcdn.com/image/fetch/$s_!47Je!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!47Je!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png" width="2000" height="449" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:449,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!47Je!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 424w, https://substackcdn.com/image/fetch/$s_!47Je!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 848w, https://substackcdn.com/image/fetch/$s_!47Je!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 1272w, https://substackcdn.com/image/fetch/$s_!47Je!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F200d8caf-7181-4ed5-bb73-879632b62597_2000x449.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Conventional Commit</strong> &#30340;&#35215;&#31684;&#65292;&#35201;&#27714;&#25105;&#20497;&#22312; commit message &#35041;&#38754;&#21152;&#19978;&#31777;&#21934;&#30340;&#21069;&#32180;&#65306;</p><ul><li><p><code>feat:</code> &#8594; &#26032;&#21151;&#33021;</p></li><li><p><code>fix:</code> &#8594; &#20462; bug</p></li><li><p><code>docs:</code> &#8594; &#25991;&#20214;&#26356;&#26032;</p></li><li><p><code>chore:</code> &#8594; &#20854;&#20182;&#38620;&#20107;<br>&#8230;&#36996;&#26377;&#20854;&#20182;&#32048;&#20998;&#12290;</p></li></ul><p>&#36889;&#27171;&#19968;&#20358;&#65292;commit log &#19981;&#20877;&#26159;&#12300;&#20098;&#31967;&#31967;&#30340;&#20633;&#24536;&#37636;&#12301;&#65292;&#32780;&#26159;&#32080;&#27083;&#21270;&#30340;&#36039;&#35338;&#12290;</p><p>&#25509;&#33879;&#65292;<strong>Release Please</strong> &#23601;&#33021;&#35712;&#25026;&#36889;&#20123;&#35215;&#31684;&#21270;&#30340; commit&#65292;&#24171;&#25105;&#65306;</p><ol><li><p>&#33258;&#21205;&#29986;&#29983; <strong>CHANGELOG</strong>&#65288;&#28165;&#26970;&#21015;&#20986;&#26032;&#22686;&#12289;&#20462;&#27491;&#12289;&#35722;&#26356;&#65289;&#12290;</p></li><li><p>&#33258;&#21205; bump &#29256;&#26412;&#34399;&#65288;&#20381;&#29031; semver&#65306;<code>feat</code> &#23601;&#21319; minor&#65292;<code>fix</code> &#23601;&#21319; patch&#65289;&#12290;</p></li><li><p>&#33258;&#21205;&#30332; release&#65288;&#29978;&#33267;&#33021;&#24171;&#24537;&#24314; tag&#12289;&#25171; package&#65289;&#12290;</p></li></ol><p>&#32080;&#26524;&#23601;&#26159;&#65306;&#25105;&#26681;&#26412;&#19981;&#29992;&#33258;&#24049;&#30447;&#33879;&#29256;&#26412;&#34399;&#65292;&#25110;&#25812;&#24515; changelog &#24536;&#20102;&#23531;&#12290;<br>&#25972;&#20491; release &#27969;&#31243;&#21482;&#35201;&#40670;&#24190;&#19979;&#21363;&#21487;&#23436;&#25104;&#65292;&#29305;&#21029;&#36969;&#21512;&#36889;&#31278;&#20844;&#38283;&#12289;&#35201;&#38263;&#26399;&#32173;&#35703;&#30340;&#23560;&#26696;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2huD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2huD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 424w, https://substackcdn.com/image/fetch/$s_!2huD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 848w, https://substackcdn.com/image/fetch/$s_!2huD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 1272w, https://substackcdn.com/image/fetch/$s_!2huD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2huD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png" width="1952" height="984" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:984,&quot;width&quot;:1952,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!2huD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 424w, https://substackcdn.com/image/fetch/$s_!2huD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 848w, https://substackcdn.com/image/fetch/$s_!2huD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 1272w, https://substackcdn.com/image/fetch/$s_!2huD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12233b4-d894-4243-adef-2c5ff4309a9d_1952x984.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>&#29986;&#21697;&#24605;&#32173;&#65306;&#24478;&#38656;&#27714;&#32763;&#35695;&#38283;&#22987;</h2><p>&#36889;&#27573;&#36942;&#31243;&#26368;&#26377;&#36259;&#30340;&#65292;&#20854;&#23526;&#26159;&#12300;&#38656;&#27714;&#32763;&#35695;&#12301;&#12290;</p><p>Roger &#19968;&#38283;&#22987;&#24076;&#26395;&#19978;&#20659;&#20841;&#24373;&#22294;&#65306;&#19968;&#24373;&#20013;&#25991;&#65292;&#19968;&#24373;&#33521;&#25991;&#12290;&#20294;&#25105;&#24314;&#35696;&#30452;&#25509;&#29992; <strong>i18n&#65288;&#22283;&#38555;&#21270;&#27231;&#21046;&#65289;</strong>&#65292;&#21516;&#19968;&#24373;&#22294;&#23601;&#33021;&#33258;&#21205;&#20999;&#25563;&#35486;&#35328;&#65292;&#19981;&#38656;&#35201;&#20841;&#20221;&#27284;&#26696;&#12290;&#19968;&#33324;&#20351;&#29992;&#32773;&#22312;&#25226;&#19968;&#20491;&#24819;&#27861;&#36681;&#25104;&#32178;&#31449;&#30340;&#26178;&#20505;&#65292;&#26371;&#24819;&#20687;&#25226;&#23427;&#26412;&#20358;&#30340;&#27969;&#31243;&#21407;&#23553;&#19981;&#21205;&#35722;&#25104;&#32178;&#38913;&#65292;&#20294;&#26159;&#20316;&#28858;&#35373;&#35336;&#24107;&#25105;&#20497;&#21487;&#20197;&#29992;&#25105;&#20497;&#23565;&#26044;&#32178;&#31449;&#22914;&#20309;&#34987;&#20351;&#29992;&#30340;&#23560;&#26989;&#65292;&#20358;&#21332;&#21161;&#12290;</p><p>&#24456;&#22810;&#20351;&#29992;&#32773;&#20854;&#23526;&#19981;&#30693;&#36947;&#36996;&#26377;&#20160;&#40636;&#21487;&#33021;&#24615;&#12290;&#20363;&#22914;&#65306;<strong>&#23383;&#39636;&#35519;&#25972;&#65292;Dark Mode&#65292;PWA&#65288;&#23433;&#35037;&#25104; App&#65289;... &#31561;&#31561;&#65292;&#36889;&#20123;&#37117;&#26159;&#35731;&#25163;&#27231;&#29256;&#26356;&#22909;&#38321;&#35712;&#30340;&#24037;&#20855;&#12290;</strong></p><p><strong>&#21478;&#22806;&#65292;&#27599;&#19968;&#31687;&#31153;&#21578;&#21040;&#24213;&#35201;&#26159;&#19968;&#20491;popup&#36996;&#26159;&#19968;&#20491;&#29544;&#31435;&#38913;&#38754;&#65311;&#36889;&#23601;&#36319;&#20320;&#26377;&#27794;&#26377;&#24819;&#35201;&#35731;&#20351;&#29992;&#32773;&#20998;&#20139;&#26576;&#19968;&#31687;&#31153;&#21578;&#65292;&#36996;&#26159;&#20320;&#21482;&#26377;&#24819;&#35201;&#35731;&#20351;&#29992;&#32773;&#20998;&#20139;&#32178;&#38913;&#12290;&#36889;&#20123;&#35373;&#35336;&#25152;&#24118;&#20358;&#30340;&#20351;&#29992;&#32773;&#32722;&#24931;&#21312;&#21029;&#65292;&#37117;&#21487;&#20197;&#28317;&#36890;&#28165;&#26970;&#65374;</strong></p><p>&#20197;&#19978;&#36890;&#36890;&#21482;&#35201;&#22312; Lovable &#32842;&#32842;&#22825;&#23601;&#23436;&#25104;&#65292;&#23436;&#20840;&#19981;&#29992;&#23531; code&#12290;&#30495;&#27491;&#26377;&#20729;&#20540;&#30340;&#22320;&#26041;&#65292;&#23601;&#26159;&#37328;&#28165;&#30495;&#23526;&#38656;&#27714;&#12290;</p><h2>&#22294;&#29255;&#22739;&#32302;&#65306;&#28858; 20 &#24180;&#24460;&#38928;&#20808;&#35373;&#24819;</h2><p>&#21478;&#19968;&#20491;&#28507;&#22312;&#21839;&#38988;&#65292;&#26159; <strong>Supabase &#20813;&#36027;&#31354;&#38291;&#21482;&#26377; 1G</strong>&#12290;&#31153;&#21578;&#22294;&#27284;&#19968;&#24373;&#23601;&#22909;&#24190; MB&#65292;&#29031;&#36889;&#27171;&#19978;&#20659;&#65292;&#20116;&#24180;&#20839;&#23601;&#29190;&#25481;&#20102;&#12290;</p><p>&#25105;&#20808;&#24819;&#36942;&#35531;&#21516;&#24037;&#22739;&#32302;&#20877;&#19978;&#20659;&#65292;&#20294;&#36889;&#27171;&#22826;&#40635;&#29033;&#65292;&#20063;&#19981;&#29694;&#23526;&#12290;&#26368;&#24460;&#27770;&#23450;&#30452;&#25509;&#22312;&#21069;&#31471;&#29992; <strong>compressor.js</strong>&#65306;&#27599;&#24373;&#22294;&#22312;&#19978;&#20659;&#21069;&#33258;&#21205;&#22739;&#21040; <strong>300kb &#24038;&#21491;</strong>&#12290;&#36889;&#27171; 1G &#31354;&#38291;&#33267;&#23569;&#33021;&#25744; 50 &#24180;&#65292;&#20351;&#29992;&#32773;&#20063;&#23436;&#20840;&#19981;&#29992;&#25913;&#35722;&#32722;&#24931;&#12290;</p><div><hr></div><h2>&#22238;&#39015;&#65306;Vibe Coding &#30340;&#31934;&#39635;</h2><p>Vibe Coding &#35731;&#26377;&#20123;&#20154;&#35258;&#24471;&#65292;&#22909;&#20687;&#20197;&#21069;&#37027;&#20123;&#31243;&#24335;&#33021;&#21147;&#37117;&#27966;&#19981;&#19978;&#29992;&#22580;&#20102;&#12290;<br>&#20294;&#20854;&#23526;&#19981;&#26159;&#34987;&#21462;&#20195;&#65292;&#32780;&#26159; <strong>&#12300;&#33287;&#20154;&#20114;&#21205;&#12289;&#28317;&#36890;&#12289;&#29702;&#35299;&#12301;&#30340;&#33021;&#21147;&#34987;&#25918;&#22823;&#20102;&#20729;&#20540;</strong>&#12290;</p><p>&#31038;&#26371;&#23416;&#32773; Bruno Latour &#26366;&#25552;&#20986;&#19968;&#20491;&#26377;&#36259;&#30340;&#21839;&#38988;&#65306;&#25105;&#20497;&#30495;&#27491;&#38364;&#27880;&#30340;&#31350;&#31455;&#26159; <strong>matter of fact</strong>&#65292;&#36996;&#26159; <strong>matter of concern</strong>&#65311;</p><ul><li><p><strong>Matter of fact</strong>&#65292;&#22312;&#36889;&#20491;&#20363;&#23376;&#35041;&#65292;&#23601;&#20687;&#26159;&#32178;&#31449;&#26412;&#36523;&#35201;&#29992;react&#36996;&#26159;next&#12289;PWA&#35442;&#22914;&#20309;&#23526;&#29694;&#65292;style &#25033;&#35442;&#35201;&#29992; tailwind &#36996;&#26159; styled component&#12290;</p></li><li><p><strong>Matter of concern</strong>&#65292;&#21063;&#26159;&#25105;&#20497;&#22914;&#20309;&#21435;&#38364;&#27880;&#37325;&#35201;&#30340;&#35696;&#38988;&#65306;&#22914;&#20309;&#33287;&#20351;&#29992;&#32773;&#19968;&#36215;&#25366;&#25496;&#30495;&#27491;&#37325;&#35201;&#30340;&#21151;&#33021;&#65311;&#36889;&#38917;&#29986;&#21697;&#26381;&#21209;&#30340;&#23565;&#35937;&#26159;&#35504;&#65311;&#25105;&#20497;&#20570;&#30340;&#27599;&#19968;&#20214;&#20107;&#24773;&#65292;&#33021;&#19981;&#33021;&#25512;&#21205;&#20351;&#29992;&#32773;&#38283;&#22987;&#38364;&#27880;&#37325;&#35201;&#28966;&#40670;&#65311;</p></li></ul><p>&#22312; Vibe Coding &#30340;&#26178;&#20195;&#65292;&#25105;&#30456;&#20449; <strong>&#31995;&#32113;&#35373;&#35336;&#33287;&#36939;&#32173;&#30340;&#33021;&#21147;&#26371;&#26356;&#21152;&#37325;&#35201;</strong>&#65292;&#22240;&#28858;&#36889;&#20123;&#26159;&#22522;&#30990;&#24314;&#35373;&#12290;&#20294;&#21516;&#26178;&#65292;&#26356;&#37325;&#35201;&#30340;&#26159;&#65306;<strong>&#31449;&#22312;&#20351;&#29992;&#32773;&#35282;&#24230;&#24605;&#32771;&#65292;&#32763;&#35695;&#20182;&#20497;&#30340;&#38656;&#35201;&#65292;&#30495;&#35488;&#22320;&#24076;&#26395;&#20570;&#20986;&#33021;&#24171;&#21161;&#20154;&#30340;&#29986;&#21697;</strong>&#12290;</p><p>&#32178;&#22336;&#20877;&#27425;&#38468;&#19978; &#128073; <a href="https://prayer.simtaiwan.org?utm_source=chatgpt.com">prayer.simtaiwan.org</a> &#19968;&#36215;&#28858;&#19990;&#30028;&#31153;&#21578;<br>&#20063;&#27489;&#36814;&#21443;&#33287;&#36002;&#29563;&#65306;<a href="https://github.com/Fruitful-Tools/sim-weekly-prayers">https://github.com/Fruitful-Tools/sim-weekly-prayers</a></p>]]></content:encoded></item><item><title><![CDATA[在優比快Cloud Team工作是什麼樣子]]></title><description><![CDATA[&#22914;&#26524;&#20320;&#27491;&#22312;&#25214;&#19968;&#20221;&#21487;&#20197;&#23433;&#23433;&#38748;&#38748;&#23531;&#31243;&#24335;&#12289;&#19981;&#38656;&#35201;&#22826;&#22810;&#28317;&#36890;&#30340;&#24037;&#20316;&#65292;&#32769;&#23526;&#35498;&#8212;&#8212;Ubiquiti Cloud Team &#21487;&#33021;&#19981;&#36969;&#21512;&#20320;&#12290;]]></description><link>https://blog.schwannden.com/p/working-at-ubiquiti-cloud-team</link><guid isPermaLink="false">https://blog.schwannden.com/p/working-at-ubiquiti-cloud-team</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Wed, 03 Sep 2025 03:37:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5fd125d2-f0f5-4f71-809c-9943e363e01c_2000x1057.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!79GZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!79GZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 424w, https://substackcdn.com/image/fetch/$s_!79GZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 848w, https://substackcdn.com/image/fetch/$s_!79GZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 1272w, https://substackcdn.com/image/fetch/$s_!79GZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!79GZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!79GZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 424w, https://substackcdn.com/image/fetch/$s_!79GZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 848w, https://substackcdn.com/image/fetch/$s_!79GZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 1272w, https://substackcdn.com/image/fetch/$s_!79GZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a5d5b3-488d-4e80-a28b-aaaac36eb654_2000x1057.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>&#22914;&#26524;&#20320;&#27491;&#22312;&#25214;&#19968;&#20221;&#21487;&#20197;&#23433;&#23433;&#38748;&#38748;&#23531;&#31243;&#24335;&#12289;&#19981;&#38656;&#35201;&#22826;&#22810;&#28317;&#36890;&#30340;&#24037;&#20316;&#65292;&#32769;&#23526;&#35498;&#8212;&#8212;Ubiquiti Cloud Team &#21487;&#33021;&#19981;&#36969;&#21512;&#20320;&#12290;</p><p>&#24180;&#36629;&#30340;&#24037;&#31243;&#24107;&#36890;&#24120;&#22312;&#24847;&#30340;&#26159;&#33021;&#19981;&#33021;&#23416;&#32722;&#12289;&#26377;&#27794;&#26377;&#20154;&#24118;&#65307;&#32780;&#36039;&#28145;&#24037;&#31243;&#24107;&#65292;&#21063;&#26356;&#30475;&#37325;&#38936;&#22495;&#30340;&#28145;&#24230;&#33287;&#30332;&#25582;&#31354;&#38291;&#12290;&#36889;&#20841;&#31278;&#25105;&#37117;&#29702;&#35299;&#65292;&#20063;&#37117;&#32147;&#27511;&#36942;&#12290;&#22312; Ubiquiti Cloud Team&#65292;&#24037;&#20316;&#30906;&#23526;&#19981;&#36629;&#39686;&#65292;&#21839;&#38988;&#36890;&#24120;&#20063;&#19981;&#21934;&#32020;&#12290;&#20294;&#22914;&#26524;&#20320;&#36861;&#27714;&#25361;&#25136;&#12289;&#22312;&#24847;&#25216;&#34899;&#22914;&#20309;&#24118;&#20986;&#29986;&#21697;&#20729;&#20540;&#65292;&#36889;&#35041;&#23601;&#26159;&#20491;&#33021;&#35731;&#20320;&#19981;&#26039;&#30952;&#32244;&#12289;&#36880;&#27493;&#25918;&#22823;&#30340;&#33310;&#21488;&#12290;</p><p>&#19968;&#20123;&#22522;&#26412;&#36039;&#35338;&#20808;&#35611;&#28165;&#26970;&#65306;&#25105;&#20497;&#20351;&#29992; GitHub&#65292;&#38283;&#30332;&#29872;&#22659;&#29694;&#20195;&#21270;&#65292;&#38642;&#24179;&#21488;&#35442;&#29992;&#30340;&#37117;&#26377;&#65307;&#22296;&#38538;&#20839;&#37096;&#25552;&#20379;&#21508;&#31278; AI coding &#24037;&#20855;&#36628;&#21161;&#26085;&#24120;&#38283;&#30332;&#65288;&#21253;&#25324;&#25105;&#26412;&#20154;&#38750;&#24120;&#20381;&#36084;&#30340; ChatGPT, Cursor &#21644; Claude Code&#65289;&#65307;&#24037;&#20316;&#22411;&#24907;&#24392;&#24615;&#22823;&#65292;&#36960;&#31471;&#12289;&#28961;&#38480;&#20551;&#12289;&#20581;&#36523;&#35036;&#21161;&#12290;</p><h3>&#19968;&#20999;&#24478;&#12300;&#30495;&#23526;&#19990;&#30028;&#30340;&#35037;&#32622;&#12301;&#38283;&#22987;</h3><p>Ubiquiti &#36319;&#22810;&#25976;&#32020;&#36575;&#39636;&#20844;&#21496;&#19981;&#22826;&#19968;&#27171;&#65292;&#25105;&#20497;&#30340;&#38642;&#31471;&#26381;&#21209;&#26159;&#28858;&#20102;&#25903;&#25588;&#20840;&#29699;&#21508;&#22320;&#25976;&#20197;&#30334;&#33836;&#35336;&#30340;&#23526;&#39636;&#32178;&#36890;&#35373;&#20633;&#65306;&#24478; AP&#12289;&#36335;&#30001;&#22120;&#12289;&#20132;&#25563;&#22120;&#65292;&#21040;&#30435;&#25511;&#25885;&#24433;&#27231;&#12289;IoT gateway&#65292;&#29978;&#33267;&#36996;&#26377;&#38651;&#21147;&#20379;&#25033;&#31649;&#29702;&#22120;&#12290;&#36889;&#20123;&#35373;&#20633;&#37096;&#32626;&#22312;&#21654;&#21857;&#24215;&#12289;&#23416;&#26657;&#12289;&#37291;&#38498;&#65292;&#36996;&#26377;&#20491;&#20154;&#30340;&#23478;&#35041;&#12290;</p><p>&#25105;&#20497;&#22296;&#38538;&#30340;&#20219;&#21209;&#65292;&#23601;&#26159;&#35731;&#36889;&#20123;&#35373;&#20633;&#32972;&#24460;&#30340;&#38642;&#31471;&#25511;&#21046;&#24179;&#21488;&#31337;&#23450;&#21448;&#22909;&#29992;&#12290;&#36889;&#30475;&#36215;&#20358;&#20687;&#26159;&#12300;&#23531; API&#12289;&#25509;&#36039;&#26009;&#24235;&#12289;&#20570; UI&#12301;&#36889;&#39006;&#24120;&#35211;&#30340;&#24037;&#20316;&#65292;&#20294;&#23526;&#38555;&#19978;&#65292;&#27599;&#19968;&#27573; API call&#12289;&#27599;&#19968;&#31558;&#36039;&#26009;&#21516;&#27493;&#65292;&#32972;&#24460;&#37117;&#36899;&#21205;&#21040;&#19968;&#20491;&#29694;&#23526;&#19990;&#30028;&#20013;&#27491;&#22312;&#36939;&#20316;&#30340;&#35037;&#32622;&#12290;&#25105;&#20497;&#30340;&#24605;&#32771;&#32317;&#26159;&#20197;&#32066;&#28858;&#22987;&#65306;&#36889;&#27171;&#20570;&#26377;&#27794;&#26377;&#36948;&#21040;&#30446;&#30340;&#65292;&#21738;&#20123;&#35037;&#32622;&#21463;&#21040;&#24433;&#38911;&#65292;&#37096;&#32626;&#30340;&#31574;&#30053;&#21448;&#26159;&#24590;&#40636;&#27171;&#65311;&#24590;&#27171;&#20570;&#22909;&#39080;&#38570;&#31649;&#25511;&#65311;</p><p>&#26377;&#20123;&#27770;&#23450;&#20570;&#37679;&#20102;&#23601;&#22238;&#19981;&#20102;&#38957;&#65292;&#20294;&#26159;&#22312;&#36889;&#35041;&#27493;&#35519;&#24456;&#24555;&#65292;&#24433;&#38911;&#30340;&#20351;&#29992;&#32773;&#21448;&#24456;&#24291;&#65292;&#25105;&#20497;&#24120;&#24120;&#35201;&#24605;&#32771;&#65292;&#33021;&#19981;&#33021;&#22312;&#21487;&#25511;&#30340;&#39080;&#38570;&#24213;&#19979;&#65292;&#20570;&#20986;&#21487;&#36914;&#21487;&#36864;&#30340;&#27770;&#23450;&#65292;&#24590;&#27171;&#36880;&#27493;&#30340;rollout&#65292;&#24590;&#27171;&#25345;&#32396;&#30435;&#28204;&#12290;</p><p>&#36889;&#31278;&#12300;&#25105;&#23531;&#30340;&#31243;&#24335;&#29694;&#22312;&#23601;&#24433;&#38911;&#21040;&#26576;&#20154;&#23478;&#30340;&#32178;&#36335;&#26377;&#27794;&#26377;&#36890;&#12301;&#30340;&#24863;&#35258;&#65292;&#24456;&#30495;&#23526;&#12289;&#24456;&#26377;&#22739;&#21147;&#65292;&#20063;&#24456;&#26377;&#25104;&#23601;&#24863;&#12290;&#22312;&#36889;&#35041;&#24037;&#20316;&#65292;&#27794;&#26377;&#25152;&#35586;&#30340;&#12300;&#32020;&#24037;&#31243;&#24107;&#12301;&#12290;&#27599;&#20491;&#20154;&#37117;&#22312;&#24605;&#32771;&#26550;&#27083;&#65292;&#24605;&#32771;&#20351;&#29992;&#32773;&#12290;</p><h3>&#25216;&#34899;&#39080;&#26684;&#33287;&#25991;&#21270;&#65306;&#39640;&#24230;&#33258;&#20027;&#12289;&#24375;&#35519;Ownership</h3><p>Ubiquiti &#30340;&#25991;&#21270;&#36319;&#25105;&#20197;&#21069;&#24453;&#36942;&#30340;&#20844;&#21496;&#37117;&#19981;&#19968;&#27171;&#12290;</p><p>&#25105;&#24453;&#36942;&#26032;&#21109;&#65292;&#36319;&#33879; MoBagel &#24478;10&#20491;&#20154;&#25104;&#38263;&#21040;70&#20491;&#20154;&#12290;&#22312;&#37027;&#35041;&#24456;&#22810;&#20107;&#24773;&#37117;&#26159;&#25105;&#35498;&#20102;&#31639;&#65292;&#19968;&#20491;&#26202;&#19978;&#23601;&#21487;&#20197;&#29983;&#20986;&#19968;&#26781;&#26032;&#30340;&#29986;&#21697;&#32218;&#12290;&#24460;&#20358;&#22312; Dell 400&#20491;&#20154;&#30340; Global team&#65292;&#22312;&#37027;&#35041;&#26377;&#22823;&#37327;&#30340;&#36328;&#22296;&#38538;&#65292;&#36328;&#22283;&#65292;&#36328;&#23652;&#32026;&#30340;&#28317;&#36890;&#65292;&#36996;&#26377;&#30828;&#39636;&#25991;&#21270;&#33287;&#36575;&#39636;&#25991;&#21270;&#30340;&#38548;&#38305;&#35201;&#36328;&#36234;&#12290;</p><p>Ubiquiti&#24037;&#20316;&#30340;&#24863;&#21463;&#22312;&#36889;&#20841;&#32773;&#20043;&#38291;&#12290;&#30070;&#28982;&#19981;&#21487;&#33021;&#33258;&#24049;&#35498;&#35201;&#19978;&#19968;&#20491;&#29256;&#26412;&#23601;&#19978;&#65288;&#20877;&#27425;&#24375;&#35519;&#65306;&#25105;&#20497;&#26377;&#19978;&#30334;&#33836;&#30340;&#20351;&#29992;&#32773;&#65289;&#65292;&#20294;&#20063;&#19981;&#26371;&#26377;&#22826;&#35463;&#24373;&#30340;&#23652;&#23652;&#30340;&#28317;&#36890;&#25104;&#26412;&#12290;</p><p>&#24456;&#22810;&#20154;&#22312;&#38754;&#35430;&#26178;&#37117;&#26371;&#21839;&#65306;&#12300;&#20320;&#20497;&#20844;&#21496;&#30340;&#25216;&#34899;&#25991;&#21270;&#24590;&#40636;&#27171;&#65311;&#12301;&#36889;&#26159;&#19968;&#20491;&#24456;&#24120;&#35211;&#20063;&#24456;&#37325;&#35201;&#30340;&#21839;&#38988;&#65292;&#20294;&#20854;&#23526;&#25105;&#24120;&#24120;&#22312;&#24819;&#8212;&#8212;&#22823;&#23478;&#21475;&#20013;&#30340;&#12300;&#25216;&#34899;&#25991;&#21270;&#12301;&#21040;&#24213;&#26159;&#20160;&#40636;&#24847;&#24605;&#65311;</p><p>&#26377;&#20123;&#20154;&#26371;&#25226;&#25216;&#34899;&#25991;&#21270;&#31561;&#21516;&#26044;&#65306;&#20320;&#20497;&#26377;&#27794;&#26377;&#23531; Unit Test&#65311;&#25991;&#20214;&#23531;&#24471;&#23436;&#19981;&#23436;&#25972;&#65311;PR &#26377;&#27794;&#26377;&#20154;&#24171;&#24537; Review&#65311;&#26377;&#27794;&#26377; CICD&#65311;Roadmap &#26159;&#24590;&#40636;&#35215;&#21123;&#30340;&#65311;&#36889;&#20123;&#37117;&#24456;&#23526;&#38555;&#65292;&#20063;&#37117;&#37325;&#35201;&#65292;&#20294;&#25105;&#22312; Ubiquiti &#24037;&#20316;&#24460;&#65292;&#26377;&#19968;&#20491;&#26356;&#28145;&#30340;&#39636;&#26371;&#12290;</p><p>&#36889;&#26159;&#25105;&#24453;&#36942;&#25216;&#34899;&#25991;&#21270;&#26368;&#20581;&#24247;&#30340;&#20844;&#21496;&#20043;&#19968;&#12290;&#23565;&#65292;&#21839;&#38988;&#20063;&#36996;&#26377;&#24456;&#22810;&#65292;&#21487;&#20197;&#25913;&#21892;&#30340;&#31354;&#38291;&#36996;&#26377;&#24456;&#22810;&#65292;&#22810;&#21040;&#35498;&#19981;&#23436;&#12290;&#20294;&#26159;&#25105;&#20173;&#28982;&#26371;&#35498;&#36889;&#26159;&#25105;&#24453;&#36942;&#25216;&#34899;&#25991;&#21270;&#26368;&#20581;&#24247;&#30340;&#20844;&#21496;&#20043;&#19968;&#12290;</p><p>&#25105;&#20497;&#30340;&#25991;&#20214;&#23531;&#24471;&#38750;&#24120;&#23436;&#25972;&#65307;&#28204;&#35430;&#20063;&#19981;&#26159;&#25033;&#20184;&#24046;&#20107;&#65292;&#32780;&#26159;&#30495;&#30340;&#33021;&#24171;&#21161;&#32173;&#35703;&#21697;&#36074;&#65307;PR review &#38750;&#24120;&#35469;&#30495;&#65292;&#22821;&#20276;&#20497;&#26371;&#25552;&#20379;&#35488;&#25031;&#21448;&#20855;&#24314;&#35373;&#24615;&#30340; feedback&#65292;&#32780;&#19988;&#36889;&#20123; review &#24120;&#24120;&#19981;&#21482;&#26159;&#23531;&#27861;&#23565;&#37679;&#65292;&#36996;&#21253;&#21547;&#23565;&#31995;&#32113;&#25972;&#39636;&#24433;&#38911;&#30340;&#24605;&#32771;&#12290;&#20294;&#36889;&#19968;&#20999;&#37117;&#19981;&#26159;&#38752;&#35215;&#23450;&#12289;SOP&#12289;&#25110;&#26159;&#27599;&#22825; standup &#25171;&#21345;&#20986;&#20358;&#30340;&#65292;&#32780;&#26159;&#20358;&#33258;&#22823;&#23478;&#23565;&#26044;&#25216;&#34899;&#21697;&#36074;&#30340;&#39640;&#24230;&#33258;&#25105;&#35201;&#27714;&#12290;</p><p>&#31777;&#24453;&#20358;&#35498;&#65292;&#20844;&#21496;&#30340;&#25216;&#34899;&#25991;&#21270;&#65292;&#20854;&#23526;&#26159;&#27599;&#19968;&#20491;&#20491;&#20154;&#36002;&#29563;&#32773;&#30340;&#22533;&#25345;&#33287;&#20849;&#35672;&#24213;&#19979;&#21435;&#21109;&#36896;&#20986;&#20358;&#30340;&#12290;</p><p>&#25105;&#26366;&#22312;&#26032;&#21109;&#20844;&#21496;&#30070;&#25216;&#34899;&#30740;&#30332;&#32317;&#30435;&#65292;&#20063;&#22312; DELL &#37027;&#31278;&#36229;&#36942; 400 &#20154;&#30340;&#20840;&#29699;&#30740;&#30332;&#22296;&#38538;&#24037;&#20316;&#36942;&#12290;&#33258;&#24049;&#20063;&#23531;&#36942;&#19981;&#23569;&#38283;&#28304;&#23560;&#26696;&#12290;&#25105;&#24456;&#22312;&#24847;&#25216;&#34899;&#25991;&#21270;&#65292;&#20294;&#24517;&#38920;&#35498;&#65292;Ubiquiti &#35731;&#25105;&#30475;&#35211;&#30340;&#26159;&#65292;&#25216;&#34899;&#25991;&#21270;&#26368;&#26377;&#25928;&#29575;&#22320;&#25512;&#21205;&#26041;&#24335;&#65292;&#20854;&#23526;&#26159;buttom-up&#12290;Hire &#23565;&#30340;&#20154;&#65292;&#19981;&#20677;&#20677;&#26159;&#22312;&#24847;&#30340;&#20154;&#65292;&#32780;&#19988;&#26159;&#21487;&#20197;&#20027;&#21205;&#35299;&#27770;&#21839;&#38988;&#30340;&#20154;&#65292;&#26368;&#24460;&#21453;&#32780;&#22823;&#23478;&#26356;&#21152;&#36629;&#39686;&#12290;</p><p>&#36889;&#27171;&#30340;&#25991;&#21270;&#19981;&#26159;&#38752;&#12300;&#34987;&#21205;&#36969;&#25033;&#12301;&#33021;&#32173;&#25345;&#30340;&#12290;&#25105;&#20497;&#26399;&#24453;&#21152;&#20837;&#22296;&#38538;&#30340;&#20154;&#65292;&#19981;&#21482;&#26159;&#20358;&#20139;&#21463;&#36889;&#20491;&#29872;&#22659;&#65292;&#32780;&#26159;&#33021;&#22816;&#12300;&#20849;&#21516;&#32173;&#35703;&#12289;&#29978;&#33267;&#25913;&#21892;&#12301;&#36889;&#27171;&#30340;&#25991;&#21270;&#12290;</p><h3>&#24037;&#31243;&#24107;&#19981;&#21482;&#26159;&#23531;&#31243;&#24335;&#65292;&#32780;&#26159;&#21443;&#33287;&#29986;&#21697;</h3><p>&#24456;&#22810;&#26178;&#20505;&#65292;&#25105;&#20497;&#19981;&#21482;&#26159;&#12300;&#25509;&#21040; spec &#23601;&#29031;&#20570;&#12301;&#65292;&#32780;&#26159;&#21453;&#36942;&#20358;&#20027;&#21205;&#25552;&#20986;&#65306;&#12300;&#36889;&#27171;&#35373;&#35336;&#20854;&#23526;&#23565;&#35037;&#32622;&#31471;&#27794;&#37027;&#40636;&#21451;&#21892;&#12301;&#12289;&#12300;&#25105;&#20497;&#21487;&#20197;&#25226;&#36889;&#20491;&#27969;&#31243;&#25289;&#24179;&#65292;&#28187;&#23569;&#20351;&#29992;&#32773;&#31561;&#24453;&#26178;&#38291;&#12301;&#8230;&#8230;&#36889;&#39006;&#24314;&#35696;&#24456;&#22810;&#26178;&#20505;&#26371;&#34987;&#25505;&#32013;&#65292;&#29978;&#33267;&#35731;&#29986;&#21697;&#35373;&#35336;&#26356;&#36028;&#36817;&#23526;&#38555;&#24773;&#22659;&#12290;</p><h3>&#22914;&#26524;&#20320;&#20063;&#22909;&#22855; Ubiquiti &#30340;&#38642;&#31471;&#24037;&#31243;&#25991;&#21270;&#8230;</h3><p>&#25105;&#26371;&#35498;&#36889;&#26159;&#19968;&#20491;&#24456;&#36969;&#21512;&#21916;&#27489; ownership&#12289;&#21448;&#19981;&#24597;&#38754;&#23565;&#30495;&#23526;&#19990;&#30028; challenge &#30340;&#24037;&#31243;&#24107;&#20358;&#30340;&#22320;&#26041;&#12290;&#20320;&#26371;&#27599;&#22825;&#34987;&#21508;&#31278;&#26032;&#24773;&#22659;&#21050;&#28608;&#22823;&#33126;&#65292;&#20063;&#26371;&#23416;&#21040;&#22914;&#20309;&#36319; device team&#12289;frontend team&#12289;support team &#19968;&#36215;&#25171;&#36896;&#19968;&#20491;&#12300;&#30495;&#30340;&#26371;&#34987;&#29992;&#12289;&#32780;&#19988;&#34987;&#37325;&#24230;&#20351;&#29992;&#12301;&#30340;&#29986;&#21697;&#12290;</p><p>&#22312;&#36889;&#35041;&#65292;&#19981;&#21482;&#26159; coding&#65292;&#26356;&#22810;&#30340;&#26159;&#24605;&#32771;&#33287;&#35373;&#35336;&#12290;&#32780;&#26368;&#26834;&#30340;&#26159;&#65292;&#20320;&#23531;&#30340;&#27599;&#19968;&#34892;&#31243;&#24335;&#65292;&#26368;&#32066;&#37117;&#26371;ship&#32102;&#19978;&#30334;&#33836;&#30340;&#20351;&#29992;&#32773;&#12290;&#25105;&#33258;&#24049;&#23478;&#35041;&#36319;&#25945;&#26371;&#20063;&#37117;&#25563;&#25104;&#20102;&#25972;&#22871;&#30340;Ubiquiti&#32178;&#36335;&#35373;&#20633;&#65292;&#36889;&#27171;&#26041;&#20415;&#30340;&#21487;&#30435;&#25511;&#24615;&#36996;&#26377;&#38728;&#27963;&#30340;&#36960;&#31471;&#35373;&#23450;&#65292;&#30495;&#30340;&#26159;&#26377;&#25171;&#20013;&#25105;&#20497;&#36889;&#31278;IT prosumer&#30340;&#24515;&#12290;</p>]]></content:encoded></item><item><title><![CDATA[The Revolution Befor AI: The Declarative Revolution, and How We Should Program From Now On]]></title><description><![CDATA[Before LLMs, programming quietly shifted from imperative scripts to declarative clarity. This hidden evolution&#8212;containers, infra-as-code, components&#8212;set the stage for AI to finally read, reason, and collaborate with our code.]]></description><link>https://blog.schwannden.com/p/the-revolution-befor-ai-the-declarative-revolution-and-how-we-should-program-from-now-on</link><guid isPermaLink="false">https://blog.schwannden.com/p/the-revolution-befor-ai-the-declarative-revolution-and-how-we-should-program-from-now-on</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Mon, 01 Sep 2025 10:00:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e4a2d1fb-4221-4031-bf00-d690d73afc23_1408x736.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k6m8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k6m8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 424w, https://substackcdn.com/image/fetch/$s_!k6m8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 848w, https://substackcdn.com/image/fetch/$s_!k6m8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 1272w, https://substackcdn.com/image/fetch/$s_!k6m8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k6m8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!k6m8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 424w, https://substackcdn.com/image/fetch/$s_!k6m8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 848w, https://substackcdn.com/image/fetch/$s_!k6m8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 1272w, https://substackcdn.com/image/fetch/$s_!k6m8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23cf2309-6cc7-4eda-b1a0-e455bd46004e_1408x736.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>When I first started building websites, everything was manual. Spin up a VM, install packages, configure Apache, set up networking&#8212;line by line, hoping I didn&#8217;t miss a step. It worked, but it was fragile.</p><p>Then Docker came along. Suddenly, I could package everything into one neat container. Docker Compose made it even better&#8212;I could describe my whole stack in a single YAML file. Kubernetes took it further by orchestrating all the moving parts for me. And when Terraform arrived, it felt like magic: I wasn&#8217;t scripting servers anymore, I was declaring what I wanted, and the system figured out the rest.</p><p>At the time, I just appreciated the convenience. What I didn&#8217;t realize was that I was stepping into a world perfectly suited for AI.</p><h2>Why Declarative Thinking Matters</h2><p>Declarative tools like Docker, Kubernetes, and Terraform flip the script. Instead of telling machines <em>how</em> to do something, we describe the <em>end state</em>. The system takes responsibility for figuring out the steps to get there.</p><p>Take infrastructure. Back in the old days, I&#8217;d write long bash scripts: install Postgres, configure users, set up storage, open the right ports, and hope I hadn&#8217;t missed a detail. Every line was an instruction tied to a particular OS, version, or runtime. For an AI trying to understand this, it&#8217;s like reading a recipe where half the ingredients are hidden between the lines&#8212;you need deep contextual knowledge just to interpret what&#8217;s happening.</p><p>With Terraform, I can instead declare:</p><pre><code>resource "aws_db_instance" "mydb" {
  engine            = "postgres"
  instance_class    = "db.t3.micro"
  allocated_storage = 20
}</code></pre><p>That snippet is compact but unambiguous. It says, &#8220;I want a Postgres database of this size and type.&#8221; AI doesn&#8217;t need to parse ten steps of installation logic&#8212;it just sees the goal. Because declarative code describes <em>what something is</em> rather than <em>how to do it</em>, it maps naturally onto how AI models understand text: as patterns, relationships, and outcomes.</p><p>The same is true in UI. In the old CSS days, I&#8217;d have a spaghetti of selectors, nested rules, and overrides&#8212;difficult for me to reason about, and almost impossible for an AI to modify without breaking something. But with Tailwind, I can write:</p><pre><code>&lt;button className="bg-blue-600 rounded-lg hover:bg-blue-700"&gt;
  Submit
&lt;/button&gt;</code></pre><p>Every class is atomic, precise, and predictable. Change <code>bg-blue-600</code> to <code>bg-green-600</code>, and the background color <em>only</em> changes&#8212;no side effects lurking elsewhere. For an AI, this is huge: it can confidently generate changes knowing the outcome is deterministic.</p><p>This is why declarative paradigms are so AI-friendly. They reduce ambiguity, eliminate hidden state, and separate <em>intent</em> from <em>implementation</em>. Instead of reverse-engineering &#8220;what the human really meant&#8221; from dozens of imperative steps, AI can work directly with clear, human-readable declarations of the desired outcome.</p><h2>Writing Code That AI Can Understand</h2><p>Over the years, I&#8217;ve noticed that the practices making my code easier for teammates also make it easier for AI. Some practical shifts stand out:</p><ul><li><p><strong>Vertical slice architecture</strong>: Organizing by features instead of layers gives both humans and AI self-contained units of meaning.</p></li><li><p><strong><code>llms.txt</code> files</strong>: Just like <code>robots.txt</code> tells crawlers what to do, <code>llms.txt</code> gives AI a roadmap for your project.</p></li><li><p><strong>AI-actionable docs</strong>: Instead of vague &#8220;configure the DB,&#8221; I now write: &#8220;set <code>DATABASE_URL=postgres://user:pass@host/db</code>.&#8221; Instead of writing <code>click this link</code> in the document, we can write <code>run curl -XPOST ...</code> so AI doesn&#8217;t guess&#8212;it executes.</p></li><li><p><strong>Composable components</strong>: Smaller, reusable parts reduce the chances of AI (or me) breaking things when making changes.</p></li></ul><h2>Toward a Shared Language Between Humans and AI</h2><p>Looking back, I realize Docker, Compose, K8s, and Terraform weren&#8217;t just conveniences. They were rewiring how I think about code. Declarative, modular, predictable&#8212;exactly the qualities that make AI collaboration possible.</p><p>The shift is bigger than tools. It&#8217;s about our role. We&#8217;re no longer just code writers. We&#8217;re system architects, orchestrating intelligent collaboration between humans and machines.</p><p>That&#8217;s the real &#8220;declarative revolution.&#8221; It&#8217;s not just how we deploy apps or style UIs&#8212;it&#8217;s a new way of thinking about programming itself. A shared language between us and AI.</p><p>And once you see it that way, it&#8217;s hard not to imagine what the next decade of coding will look like.</p>]]></content:encoded></item><item><title><![CDATA[🍼 一手抱嬰兒，我用 20分鐘「嘴」出讀經計畫 Progressive Web App]]></title><description><![CDATA[&#22312;&#27794;&#23531;&#19968;&#34892; code &#30340;&#24773;&#27841;&#19979;&#65292;&#25105;&#20351;&#29992; lovable &#23436;&#25104;&#20102;&#19968;&#20491;&#26377;&#20114;&#21205;&#12289;&#26377;&#35373;&#35336;&#24863;&#12289;&#26377;&#34892;&#21205;&#39636;&#39511;&#30340;&#32178;&#31449;&#65292;&#32780;&#19988;&#21482;&#33457;&#20102; 20 &#20998;&#37912;&#12290;]]></description><link>https://blog.schwannden.com/p/speak-a-pwa-into-existence</link><guid isPermaLink="false">https://blog.schwannden.com/p/speak-a-pwa-into-existence</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Thu, 05 Jun 2025 07:45:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/098db44a-22e4-428b-887f-ab5de36f326d_800x382.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TTPW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TTPW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 424w, https://substackcdn.com/image/fetch/$s_!TTPW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 848w, https://substackcdn.com/image/fetch/$s_!TTPW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 1272w, https://substackcdn.com/image/fetch/$s_!TTPW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TTPW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TTPW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 424w, https://substackcdn.com/image/fetch/$s_!TTPW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 848w, https://substackcdn.com/image/fetch/$s_!TTPW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 1272w, https://substackcdn.com/image/fetch/$s_!TTPW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bacb18e-9238-4413-a465-1c27fc4357c4_800x382.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>&#22312;&#27794;&#23531;&#19968;&#34892; code &#30340;&#24773;&#27841;&#19979;&#65292;&#25105;&#20351;&#29992; <a href="https://lovable.dev">lovable</a> &#23436;&#25104;&#20102;&#19968;&#20491;&#26377;&#20114;&#21205;&#12289;&#26377;&#35373;&#35336;&#24863;&#12289;&#26377;&#34892;&#21205;&#39636;&#39511;&#30340;&#32178;&#31449;&#65292;&#32780;&#19988;&#21482;&#33457;&#20102; <strong>20 &#20998;&#37912;</strong>&#12290;</p><p>&#25104;&#21697;&#65306;<a href="https://2025-bible-reading.fruitful-tools.com/">https://2025-bible-reading.fruitful-tools.com/</a></p><p>&#25105;&#19981;&#26159;&#31532;&#19968;&#27425;&#20570;&#32178;&#38913;&#65292;&#20294;&#36889;&#27425;&#26159;&#25105;<strong>&#31532;&#19968;&#27425;&#19981;&#29992;&#25171;&#38283; VSCode/Cursor</strong>&#65292;&#29978;&#33267;&#26159;&#19968;&#37002;<strong>&#21934;&#25163;&#25265;&#33879;&#22235;&#20491;&#26376;&#22823;&#30340;&#23542;&#23542;</strong>&#12289;<strong>&#19968;&#37002;&#35486;&#38899;&#36664;&#20837;</strong>&#25351;&#20196;&#23436;&#25104;&#30340;&#12290;</p><div><hr></div><h3>&#127919; &#36889;&#27425;&#30340;&#20219;&#21209;&#65306;&#20570;&#20986;&#19968;&#20491;&#35712;&#32147;&#35336;&#30059; Web App</h3><p>&#36889;&#20491;&#32178;&#31449;&#30340;&#30446;&#27161;&#24456;&#31777;&#21934;&#65306;</p><ul><li><p>&#26412;&#20358;&#23601;&#22312;&#20170;&#24180;&#28858;&#25945;&#26371;&#35373;&#35336;&#20102;&#19968;&#24180; 12 &#20491;&#26376;&#20221;&#30340;&#35712;&#32147;&#35336;&#30059;</p></li><li><p>&#27599;&#20491;&#26376;&#19968;&#24373;&#35712;&#32147;&#21345;&#65288;&#27491;&#38754;&#26159;&#35336;&#30059;&#65292;&#32972;&#38754;&#26159;&#35373;&#35336;&#22294;&#65289;&#12290;&#26412;&#20358;&#21015;&#21360;&#25104;&#37239;&#21345;&#65292;&#20294;&#26159;&#22240;&#28858;&#25976;&#37327;&#19981;&#36275;&#65292;&#24460;&#20358;&#26377;&#20123;&#20154;&#25343;&#19981;&#21040;&#20102;&#65292;&#25165;&#24819;&#35498;&#35373;&#35336;&#25104;&#32178;&#38913;&#12290;</p></li><li><p>&#25163;&#27231;&#20778;&#21270;&#12289;&#38928;&#35373;&#32321;&#39636;&#20013;&#25991;</p></li></ul><p>&#36889;&#20123;&#38656;&#27714;&#65292;&#20320;&#20132;&#32102;&#35373;&#35336;&#24107;&#30059;&#22294;&#12289;&#21069;&#31471;&#23531; code&#12289;PM &#25490;&#36914;&#38283;&#30332;&#26178;&#31243;&#65292;&#21487;&#33021;&#35201; 1~2 &#36913;&#25165;&#26371;&#19978;&#32218;&#12290;&#22914;&#26524;&#20320;&#26159;&#24456;&#20778;&#31168;&#30340;&#21069;&#31471;&#24037;&#31243;&#24107;&#65292;&#21487;&#33021;&#20063;&#35201;&#33457;&#19977;&#22235;&#20491;&#23567;&#26178;&#12290;&#20294;&#26159;&#25105;&#21482;&#20570;&#20102;&#19968;&#20214;&#20107;&#65306;<strong>&#36319; <a href="https://lovable.dev">lovable.dev</a> &#35498;&#28165;&#26970;&#25105;&#35201;&#20160;&#40636;&#12290;</strong></p><div><hr></div><h3>&#129504; &#24590;&#40636;&#36319; AI &#35498;&#65311;&#25105;&#30340;&#35486;&#38899;&#25351;&#20196;&#38263;&#36889;&#27171;&#65306;</h3><pre><code>please use the following tech stack 
React 19, Tailwind CSS v4, Vite, TypeScript, React Router v7, 
ShadCN/UI, Framer Motion 
 
I wish to create a yearly bible reading plan app, purely frontend. 
I will upload 24 images, 12 as monthly bible reading calendar, 12 are designs related to that month's scope. 
Create a website that has 12 months as 12 cards. 
When a card is clicked, show the calendar png. 
When clicked again, flip the card to show design. 
Make it a web app. 
Greenish design. 
i18n with default to &#32321;&#39636;&#20013;&#25991;.</code></pre><p>&#20854;&#23526;&#36889;&#31532;&#19968;&#27493;&#30340;&#25351;&#20196;&#65292;&#25033;&#35442;&#26159;&#23565;&#38750;&#24037;&#31243;&#24107;&#20358;&#35498;&#26368;&#22256;&#38627;&#30340;&#22320;&#26041;&#12290;&#22240;&#28858;&#19968;&#38283;&#22987;&#36984;&#25799;&#20160;&#40636;&#27171;&#30340;&#12300;&#32178;&#38913;&#25216;&#34899;&#22871;&#20214;&#12301;&#65292;&#26371;&#22823;&#22823;&#24433;&#38911;&#24460;&#32396;&#32178;&#31449;&#30340;&#21487;&#32173;&#35703;&#24615;&#33287;&#24310;&#23637;&#24615;&#12290; &#36889;&#37002;&#20998;&#20139;&#25105;&#19979;&#30340; tech stack &#25351;&#20196;&#12290;&#36889;&#19968;&#27573;&#26159;&#25105;&#20197;&#21069;&#22312;&#24118;&#38283;&#30332;&#23560;&#26696;&#26178;&#65292;&#21453;&#35206;&#30952;&#20986;&#20358;&#30340;&#32147;&#39511;&#32068;&#21512;&#8202;&#8212;&#8202;&#8212; &#26082;&#35201;&#29694;&#20195;&#12289;&#35201;&#24555;&#65292;&#21448;&#35201;&#23481;&#26131;&#25972;&#21512;&#20803;&#20214;&#24235;&#33287;&#21205;&#30059;&#65292;&#20063;&#35201;&#35731;&#24460;&#38754;&#32173;&#35703;&#19981;&#38957;&#30171;&#12290;</p><p><strong>&#36889;&#20195;&#34920;&#65306;&#36319;&#24037;&#31243;&#24107;&#21839;&#28165;&#26970;&#25216;&#34899;&#26550;&#27083;&#65292;&#25551;&#36848;&#20320;&#24819;&#35201;&#20160;&#40636;&#65292;AI&#23601;&#33021;&#24171;&#20320;&#38283;&#24037;&#12290;</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yd3t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yd3t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 424w, https://substackcdn.com/image/fetch/$s_!Yd3t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 848w, https://substackcdn.com/image/fetch/$s_!Yd3t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 1272w, https://substackcdn.com/image/fetch/$s_!Yd3t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yd3t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png" width="2000" height="1276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1276,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Yd3t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 424w, https://substackcdn.com/image/fetch/$s_!Yd3t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 848w, https://substackcdn.com/image/fetch/$s_!Yd3t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 1272w, https://substackcdn.com/image/fetch/$s_!Yd3t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b35d20-c2ab-448b-94bf-f57002d9de18_800x510.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#19978;&#38754;AI&#27794;&#26377;&#23562;&#37325;&#25105;&#35498;&#21916;&#27489;&#32160;&#33394;&#65292;&#20006;&#19988;&#35201;&#32321;&#39636;&#20013;&#25991;&#30340;&#21151;&#33021;&#12290;&#21487;&#33021;&#19968;&#27425;&#35611;&#22826;&#22810;&#20102;&#65292;&#25152;&#20197;&#25552;&#31034;&#19968;&#19979;</p><pre><code>I wish to have greenish design, 
and I want i18n with default to &#32321;&#39636;&#20013;&#25991;</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!69Om!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!69Om!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 424w, https://substackcdn.com/image/fetch/$s_!69Om!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 848w, https://substackcdn.com/image/fetch/$s_!69Om!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 1272w, https://substackcdn.com/image/fetch/$s_!69Om!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!69Om!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png" width="992" height="536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:992,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!69Om!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 424w, https://substackcdn.com/image/fetch/$s_!69Om!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 848w, https://substackcdn.com/image/fetch/$s_!69Om!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 1272w, https://substackcdn.com/image/fetch/$s_!69Om!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86a9ad0-db15-470e-8d06-cd43332c66d7_800x432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#20013;&#38291;&#26377;&#20491;&#23567;bug&#20986;&#29694;&#65292;&#25105;&#28961;&#33126;&#40670;&#19968;&#19979;&#21483;&#20182;&#20462;&#65292;&#28982;&#24460;&#23601;87%&#23436;&#25104;&#20102;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V7Z1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V7Z1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 424w, https://substackcdn.com/image/fetch/$s_!V7Z1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 848w, https://substackcdn.com/image/fetch/$s_!V7Z1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 1272w, https://substackcdn.com/image/fetch/$s_!V7Z1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V7Z1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png" width="2000" height="1293" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1293,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!V7Z1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 424w, https://substackcdn.com/image/fetch/$s_!V7Z1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 848w, https://substackcdn.com/image/fetch/$s_!V7Z1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 1272w, https://substackcdn.com/image/fetch/$s_!V7Z1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583da04b-925a-4a2e-b42a-bf9f1ee3997a_800x517.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3>&#128230; &#19978;&#20659;&#32032;&#26448;&#65288;&#26368;&#36817;&#25165;release&#30340;&#21151;&#33021;&#65289;&#65306;24 &#24373;&#22294;&#29255;&#65292;AI &#33258;&#21205;&#20998;&#39006;</h3><p>&#25105;&#20107;&#20808;&#28310;&#20633;&#22909;&#20102; 24 &#24373;&#22294;&#65306;1~12 &#26376;&#20221;&#30340;&#12300;&#35712;&#32147;&#34920;&#12301;&#65288;&#27491;&#38754;&#65289;&#33287;&#12300;&#35373;&#35336;&#22294;&#12301;&#65288;&#32972;&#38754;&#65289;&#65292;&#27284;&#21517;&#23601;&#26159; <code>1.png ~ 24.png</code>&#12290;</p><p>&#25105;&#36319; AI &#35498;&#65306;</p><pre><code>I uploaded january's front and back image (1.png and 2.png), 
february is 3.png and 4.png, ...etc</code></pre><p>&#23601;&#36889;&#27171;&#65292;&#23427;&#33258;&#24049;&#34389;&#29702;&#22909;&#20102;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i6nB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i6nB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 424w, https://substackcdn.com/image/fetch/$s_!i6nB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 848w, https://substackcdn.com/image/fetch/$s_!i6nB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 1272w, https://substackcdn.com/image/fetch/$s_!i6nB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i6nB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png" width="2000" height="1298" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1298,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!i6nB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 424w, https://substackcdn.com/image/fetch/$s_!i6nB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 848w, https://substackcdn.com/image/fetch/$s_!i6nB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 1272w, https://substackcdn.com/image/fetch/$s_!i6nB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cc71b80-d687-4178-86ed-8b6d589dc54d_800x519.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3>&#128295; &#25351;&#20196;&#24494;&#35519;&#33287;&#21839;&#38988;&#20462;&#27491;&#65288;&#20687;&#22312;&#24118;&#23560;&#26696;&#19968;&#27171;&#65289;</h3><p>&#36942;&#31243;&#20013;&#65292;&#25105;&#30332;&#29694;&#24190;&#20491; UX &#21839;&#38988;&#65292;&#26044;&#26159;&#30452;&#25509;&#12300;&#25913;&#38656;&#27714;&#12301;&#65306;</p><h3>1. &#25913;&#36914;&#25163;&#27231; UX&#65306;&#22294;&#29255;&#36617;&#20837;&#26178;&#35201;&#26377;&#26126;&#30906;&#25552;&#31034;</h3><pre><code>When I click on the calendar card and there is a pop-up, 
the image is loading in real time, 
but the visual effect is not clear that it&#8217;s loading. 
Could you improve the user experience on this issue?</code></pre><p>AI &#31435;&#21051;&#25913;&#20102;&#65292;&#22294;&#29255;&#36996;&#27794;&#36617;&#22909;&#26178;&#26371;&#39023;&#31034; loading spinner&#65292;&#36991;&#20813;&#20351;&#29992;&#32773;&#21345;&#20303;&#12290;</p><h3>2. &#23567;bug&#65306;&#20462;&#27491;&#32763;&#38913;&#21205;&#30059;</h3><pre><code>upon click month card, the calendar card is shown in the popup. 
I wish to flip to the back side (the design) 
when I click the image in the popup. 
There should be an animation of flipping card</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BnKv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BnKv!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 424w, https://substackcdn.com/image/fetch/$s_!BnKv!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 848w, https://substackcdn.com/image/fetch/$s_!BnKv!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 1272w, https://substackcdn.com/image/fetch/$s_!BnKv!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BnKv!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif" width="1024" height="1900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1900,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!BnKv!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 424w, https://substackcdn.com/image/fetch/$s_!BnKv!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 848w, https://substackcdn.com/image/fetch/$s_!BnKv!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 1272w, https://substackcdn.com/image/fetch/$s_!BnKv!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe38a4292-c333-4470-8652-bf5ba60eba2d_1024x1900.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>3. &#21152;&#20837;&#12300;&#26376;&#20221;&#35299;&#37782;&#27231;&#21046;&#12301;</h3><p>&#25105;&#24076;&#26395;<strong>&#26410;&#20358;&#30340;&#26376;&#20221;&#19981;&#33021;&#40670;&#25802;</strong>&#65292;&#22686;&#21152;&#19968;&#40670;&#26399;&#24453;&#24863;&#65306;</p><pre><code>Can you lock each month's card until 1 month before? 
For example, user can not click on September until August.</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RBaJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RBaJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 424w, https://substackcdn.com/image/fetch/$s_!RBaJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 848w, https://substackcdn.com/image/fetch/$s_!RBaJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 1272w, https://substackcdn.com/image/fetch/$s_!RBaJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RBaJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png" width="2000" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RBaJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 424w, https://substackcdn.com/image/fetch/$s_!RBaJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 848w, https://substackcdn.com/image/fetch/$s_!RBaJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 1272w, https://substackcdn.com/image/fetch/$s_!RBaJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aa5a3e8-8898-4b58-a34d-0b809f1ae1a1_800x391.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>AI &#20570;&#21040;&#20102;&#65292;&#36996;&#26371;&#33258;&#21205;&#26681;&#25818;&#30446;&#21069;&#26178;&#38291;&#27770;&#23450;&#21738;&#24190;&#20491;&#26376;&#21487;&#40670;&#12290;</p><p>Lovable&#20063;&#25226; custom domain &#25972;&#21512;&#30340;&#24456;&#22909;&#65292;&#36889;&#22602;&#25105;&#23601;&#19981;&#35443;&#36848;&#20102;&#65292;&#35531;<a href="https://docs.lovable.dev/tips-tricks/custom-domain">&#23448;&#26041;&#25991;&#20214;</a>&#65292;&#22522;&#26412;&#19978;&#20063;&#26159;&#40670;&#19968;&#40670;&#23601;&#20986;&#20358;&#20102;&#12290;</p><div><hr></div><h3>&#19968;&#20491;&#21487;&#20197; demo &#30340;&#29986;&#21697;</h3><p>&#19981;&#21040; 30 &#20998;&#37912;&#65292;&#25105;&#23601;&#33021;&#25343;&#20986;&#19968;&#20491;&#21487;&#20197; demo &#30340; Web App&#65306;</p><ul><li><p>&#34892;&#21205;&#35037;&#32622;&#25903;&#25588;&#22909;</p></li><li><p>&#26377; loading &#29376;&#24907;</p></li><li><p>&#21345;&#29255;&#32763;&#38754;&#21205;&#30059;&#33258;&#28982;</p></li><li><p>&#26681;&#25818;&#26376;&#20221;&#35299;&#37782;</p></li><li><p>&#29992;&#32321;&#39636;&#20013;&#25991;&#39023;&#31034;</p></li><li><p>&#28961;&#38920;&#24460;&#31471;&#65292;Custom domain&#36319; Cloudflare &#25972;&#21512;&#21448;&#26041;&#20415;&#21448;&#24555;</p></li></ul><p>&#36889;&#20491;&#23560;&#26696;&#30340;&#20729;&#20540;&#19981;&#22312;&#25216;&#34899;&#65292;&#32780;&#22312;&#65306;<strong>&#25105;&#20497;&#25226;&#24819;&#27861;&#36681;&#28858;&#23526;&#39636;&#29986;&#21697;&#30340;&#38272;&#27323;&#65292;&#38477;&#21040;&#21069;&#25152;&#26410;&#26377;&#30340;&#20302;&#12290;</strong></p><div><hr></div><h3>&#26411;&#20102;&#30340;&#35441;</h3><ul><li><p><strong>&#32102;&#29986;&#21697;&#32147;&#29702;</strong>&#65306;POC&#19981;&#29992;&#25214;&#35373;&#35336;&#24107;&#20102;&#65292;&#20808;&#30475;&#30475; AI &#26377;&#27794;&#26377;&#25026;&#20320;&#21543;&#12290;</p></li><li><p><strong>&#32102;&#32769;&#38342;&#25110;&#25509;&#26696;&#20844;&#21496;</strong>&#65306;&#36889;&#20491;&#19990;&#30028;&#36317;&#38626;&#21448;&#24555;&#21448;&#31337;&#21448;&#22909;&#30340;&#26085;&#23376;&#36234;&#20358;&#36234;&#38752;&#36817;&#20102;&#12290;</p></li><li><p><strong>&#32102;&#29238;&#27597;</strong>&#65306;&#22914;&#26524;&#20320;&#38656;&#35201;&#19968;&#25163;&#25265;&#23542;&#23542;&#65292;&#19968;&#25163;&#23531;code&#65292;&#23601;&#29992;&#35611;&#30340;&#25226;&#32178;&#38913;&#35611;&#20986;&#20358;&#21543;&#12290;&#19981;&#35201;&#20877;&#23475;&#24597;&#29983;&#23567;&#23401;&#20102;&#65281;</p></li></ul>]]></content:encoded></item><item><title><![CDATA[AI Agent 0 到 1: MCP Server with Goose]]></title><description><![CDATA[&#21363;&#20415;&#36879;&#36942;&#35264;&#24565;&#19978;&#30340;&#35299;&#37323;&#65306;MCP AI Agent&#22312;&#32005;&#20160;&#40636;&#65292;&#19981;&#33258;&#24049;&#21205;&#25163;&#20570;&#20570;&#30475;&#65292;&#21487;&#33021;&#36996;&#26159;&#24456;&#38627;&#20102;&#35299;AI Agent&#21040;&#24213;&#26159;&#20160;&#40636;&#12290;&#36889;&#31687;&#25991;&#31456;&#25163;&#25226;&#25163;&#25945;&#20320;&#29992;MCP Server&#24314;&#21046;&#19968;&#20491;AI Agent&#65292;&#36899;&#25509;Goose&#25110;&#32773;&#20351;&#29992;Claude Desktop&#20351;&#29992;&#20320;&#30340;AI Too]]></description><link>https://blog.schwannden.com/p/mcp-server-with-goose</link><guid isPermaLink="false">https://blog.schwannden.com/p/mcp-server-with-goose</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Thu, 20 Mar 2025 03:45:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ff98768e-5791-4b54-8c34-aac96dd5cc33_800x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gsXr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gsXr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 424w, https://substackcdn.com/image/fetch/$s_!gsXr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 848w, https://substackcdn.com/image/fetch/$s_!gsXr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 1272w, https://substackcdn.com/image/fetch/$s_!gsXr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gsXr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gsXr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 424w, https://substackcdn.com/image/fetch/$s_!gsXr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 848w, https://substackcdn.com/image/fetch/$s_!gsXr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 1272w, https://substackcdn.com/image/fetch/$s_!gsXr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d34dc4f-d7ac-4bde-a6ed-d2fbba28b8ed_800x400.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">AI Agent 0 &#21040; 1: MCP Server with&nbsp;Goose</figcaption></figure></div><p>&#21363;&#20415;&#36879;&#36942;&#35264;&#24565;&#19978;&#30340;&#35299;&#37323;&#65306;<a href="https://blog.schwannden.com/mcp-ai-agent-e5-9c-a8-e7-b4-85-e4-bb-80-e9-ba-bc/">MCP AI Agent&#22312;&#32005;&#20160;&#40636;</a>&#65292;&#19981;&#33258;&#24049;&#21205;&#25163;&#20570;&#20570;&#30475;&#65292;&#21487;&#33021;&#36996;&#26159;&#24456;&#38627;&#20102;&#35299;AI Agent&#21040;&#24213;&#26159;&#20160;&#40636;&#12290;&#36889;&#31687;&#25991;&#31456;&#25163;&#25226;&#25163;&#25945;&#20320;&#29992;MCP Server&#24314;&#21046;&#19968;&#20491;AI Agent&#65292;&#36899;&#25509;Goose&#25110;&#32773;&#20351;&#29992;Claude Desktop&#20351;&#29992;&#20320;&#30340;AI Tool&#12290;</p><p>(<a href="https://github.com/schwannden/mcp-server-demo/tree/main">&#23560;&#26696;&#20195;&#30908;&#22312;&#36889;&#37002;</a>)</p><h3>&#24314;&#21046;&#20320;&#30340;MCP Server&#23560;&#26696;</h3><p><strong>&#23433;&#35037;uv (python package manager)</strong>: <a href="https://docs.astral.sh/uv/getting-started/installation/">https://docs.astral.sh/uv/getting-started/installation/</a>&#65292;&#30906;&#35469;&#20320;&#30340;uv&#23433;&#35037;&#36335;&#24465;</p><pre><code>which uv 
# &#25105;&#30340;&#36335;&#24465;&#22312; ${HOME}/.local/bin/uv</code></pre><p>&#21021;&#22987;&#21270;&#23560;&#26696;</p><pre><code>uv init --package mcp-server-demo 
cd mcp-server-demo 
uv add "mcp[cli]" pydantic loguru faker</code></pre><p>&#20351;&#29992;&#20320;&#30340;IDE/&#32232;&#36655;&#22120;&#21109;&#24314;</p><pre><code># src/mcp_server_demo/server.py 
 
import random 
from loguru import logger 
from mcp.server.fastmcp import FastMCP 
from faker import Faker 
 
fake = Faker() 
 
# Create an MCP server 
mcp = FastMCP("mcp-server-demo") 
 
# Add an addition tool 
@mcp.tool() 
def get_order_info(order_id: str) -&gt; dict: 
    """Get the status of an order""" 
    status = ["success", "delayed", "cancelled", "pending_payment"] 
    order_info = { 
        "order_id": order_id, 
        "status": random.choice(status), 
        "client_email": fake.email(), 
    } 
    logger.info(f"Order info: {order_info}") 
    return order_info 
 
 
@mcp.tool() 
def send_coupon_to_user(order_id: str, customer_email: str) -&gt; str: 
    """Send a coupon to the user to make user happy""" 
    logger.info(f"send coupon to {customer_email} for order {order_id}") 
    return f"Coupon sent to {customer_email}"src/mcp_server_demo/__init__.py</code></pre><pre><code># src/mcp_server_demo/__init__.py 
 
from .server import mcp 
from loguru import logger 
 
def main() -&gt; None: 
    logger.info("Starting MCP server demo") 
    mcp.run() 
 
 
if __name__ == "__main__": 
    main()</code></pre><pre><code># src/mcp_server_demo/__main__.py 
 
from mcp_server_demo import main 
 
main()</code></pre><p>&#28204;&#35430;&#19968;&#19979; <code>uv run mcp-server-demo</code></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YJTR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YJTR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 424w, https://substackcdn.com/image/fetch/$s_!YJTR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 848w, https://substackcdn.com/image/fetch/$s_!YJTR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 1272w, https://substackcdn.com/image/fetch/$s_!YJTR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YJTR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png" width="1540" height="124" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:124,&quot;width&quot;:1540,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!YJTR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 424w, https://substackcdn.com/image/fetch/$s_!YJTR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 848w, https://substackcdn.com/image/fetch/$s_!YJTR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 1272w, https://substackcdn.com/image/fetch/$s_!YJTR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7248c44-194c-463e-b5fd-7b59a98b0335_800x64.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>&#30475;&#21040;&#36889;&#20123;&#35338;&#24687;&#23601;&#34920;&#31034;&#25104;&#21151;&#22217;&#65292;&#21487;&#20197;ctrl + C&#38364;&#25481;&#20182;&#20102;</p><h3>&#23433;&#35037; Goose</h3><p>&#24478;Goose&#23448;&#26041;&#25991;&#20214;&#23433;&#35037;: <a href="https://block.github.io/goose/docs/quickstart">https://block.github.io/goose/docs/quickstart</a></p><p>Goose &#26159;&#19968;&#20491;&#38283;&#28304;&#30340; MCP &#23458;&#25142;&#31471;&#65292;&#35731;&#20320;&#21487;&#20197;&#37197;&#32622;&#33258;&#24049;&#30340; LLM &#25552;&#20379;&#32773;&#65288;&#20351;&#29992; API &#37329;&#38000;&#65289;&#65292;&#22312;&#33258;&#24049;&#30340;&#27231;&#22120;&#19978;&#36939;&#34892;&#65292;&#20006;&#33287;&#20320;&#30340; AI &#20195;&#29702;&#65288;MCP &#20282;&#26381;&#22120;&#65289;&#20114;&#21205;&#12290;</p><blockquote><p>&#22914;&#26524;&#20320;&#27794;&#26377;&#20219;&#20309;LLM&#37329;&#38000;&#65292;&#20063;&#28961;&#27861;&#25645;&#36617;&#26412;&#22320;&#30340;LLM&#65292;&#21487;&#20197;&#19979;&#36617; Claude Desktop&#65292;&#29992;&#20320;&#30340;&#20813;&#36027;&#38989;&#24230;&#20358;&#29609;&#29609;&#30475;&#65306;<a href="https://modelcontextprotocol.io/quickstart/user">https://modelcontextprotocol.io/quickstart/user</a></p></blockquote><p>&#22312;Good &#19978;&#38754;&#35373;&#23450;&#20320;&#30340; LLM &#20379;&#25033;&#21830;&#65306;<a href="https://block.github.io/goose/docs/getting-started/providers">https://block.github.io/goose/docs/getting-started/providers</a></p><p>&#25171;&#38283;Goose&#35373;&#23450; -&gt; Add custom extensions</p><p>Command&#37027;&#37002;&#35201;&#25918; <code>{path to uv} run {path to your project}/.venv/bin</code> <code>mcp-server-demo</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NNaG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NNaG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 424w, https://substackcdn.com/image/fetch/$s_!NNaG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 848w, https://substackcdn.com/image/fetch/$s_!NNaG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 1272w, https://substackcdn.com/image/fetch/$s_!NNaG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NNaG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png" width="956" height="1478" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1478,&quot;width&quot;:956,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NNaG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 424w, https://substackcdn.com/image/fetch/$s_!NNaG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 848w, https://substackcdn.com/image/fetch/$s_!NNaG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 1272w, https://substackcdn.com/image/fetch/$s_!NNaG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0984cb1a-aa89-4592-a4c0-55e9ed6b14b1_800x1237.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#25353;Add&#65292;&#21487;&#20197;&#21152;&#20837;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YgnB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YgnB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 424w, https://substackcdn.com/image/fetch/$s_!YgnB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 848w, https://substackcdn.com/image/fetch/$s_!YgnB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 1272w, https://substackcdn.com/image/fetch/$s_!YgnB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YgnB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png" width="2000" height="1003" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1003,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!YgnB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 424w, https://substackcdn.com/image/fetch/$s_!YgnB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 848w, https://substackcdn.com/image/fetch/$s_!YgnB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 1272w, https://substackcdn.com/image/fetch/$s_!YgnB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5250a1c-eb92-465f-b7d0-d9da66021372_800x401.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Qaa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Qaa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 424w, https://substackcdn.com/image/fetch/$s_!-Qaa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 848w, https://substackcdn.com/image/fetch/$s_!-Qaa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 1272w, https://substackcdn.com/image/fetch/$s_!-Qaa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Qaa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png" width="2000" height="1003" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b04311d5-e965-41c2-84af-46635898a9d0_800x401.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1003,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-Qaa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 424w, https://substackcdn.com/image/fetch/$s_!-Qaa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 848w, https://substackcdn.com/image/fetch/$s_!-Qaa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 1272w, https://substackcdn.com/image/fetch/$s_!-Qaa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb04311d5-e965-41c2-84af-46635898a9d0_800x401.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#23526;&#38555;&#22580;&#26223;</h3><p>&#22914;&#26524;&#25105;&#20497;&#21839;&#20102;&#19968;&#20491;&#19981;&#28165;&#19981;&#26970;&#30340;&#21839;&#38988;&#65288;&#27794;&#26377;&#25552;&#20379;&#35330;&#21934;&#36039;&#35338;&#65289;&#65292;&#36879;&#36942;&#24037;&#20855;&#25552;&#20379;&#30340;&#36039;&#35338;&#65292;Goose&#21487;&#20197;&#35531;&#25105;&#20497;&#25552;&#20379;&#35443;&#32048;&#36039;&#35338;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f-FM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f-FM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 424w, https://substackcdn.com/image/fetch/$s_!f-FM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 848w, https://substackcdn.com/image/fetch/$s_!f-FM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 1272w, https://substackcdn.com/image/fetch/$s_!f-FM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f-FM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png" width="2000" height="292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:292,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!f-FM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 424w, https://substackcdn.com/image/fetch/$s_!f-FM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 848w, https://substackcdn.com/image/fetch/$s_!f-FM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 1272w, https://substackcdn.com/image/fetch/$s_!f-FM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faef31a6d-6208-4ee0-9ece-2e4b8512af67_800x117.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>&#30070;&#25105;&#20497;&#35426;&#21839;&#26576;&#19968;&#31558;&#24310;&#36978;&#30340;&#35330;&#21934;&#65292;&#31995;&#32113;&#20027;&#21205;&#21578;&#35380;&#25105;&#20497;&#35201;&#19981;&#35201;&#20351;&#29992;coupon&#24037;&#20855;&#30332;&#25918;&#20778;&#24800;&#21367;&#65292;&#20006;&#19988;&#20351;&#29992;&#35330;&#21934;&#26597;&#21040;&#21040;&#20351;&#29992;&#32773;email&#36914;&#34892;&#30332;&#25918;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J6pC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J6pC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 424w, https://substackcdn.com/image/fetch/$s_!J6pC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 848w, https://substackcdn.com/image/fetch/$s_!J6pC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 1272w, https://substackcdn.com/image/fetch/$s_!J6pC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J6pC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png" width="2000" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!J6pC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 424w, https://substackcdn.com/image/fetch/$s_!J6pC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 848w, https://substackcdn.com/image/fetch/$s_!J6pC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 1272w, https://substackcdn.com/image/fetch/$s_!J6pC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400eaee-b487-4044-bf19-be11ed3a7ee8_800x328.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#22914;&#26524;&#25105;&#35498;&#22909;&#65292;&#31995;&#32113;&#36996;&#21487;&#20197;&#35731;&#25105;&#25163;&#21205;&#23529;&#26680;&#21516;&#24847;&#20877;&#34892;&#21205;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!86iy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!86iy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 424w, https://substackcdn.com/image/fetch/$s_!86iy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 848w, https://substackcdn.com/image/fetch/$s_!86iy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 1272w, https://substackcdn.com/image/fetch/$s_!86iy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!86iy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png" width="2000" height="454" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:454,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!86iy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 424w, https://substackcdn.com/image/fetch/$s_!86iy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 848w, https://substackcdn.com/image/fetch/$s_!86iy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 1272w, https://substackcdn.com/image/fetch/$s_!86iy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b1213ca-6da0-460b-a3db-234ff9a113ad_800x182.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iN0-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iN0-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 424w, https://substackcdn.com/image/fetch/$s_!iN0-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 848w, https://substackcdn.com/image/fetch/$s_!iN0-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 1272w, https://substackcdn.com/image/fetch/$s_!iN0-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iN0-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png" width="2000" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!iN0-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 424w, https://substackcdn.com/image/fetch/$s_!iN0-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 848w, https://substackcdn.com/image/fetch/$s_!iN0-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 1272w, https://substackcdn.com/image/fetch/$s_!iN0-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5b9d716-fd4a-4fa7-b525-9ef68750b058_800x270.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#19979;&#19968;&#27493;</h3><p>&#30475;&#35211;AI Agent&#24590;&#27171;&#21644;Chatbot&#20114;&#21205;&#65292;&#25033;&#35442;&#26356;&#21487;&#20197;&#20102;&#35299;AI Agent&#30340;&#20729;&#20540;&#20102;&#21543;&#65281;&#20659;&#32113;&#36575;&#39636;&#38283;&#30332;&#36890;&#24120;&#30001;&#24460;&#31471;&#25972;&#21512;&#31532;&#19977;&#26041;&#26381;&#21209;&#65292;&#21069;&#31471;&#36000;&#36012; UI/UX&#65292;&#30906;&#20445;&#20351;&#29992;&#32773;&#39636;&#39511;&#12290;&#20294;&#36889;&#31278;&#26041;&#24335;&#35201;&#27714;&#38283;&#30332;&#32773;&#25484;&#25569;&#25152;&#26377;&#37007;&#36655;&#65292;&#20006;&#33258;&#34892;&#20018;&#25509;&#21508;&#31278;&#26381;&#21209;&#65292;&#20197;&#32173;&#25345;&#23436;&#25972;&#25511;&#21046;&#27402;&#12290;</p><p>&#38568;&#33879;&#29983;&#25104;&#24335; AI&#65288;Generative AI&#65289;&#33287; AI Agent &#30340;&#30332;&#23637;&#65292;&#35373;&#35336;&#24605;&#32173;&#38283;&#22987;&#36681;&#35722;&#12290;&#25105;&#20497;&#21487;&#36879;&#36942; AI Agent &#23450;&#32681;&#26989;&#21209;&#37007;&#36655;&#65292;&#20006;&#36879;&#36942;&#27161;&#28310;&#21270;&#21332;&#35696;&#65288;&#22914; Anthropic &#30340; Multi-Context Protocol, MCP&#65289;&#31649;&#29702; AI &#33287; LLM&#65288;&#22823;&#35486;&#35328;&#27169;&#22411;&#65289;&#30340;&#20114;&#21205;&#12290;&#36889;&#35731;&#38283;&#30332;&#32773;&#28961;&#38656;&#38364;&#27880;&#20659;&#32113;&#30340;&#24460;&#31471;&#37007;&#36655;&#33287;&#21069;&#31471;&#38283;&#30332;&#65292;&#32780;&#26159;&#23560;&#27880;&#26044; AI Agent &#30340;&#34892;&#28858;&#35373;&#35336;&#65292;&#35731; AI &#33258;&#20027;&#34389;&#29702;&#20219;&#21209;&#12290;</p><p>&#36889;&#31278;&#27169;&#24335;&#25552;&#21319;&#20102;&#38283;&#30332;&#38728;&#27963;&#24615;&#65292;&#29305;&#21029;&#36969;&#29992;&#26044;&#24555;&#36895;&#39511;&#35657;&#26032;&#24819;&#27861;&#65288;Prototype&#65289;&#12290;&#38283;&#30332;&#32773;&#21482;&#38656;&#23450;&#32681; AI Agent &#30340;&#26680;&#24515;&#21151;&#33021;&#65292;&#32780;&#28961;&#38656;&#25237;&#20837;&#22823;&#37327;&#26178;&#38291;&#33287;&#36039;&#28304;&#25645;&#24314;&#23436;&#25972;&#30340;&#21069;&#24460;&#31471;&#26550;&#27083;&#65292;&#36879;&#36942; MCP &#27161;&#28310;&#21270;&#30340;&#20114;&#21205;&#65292;&#21363;&#21487;&#24555;&#36895;&#33853;&#22320;&#25033;&#29992;&#12290;</p><p>&#25509;&#33879;&#20320;&#21487;&#20197;&#65306;</p><ol><li><p>Fork &#23560;&#26696;&#33258;&#24049;&#20358;&#29609;&#29609;&#30475;&#65306;<a href="https://github.com/schwannden/mcp-server-demo">https://github.com/schwannden/mcp-server-demo</a></p></li><li><p>&#30475;&#30475; MCP &#23448;&#26041;&#30340; Reference Server: <a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p></li><li><p>&#21152;&#20837;Goose Discrod&#30475;&#30475;&#20854;&#20182;&#20154;&#22312;&#20570;&#20160;&#40636;&#37239;&#37239;&#30340;&#20107;&#24773;&#65306;<a href="https://discord.com/invite/block-opensource">https://discord.com/invite/block-opensource</a></p></li></ol>]]></content:encoded></item><item><title><![CDATA[What’s the Fuss About MCP AI Agent]]></title><description><![CDATA[(This is a chat gpt tranlated article from&#8230;]]></description><link>https://blog.schwannden.com/p/whats-the-fuzz-about-mcp-ai-agent</link><guid isPermaLink="false">https://blog.schwannden.com/p/whats-the-fuzz-about-mcp-ai-agent</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Wed, 19 Mar 2025 07:17:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c2c790bd-5a67-462a-b038-501187731eb3_800x571.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!998k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!998k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 424w, https://substackcdn.com/image/fetch/$s_!998k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 848w, https://substackcdn.com/image/fetch/$s_!998k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 1272w, https://substackcdn.com/image/fetch/$s_!998k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!998k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!998k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 424w, https://substackcdn.com/image/fetch/$s_!998k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 848w, https://substackcdn.com/image/fetch/$s_!998k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 1272w, https://substackcdn.com/image/fetch/$s_!998k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96d102f5-d84a-47ef-ba6a-9dff2798c346_800x571.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>(This is a chat gpt tranlated article from: <a href="https://blog.schwannden.com/mcp-ai-agent-e5-9c-a8-e7-b4-85-e4-bb-80-e9-ba-bc/">https://medium.com/@schwanndenkuo/mcp-ai-agent%E5%9C%A8%E7%B4%85%E4%BB%80%E9%BA%BC-e7fd2523c749</a>)</p><p>(If you would rather like to start building your own AI agent, checkout: <a href="https://blog.schwannden.com/ai-agent-0-e5-88-b0-1-mcp-server-with-goose/">AI Agent 0 &#21040; 1: MCP Server with Goose</a>&#65289;</p><h3>Background Story</h3><p>As large language models (LLMs) like ChatGPT, Claude, and Gemini continue to evolve and become more powerful, the question arises: where is AI headed in the future? Tech industry leaders such as Andrew Ng, Elon Musk, and Jensen Huang have all pointed out that &#8220;AI Agents will be the next major milestone.&#8221; But what exactly is an AI Agent?</p><p>With more and more LLM providers offering advanced models and applications, we naturally wonder: is there an open and universal protocol that allows us to create AI Agents freely without being locked into a specific platform or provider?</p><h3>Limitations of LLMs</h3><p>When we use LLMs like ChatGPT or Claude, we can ask questions and have conversations, but they can&#8217;t actually &#8220;do&#8221; anything. For example, you can&#8217;t directly ask ChatGPT to book a restaurant, send an email, or fetch a report from your home NAS.</p><p>This is where <strong>AI Agents</strong> come into play. An AI Agent acts like a personal assistant that not only converses with you but also takes real actions based on your needs. For instance, if you want to know when a particular colleague last logged into your company&#8217;s system last month, a standard LLM wouldn&#8217;t be able to help because it lacks access to your company&#8217;s internal data. However, an AI Agent can accomplish this by calling the company&#8217;s internal APIs or querying the database to retrieve the relevant information instantly.</p><p>Another limitation of LLMs is that their responses are confined to their pre-trained knowledge. If you ask about a breaking news event or specific business data within your company, an LLM will often be clueless. To address this, we might use <strong>Retrieval-Augmented Generation (RAG)</strong>, which allows an LLM to &#8220;look up&#8221; additional data before responding. However, RAG works best when dealing with relatively static, infrequently changing data. For real-time or dynamic requests&#8202;&#8212;&#8202;such as checking the current shipping status of a customer&#8217;s order&#8202;&#8212;&#8202;RAG can be slow and costly.</p><p>On the other hand, an <strong>AI Agent</strong> functions like a real-world assistant that can handle tasks dynamically. If you ask, &#8220;Where is my order #12345 right now?&#8221; the AI Agent can immediately call your company&#8217;s logistics system API to provide a real-time, accurate response.</p><h3>Summary</h3><ul><li><p><strong>General LLMs</strong> act like &#8220;knowledgeable encyclopedias&#8221; that provide answers based on their training data but cannot take action.</p></li><li><p><strong>RAG-enhanced LLMs</strong> function as &#8220;encyclopedias with a database,&#8221; useful for retrieving external data but not ideal for real-time scenarios.</p></li><li><p><strong>AI Agents</strong> work like &#8220;assistants that can take action,&#8221; using tools and APIs to solve specific, real-time problems.</p></li></ul><h3>Limitations of AI Agents</h3><ol><li><p><strong>Interoperability Issue:</strong><br>With the rise of multiple LLM providers like Claude, Gemini, and OpenAI, AI-powered applications have diversified&#8202;&#8212;&#8202;from chatbots like ChatGPT to intelligent IDEs like Cursor. However, ensuring that an AI Agent can seamlessly integrate across different platforms is challenging. Ideally, we need a <strong>standardized protocol</strong> that allows an AI Agent to work flexibly across various platforms without being tied to a specific model or service provider.</p></li><li><p><strong>Limited Adaptability for Automation:</strong><br>Traditional AI Agents are designed primarily for human users&#8202;&#8212;&#8202;meaning they operate step by step based on user commands or predefined workflows. This limits their flexibility when used by <strong>other machines</strong> (such as client applications or automation services). Ideally, applications should be able to <strong>dynamically select and orchestrate different AI Agent tools</strong> based on real-time needs, rather than following rigid, pre-scripted sequences.</p></li></ol><h3>How MCP (Anthropic&#8217;s Model Context Protocol) Solves These Issues</h3><p>MCP introduces a <strong>standardized client-server architecture</strong> that effectively addresses these challenges. Developers can focus on creating independent function modules, known as <strong>MCP Servers</strong>, which handle specific tasks such as sending emails, managing calendars, or performing image recognition. Meanwhile, applications that integrate with LLMs&#8202;&#8212;&#8202;such as Claude Chatbot or intelligent IDEs like Cursor&#8202;&#8212;&#8202;act as <strong>MCP Clients</strong>. These MCP Clients can dynamically explore and identify available functionalities provided by MCP Servers, selecting the most appropriate tools for complex tasks.</p><p>This structured collaboration makes AI Agents more <strong>interoperable</strong>, easier for machines to understand, and <strong>seamlessly automatable</strong>, enhancing the flexibility and efficiency of the entire AI ecosystem.</p><h3>Real-World Workflow Example</h3><p>Imagine you&#8217;ve built an AI customer service chatbot using MCP that integrates two tools:</p><ol><li><p><strong>Order Tracking Tool</strong>&#8202;&#8212;&#8202;Connects to your company&#8217;s database to check order status based on a provided order number.</p></li><li><p><strong>Coupon Issuance Tool</strong>&#8202;&#8212;&#8202;Dynamically decides whether to issue discount coupons if a customer is dissatisfied.</p></li></ol><h4>Scenario: A Customer Inquiry</h4><p>A customer asks the AI chatbot:<br><em>&#8220;My order #12345 has been delayed for two weeks. Can you check on it for me?&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!otpT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!otpT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 424w, https://substackcdn.com/image/fetch/$s_!otpT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 848w, https://substackcdn.com/image/fetch/$s_!otpT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 1272w, https://substackcdn.com/image/fetch/$s_!otpT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!otpT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png" width="1472" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2214486-c1da-415f-916e-55b1cb504916_800x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1472,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!otpT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 424w, https://substackcdn.com/image/fetch/$s_!otpT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 848w, https://substackcdn.com/image/fetch/$s_!otpT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 1272w, https://substackcdn.com/image/fetch/$s_!otpT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2214486-c1da-415f-916e-55b1cb504916_800x396.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p><strong>MCP Client (e.g., Claude Chatbot) analyzes the request</strong> and determines that it needs external tools to complete the task.</p></li><li><p>It dynamically queries the <strong>MCP Server</strong> to check what tools are available.</p></li><li><p>The <strong>MCP Server</strong> responds with a list of available tools and how to use them.</p></li><li><p>The AI <strong>decides to first call the Order Tracking Tool</strong>, using order number <strong>#12345</strong> to check the status.</p></li><li><p>Suppose the response indicates <strong>&#8220;Shipment delayed, not yet dispatched.&#8221;</strong></p></li><li><p>The LLM understands that the customer might be dissatisfied, so it <strong>calls the Coupon Issuance Tool</strong> to offer compensation.</p></li><li><p>The AI chatbot responds: <em>&#8220;Your order is delayed due to a logistics issue. We sincerely apologize for the inconvenience. As a token of our apology, we&#8217;re offering you a discount coupon.&#8221;</em></p></li></ol><p>Now, if the order status instead showed <strong>&#8220;Payment not completed.&#8221;</strong></p><ul><li><p>The AI <strong>would not issue a coupon</strong> since the issue isn&#8217;t a shipping delay.</p></li><li><p>Instead, it would respond: <em>&#8220;Your order is awaiting payment. Please complete the payment, and we will process the shipment immediately. Thank you!&#8221;</em></p></li></ul><p>In this scenario, <strong>we didn&#8217;t need to manually code logic for every possible situation</strong>. By simply providing MCP Server tools, the LLM itself can <strong>dynamically decide which tools to use</strong> to resolve issues intelligently.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mVqv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mVqv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 424w, https://substackcdn.com/image/fetch/$s_!mVqv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 848w, https://substackcdn.com/image/fetch/$s_!mVqv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 1272w, https://substackcdn.com/image/fetch/$s_!mVqv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mVqv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png" width="1384" height="686" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:686,&quot;width&quot;:1384,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mVqv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 424w, https://substackcdn.com/image/fetch/$s_!mVqv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 848w, https://substackcdn.com/image/fetch/$s_!mVqv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 1272w, https://substackcdn.com/image/fetch/$s_!mVqv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7d2804-f14e-4f50-8977-faced3c51971_800x397.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Frequently Asked Questions (FAQ)</h3><h4>Q: Who developed MCP?</h4><p><strong>A:</strong> MCP was introduced by <strong>Anthropic</strong> as a protocol that enables AI models to interact more flexibly with external tools. However, MCP is not exclusive to Anthropic&#8217;s AI models (e.g., Claude) but is designed as an <strong>open, vendor-agnostic standard</strong> that any AI model can use.</p><h4>Q: How does MCP work?</h4><p><strong>A:</strong> The workflow follows these steps:</p><ol><li><p>The <strong>MCP Client</strong> (e.g., Claude, <a href="https://github.com/block/goose">Goose</a>, etc.) sends a request to the <strong>MCP Server</strong>.</p></li><li><p>The <strong>MCP Server</strong> responds with available tools, resources, and prompts.</p></li><li><p>The <strong>MCP Client</strong> determines which tools to use and what data to provide to the AI model to fulfill the user request.</p></li></ol><p>This allows AI to dynamically select and combine different tools to complete tasks more efficiently.</p><h4>Q: Is MCP limited to Claude?</h4><p><strong>A:</strong> No. While <strong>Claude Desktop</strong> is an MCP Client developed by Anthropic, MCP itself is not tied to any single AI vendor. For example, <strong><a href="https://github.com/block/goose">Goose</a></strong> is a rapidly growing MCP Client that supports integration with various LLM APIs and features an <strong>MCP Server marketplace</strong> offering a variety of tools.</p><h4>Q: Are there security risks with MCP? How can we ensure its security?</h4><p><strong>A:</strong> MCP does not require sending sensitive data to AI models by default. Security depends on how MCP Servers manage data transmission. Best practices include:</p><ul><li><p><strong>Access control:</strong> Restrict API and tool access to prevent data leaks.</p></li><li><p><strong>API key management:</strong> Securely store and manage API keys to prevent unauthorized access.</p></li><li><p><strong>Monitoring and auditing:</strong> Track API calls and data access to detect and mitigate security risks.</p></li></ul><p>By following these practices, MCP can be implemented securely while maintaining data integrity.</p><h3>Useful Resources</h3><ul><li><p><strong><a href="https://modelcontextprotocol.io/introduction">MCP Official Website</a></strong></p></li><li><p><strong><a href="https://github.com/modelcontextprotocol/servers">MCP Reference Servers</a></strong></p></li><li><p><strong><a href="https://modelcontextprotocol.io/clients">List of MCP Clients &amp; Supported Protocol Features</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[MCP AI Agent在紅什麼]]></title><description><![CDATA[&#65288;&#27604;&#36215;&#35264;&#24565;&#30340;&#20102;&#35299;&#65292;&#22914;&#26524;&#20320;&#24819;&#35201;&#30452;&#25509;&#21205;&#25163;&#65292;&#35531;&#30475;&#65306;AI Agent 0 &#21040; 1: MCP Server with Goose&#65289;]]></description><link>https://blog.schwannden.com/p/whats-the-fuzz-about-mcp-ai-agent-zh-tw</link><guid isPermaLink="false">https://blog.schwannden.com/p/whats-the-fuzz-about-mcp-ai-agent-zh-tw</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Wed, 19 Mar 2025 07:11:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/00cd12bd-f8b6-4b2d-8328-b1374f95f30a_800x571.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i92-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i92-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 424w, https://substackcdn.com/image/fetch/$s_!i92-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 848w, https://substackcdn.com/image/fetch/$s_!i92-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 1272w, https://substackcdn.com/image/fetch/$s_!i92-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i92-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i92-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 424w, https://substackcdn.com/image/fetch/$s_!i92-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 848w, https://substackcdn.com/image/fetch/$s_!i92-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 1272w, https://substackcdn.com/image/fetch/$s_!i92-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2415509e-9b12-484f-b53c-a10fe4792dea_800x571.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>&#65288;&#27604;&#36215;&#35264;&#24565;&#30340;&#20102;&#35299;&#65292;&#22914;&#26524;&#20320;&#24819;&#35201;&#30452;&#25509;&#21205;&#25163;&#65292;&#35531;&#30475;&#65306;<a href="https://blog.schwannden.com/ai-agent-0-e5-88-b0-1-mcp-server-with-goose/">AI Agent 0 &#21040; 1: MCP Server with Goose</a>&#65289;</p><h3>&#25925;&#20107;&#32972;&#26223;</h3><p>&#38568;&#33879; ChatGPT&#12289;Claude&#12289;Gemini &#31561;&#22823;&#22411;&#35486;&#35328;&#27169;&#22411;&#65288;LLM&#65289;&#19981;&#26039;&#25512;&#38515;&#20986;&#26032;&#12289;&#33021;&#21147;&#36234;&#20358;&#36234;&#24375;&#22823;&#65292;AI &#30340;&#26410;&#20358;&#31350;&#31455;&#26371;&#24448;&#21738;&#35041;&#30332;&#23637;&#21602;&#65311;&#31185;&#25216;&#22280;&#37325;&#37327;&#32026;&#20154;&#29289;&#65292;&#22914; Andrew Ng&#12289;Elon Musk &#21644;&#40643;&#20161;&#21235;&#37117;&#32027;&#32027;&#25351;&#20986;&#65306;&#12300;AI Agent &#23559;&#26371;&#26159;&#19979;&#19968;&#20491;&#37325;&#35201;&#30340;&#37324;&#31243;&#30865;&#12290;&#12301;&#37027;&#40636;&#65292;&#22823;&#23478;&#21475;&#20013;&#30340; AI Agent &#21040;&#24213;&#26159;&#20160;&#40636;&#21602;&#65311;</p><p>&#28982;&#32780;&#65292;&#30070;&#36234;&#20358;&#36234;&#22810; LLM &#24288;&#21830;&#25552;&#20379;&#21508;&#31278;&#24375;&#22823;&#30340;&#27169;&#22411;&#33287;&#25033;&#29992;&#26178;&#65292;&#25105;&#20497;&#19981;&#31105;&#22909;&#22855;&#65306;&#26377;&#27794;&#26377;&#19968;&#20491;&#38283;&#25918;&#19988;&#36890;&#29992;&#30340;&#21332;&#35696;&#65288;Protocol&#65289;&#65292;&#33021;&#35731;&#25105;&#20497;&#33258;&#30001;&#21109;&#36896;&#21508;&#31278; AI Agent&#65292;&#32780;&#19981;&#29992;&#25812;&#24515;&#34987;&#26576;&#20491;&#29305;&#23450;&#24179;&#21488;&#25110;&#24288;&#21830;&#32129;&#20303;&#21602;&#65311;</p><p>&#20659;&#32113;&#36575;&#39636;&#38283;&#30332;&#36890;&#24120;&#30001;&#24460;&#31471;&#25972;&#21512;&#31532;&#19977;&#26041;&#26381;&#21209;&#65292;&#21069;&#31471;&#36000;&#36012; UI/UX&#65292;&#30906;&#20445;&#20351;&#29992;&#32773;&#39636;&#39511;&#12290;&#20294;&#36889;&#31278;&#26041;&#24335;&#35201;&#27714;&#38283;&#30332;&#32773;&#25484;&#25569;&#25152;&#26377;&#37007;&#36655;&#65292;&#20006;&#33258;&#34892;&#20018;&#25509;&#21508;&#31278;&#26381;&#21209;&#65292;&#20197;&#32173;&#25345;&#23436;&#25972;&#25511;&#21046;&#27402;&#12290;&#38568;&#33879;&#29983;&#25104;&#24335; AI&#65288;Generative AI&#65289;&#33287; AI Agent &#30340;&#30332;&#23637;&#65292;&#35373;&#35336;&#24605;&#32173;&#38283;&#22987;&#36681;&#35722;&#12290;&#25105;&#20497;&#21487;&#36879;&#36942; AI Agent &#23450;&#32681;&#26989;&#21209;&#37007;&#36655;&#65292;&#20006;&#36879;&#36942;&#27161;&#28310;&#21270;&#21332;&#35696;&#65288;&#22914; Anthropic &#30340; Multi-Context Protocol, MCP&#65289;&#31649;&#29702; AI &#33287; LLM&#65288;&#22823;&#35486;&#35328;&#27169;&#22411;&#65289;&#30340;&#20114;&#21205;&#12290;&#36889;&#35731;&#38283;&#30332;&#32773;&#28961;&#38656;&#38364;&#27880;&#20659;&#32113;&#30340;&#24460;&#31471;&#37007;&#36655;&#33287;&#21069;&#31471;&#38283;&#30332;&#65292;&#32780;&#26159;&#23560;&#27880;&#26044; AI Agent &#30340;&#34892;&#28858;&#35373;&#35336;&#65292;&#35731; AI &#33258;&#20027;&#34389;&#29702;&#20219;&#21209;&#12290;&#36889;&#31278;&#27169;&#24335;&#25552;&#21319;&#20102;&#38283;&#30332;&#38728;&#27963;&#24615;&#65292;&#29305;&#21029;&#36969;&#29992;&#26044;&#24555;&#36895;&#39511;&#35657;&#26032;&#24819;&#27861;&#65288;Prototype&#65289;&#12290;&#38283;&#30332;&#32773;&#21482;&#38656;&#23450;&#32681; AI Agent &#30340;&#26680;&#24515;&#21151;&#33021;&#65292;&#32780;&#28961;&#38656;&#25237;&#20837;&#22823;&#37327;&#26178;&#38291;&#33287;&#36039;&#28304;&#25645;&#24314;&#23436;&#25972;&#30340;&#21069;&#24460;&#31471;&#26550;&#27083;&#65292;&#36879;&#36942; MCP &#27161;&#28310;&#21270;&#30340;&#20114;&#21205;&#65292;&#21363;&#21487;&#24555;&#36895;&#33853;&#22320;&#25033;&#29992;&#12290;</p><h3>LLM&#30340;&#38480;&#21046;</h3><p>&#25105;&#20497;&#24179;&#24120;&#29992; ChatGPT &#25110; Claude &#36889;&#20123;&#22823;&#22411;&#35486;&#35328;&#27169;&#22411;&#65288;LLM&#65289;&#26178;&#65292;&#36890;&#24120;&#21482;&#33021;&#21839;&#21839;&#38988;&#25110;&#32842;&#22825;&#65292;&#20294;&#27794;&#36774;&#27861;&#35731;&#23427;&#20497;&#30495;&#30340;&#12300;&#20570;&#12301;&#20160;&#40636;&#20107;&#12290;&#27604;&#22914;&#35498;&#65292;&#20320;&#19981;&#33021;&#30452;&#25509;&#21483; ChatGPT &#24171;&#20320;&#35330;&#39184;&#24307;&#12289;&#23492; email&#65292;&#25110;&#21435;&#20320;&#23478; NAS &#35041;&#25235;&#19968;&#20221;&#22577;&#21578;&#12290;</p><p>&#36889;&#26178;&#20505;&#65292;&#12300;AI Agent&#12301;&#23601;&#27966;&#19978;&#29992;&#22580;&#20102;&#12290;AI Agent &#23601;&#20687;&#26159;&#19968;&#20491;&#36028;&#24515;&#30340;&#23567;&#31192;&#26360;&#65292;&#19981;&#20677;&#33021;&#21644;&#20320;&#23565;&#35441;&#65292;&#36996;&#33021;&#26681;&#25818;&#20320;&#30340;&#38656;&#27714;&#23526;&#38555;&#12300;&#21205;&#25163;&#20570;&#20107;&#12301;&#12290;&#33289;&#20363;&#20358;&#35498;&#65292;&#22914;&#26524;&#20320;&#24819;&#30693;&#36947;&#19978;&#20491;&#26376;&#26576;&#20491;&#21516;&#20107;&#26368;&#24460;&#19968;&#27425;&#30331;&#20837;&#20844;&#21496;&#31995;&#32113;&#26159;&#20160;&#40636;&#26178;&#20505;&#65292;&#19968;&#33324;&#30340; LLM &#26159;&#31572;&#19981;&#20986;&#20358;&#30340;&#65292;&#22240;&#28858;&#23427;&#19981;&#25026;&#20320;&#20844;&#21496;&#20839;&#37096;&#30340;&#36039;&#26009;&#12290;&#20294;&#26159; AI Agent &#21487;&#20197;&#20570;&#21040;&#65292;&#23427;&#26371;&#30452;&#25509;&#21435;&#21628;&#21483;&#20844;&#21496;&#20839;&#37096;&#31995;&#32113;&#30340; API &#25110;&#26597;&#35426;&#36039;&#26009;&#24235;&#65292;&#31435;&#21051;&#24171;&#20320;&#25214;&#21040;&#28310;&#30906;&#30340;&#32000;&#37636;&#12290;</p><p>&#21478;&#19968;&#26041;&#38754;&#65292;LLM &#30340;&#21478;&#19968;&#20491;&#21839;&#38988;&#26159;&#65292;&#23427;&#22238;&#31572;&#21839;&#38988;&#30340;&#33021;&#21147;&#20407;&#38480;&#22312;&#33258;&#24049;&#25152;&#23416;&#36942;&#30340;&#30693;&#35672;&#20839;&#12290;&#22914;&#26524;&#30896;&#19978;&#20102;&#26368;&#26032;&#30332;&#29983;&#30340;&#26032;&#32862;&#65292;&#25110;&#32773;&#20320;&#33258;&#23478;&#30340;&#26989;&#21209;&#36039;&#35338;&#65292;LLM &#24120;&#24120;&#26463;&#25163;&#28961;&#31574;&#12290;&#28858;&#20102;&#35299;&#27770;&#36889;&#20491;&#21839;&#38988;&#65292;&#25105;&#20497;&#21487;&#33021;&#26371;&#24819;&#21040; RAG&#65288;Retrieval-Augmented Generation&#65292;&#27298;&#32034;&#22686;&#24375;&#29983;&#25104;&#65289;&#65292;&#35731; LLM &#33021;&#22816;&#20808;&#21435;&#12300;&#32763;&#38321;&#12301;&#38989;&#22806;&#30340;&#36039;&#26009;&#20877;&#22238;&#31572;&#21839;&#38988;&#12290;&#19981;&#36942;&#65292;RAG &#36969;&#21512;&#30340;&#24773;&#22659;&#26159;&#36039;&#26009;&#30456;&#23565;&#38748;&#24907;&#12289;&#35722;&#21205;&#19981;&#38971;&#32321;&#30340;&#24773;&#27841;&#12290;&#22914;&#26524;&#20320;&#26377;&#20123;&#21363;&#26178;&#30340;&#12289;&#21205;&#24907;&#30340;&#38656;&#27714;&#65288;&#27604;&#22914;&#21363;&#26178;&#26597;&#35426;&#26576;&#20491;&#39015;&#23458;&#35330;&#21934;&#30340;&#20986;&#36008;&#36914;&#24230;&#65289;&#65292;&#29992; RAG &#19981;&#21482;&#32233;&#24930;&#65292;&#36996;&#21487;&#33021;&#25104;&#26412;&#22826;&#39640;&#12290;</p><p>&#32780; AI Agent &#23601;&#20687;&#26159;&#24171;&#20320;&#36305;&#33151;&#30340;&#23567;&#21161;&#25163;&#65292;&#20320;&#21482;&#35201;&#32102;&#23427;&#26126;&#30906;&#30340;&#20219;&#21209;&#65292;&#20363;&#22914;&#65306;&#12300;&#24171;&#25105;&#30906;&#35469;&#35330;&#21934; 12345 &#29694;&#22312;&#23492;&#21040;&#21738;&#35041;&#20102;&#65311;&#12301;&#23427;&#26371;&#39340;&#19978;&#21628;&#21483;&#20320;&#20844;&#21496;&#29289;&#27969;&#31995;&#32113;&#30340; API&#65292;&#32102;&#20986;&#21363;&#26178;&#21448;&#27491;&#30906;&#30340;&#31572;&#26696;&#12290;</p><p>&#32317;&#32080;&#19968;&#19979;&#65306;</p><ul><li><p>&#19968;&#33324;&#30340; LLM &#23601;&#20687;&#12300;&#32880;&#26126;&#30340;&#33836;&#20107;&#36890;&#20808;&#29983;&#12301;&#65292;&#21482;&#33021;&#25552;&#20379;&#20182;&#30693;&#36947;&#30340;&#31572;&#26696;&#65292;&#32780;&#19988;&#21482;&#21205;&#21475;&#65292;&#19981;&#21205;&#25163;&#12290;</p></li><li><p>RAG &#23601;&#20687;&#26159;&#12300;&#24118;&#33879;&#36039;&#26009;&#24235;&#30340;&#30334;&#31185;&#20840;&#26360;&#12301;&#65292;&#20294;&#36039;&#26009;&#24235;&#36890;&#24120;&#27604;&#36611;&#38748;&#24907;&#65292;&#19981;&#36969;&#21512;&#38656;&#35201;&#21363;&#26178;&#36039;&#26009;&#30340;&#24773;&#22659;&#12290;</p></li><li><p>AI Agent &#21063;&#20687;&#26159;&#12300;&#33021;&#36305;&#33151;&#12289;&#33021;&#24171;&#20320;&#36774;&#20107;&#30340;&#23567;&#31192;&#26360;&#12301;&#65292;&#26681;&#25818;&#20320;&#25552;&#20379;&#30340;&#29305;&#23450;&#24037;&#20855;&#25110; API&#65292;&#35299;&#27770;&#20855;&#39636;&#12289;&#21363;&#26178;&#30340;&#21839;&#38988;&#12290;</p></li></ul><h3>AI Agent&#30340;&#38480;&#21046;</h3><p>AI Agent &#38754;&#33256;&#30340;&#31532;&#19968;&#20491;&#38480;&#21046;&#26159;&#12300;&#36890;&#29992;&#24615;&#12301;&#30340;&#21839;&#38988;&#12290;&#38568;&#33879;&#36234;&#20358;&#36234;&#22810;&#30340; LLM &#24288;&#21830;&#65288;&#22914; Claude, Gemini, OpenAI &#31561;&#65289;&#28263;&#29694;&#65292;&#22522;&#26044;&#36889;&#20123;&#27169;&#22411;&#25171;&#36896;&#30340;&#25033;&#29992;&#31243;&#24335;&#20063;&#36234;&#20358;&#36234;&#22810;&#20803;&#65306;&#24478;&#26368;&#24120;&#35211;&#30340; Chatbot&#65288;&#22914; Claude&#12289;ChatGPT&#65289;&#21040;&#26356;&#35079;&#38620;&#30340;&#26234;&#33021; IDE&#65288;&#22914; Cursor&#65289;&#65292;&#25105;&#20497;&#24456;&#38627;&#30906;&#20445;&#33258;&#24049;&#38283;&#30332;&#30340; AI Agent &#33021;&#22816;&#28961;&#32299;&#22320;&#22312;&#21508;&#31278;&#19981;&#21516;&#30340;&#24179;&#21488;&#25110;&#29872;&#22659;&#20013;&#36939;&#20316;&#12290;&#29702;&#24819;&#19978;&#65292;&#25105;&#20497;&#24076;&#26395;&#26377;&#19968;&#22871;&#27161;&#28310;&#21332;&#35696;&#65292;&#35731;&#21516;&#19968;&#20491; AI Agent &#21487;&#20197;&#36629;&#39686;&#22320;&#33287;&#21508;&#20491;&#24179;&#21488;&#25972;&#21512;&#65292;&#19981;&#24517;&#21463;&#38480;&#26044;&#29305;&#23450;&#30340;&#27169;&#22411;&#25110;&#26381;&#21209;&#20379;&#25033;&#21830;&#12290;</p><p>AI Agent &#38754;&#33256;&#30340;&#31532;&#20108;&#20491;&#38480;&#21046;&#65292;&#26159;&#36942;&#21435;&#30340;&#35373;&#35336;&#24448;&#24448;&#21482;&#36969;&#21512;&#35731;&#12300;&#20154;&#12301;&#20358;&#20351;&#29992;&#12290;&#20351;&#29992;&#32773;&#25351;&#31034;&#19968;&#27493;&#65292;AI Agent &#23601;&#22519;&#34892;&#19968;&#27493;&#65292;&#25110;&#32773;&#24517;&#38920;&#25353;&#29031;&#38928;&#20808;&#23450;&#32681;&#22909;&#30340;&#27969;&#31243;&#25165;&#33021;&#36939;&#20316;&#12290;&#36889;&#27171;&#30340;&#35373;&#35336;&#23565;&#12300;&#27231;&#22120;&#12301;&#65288;&#20363;&#22914;&#29992;&#25142;&#31471;&#25033;&#29992;&#31243;&#24335;&#25110;&#33258;&#21205;&#21270;&#26381;&#21209;&#65289;&#20358;&#35498;&#19981;&#22816;&#24392;&#24615;&#12290;&#25033;&#29992;&#31243;&#24335;&#38627;&#20197;&#26234;&#33021;&#22320;&#26681;&#25818;&#38656;&#27714;&#21205;&#24907;&#36984;&#29992;&#19981;&#21516;&#30340; Agent &#24037;&#20855;&#65292;&#26356;&#21029;&#25552;&#33258;&#21205;&#21028;&#26039;&#20351;&#29992;&#38918;&#24207;&#12290;</p><p>MCP&#65288;Anthropic Model Context Protocol&#65289;&#25552;&#20379;&#20102;&#19968;&#20491;&#27161;&#28310;&#21270;&#30340; Client&#8211;Server &#26550;&#27083;&#65292;&#23436;&#32654;&#22320;&#35299;&#27770;&#20102;&#36889;&#20841;&#20491;&#21839;&#38988;&#12290;&#36879;&#36942; MCP&#65292;&#38283;&#30332;&#32773;&#21482;&#38656;&#23560;&#27880;&#26044;&#35069;&#20316;&#21508;&#33258;&#29544;&#31435;&#30340;&#21151;&#33021;&#27169;&#32068;&#65292;&#36889;&#20123;&#27169;&#32068;&#31281;&#28858; MCP Server&#65292;&#20363;&#22914;&#30332;&#36865; Email&#12289;&#31649;&#29702;&#34892;&#20107;&#26310;&#25110;&#36914;&#34892;&#22294;&#20687;&#36776;&#35672;&#31561;&#29305;&#23450;&#20219;&#21209;&#12290;&#21478;&#19968;&#26041;&#38754;&#65292;&#25972;&#21512; LLM &#30340;&#25033;&#29992;&#31243;&#24335;&#65292;&#20363;&#22914; Claude Chatbot &#25110;&#26234;&#33021; IDE Cursor &#31561;&#65292;&#21063;&#25198;&#28436; MCP Client &#30340;&#35282;&#33394;&#12290;&#36889;&#20123; MCP Client &#33021;&#22816;&#36879;&#36942; MCP Server &#25552;&#20379;&#30340;&#27161;&#28310;&#21270;&#20171;&#38754;&#65292;&#21205;&#24907;&#22320;&#25506;&#32034;&#21644;&#35672;&#21029;&#21487;&#29992;&#30340;&#21151;&#33021;&#33287;&#24037;&#20855;&#65292;&#20006;&#26681;&#25818;&#20351;&#29992;&#32773;&#25110;&#25033;&#29992;&#38656;&#27714;&#26234;&#33021;&#22320;&#25490;&#21015;&#32068;&#21512;&#12289;&#36984;&#25799;&#26368;&#21512;&#36969;&#30340;&#24037;&#20855;&#20358;&#23436;&#25104;&#35079;&#38620;&#20219;&#21209;&#12290;</p><p>&#36879;&#36942;&#36889;&#31278;&#20998;&#24037;&#33287;&#21332;&#20316;&#30340;&#26550;&#27083;&#65292;MCP &#35731; AI Agent &#35722;&#24471;&#26356;&#20855;&#36890;&#29992;&#24615;&#65292;&#20063;&#26356;&#21152;&#23481;&#26131;&#34987;&#27231;&#22120;&#29702;&#35299;&#33287;&#33258;&#21205;&#21270;&#25972;&#21512;&#65292;&#20351;&#24471;&#25972;&#20491; AI &#29983;&#24907;&#22280;&#33021;&#22816;&#26356;&#21152;&#38728;&#27963;&#19988;&#39640;&#25928;&#22320;&#36939;&#20316;&#12290;</p><h3>&#23526;&#38555;&#30340;&#24037;&#20316;&#27969;&#31243;&#65306;</h3><p>&#20551;&#35373;&#20170;&#22825;&#20320;&#36879;&#36942;MCP&#24314;&#31435;&#20102;&#19968;&#20491;AI&#23458;&#26381;&#27231;&#22120;&#20154;&#65292;&#23427;&#25972;&#21512;&#20102;&#20841;&#20491;&#24037;&#20855;&#65306;</p><ol><li><p><strong>&#35330;&#21934;&#26597;&#35426;&#24037;&#20855;</strong>&#65306;&#21487;&#20197;&#36899;&#25509;&#20320;&#30340;&#20844;&#21496;&#36039;&#26009;&#24235;&#65292;&#26681;&#25818;&#23458;&#25142;&#25552;&#20379;&#30340;&#35330;&#21934;&#32232;&#34399;&#26597;&#35426;&#35330;&#21934;&#29376;&#24907;&#12290;</p></li><li><p><strong>&#20778;&#24800;&#21048;&#30332;&#36865;&#24037;&#20855;</strong>&#65306;&#30070;&#23458;&#25142;&#36935;&#21040;&#19981;&#28415;&#24847;&#30340;&#24773;&#27841;&#26178;&#65292;AI&#33021;&#22816;&#21205;&#24907;&#22320;&#27770;&#23450;&#26159;&#21542;&#32102;&#20104;&#25240;&#25187;&#20778;&#24800;&#21048;&#12290;</p></li></ol><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gRjt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gRjt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 424w, https://substackcdn.com/image/fetch/$s_!gRjt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 848w, https://substackcdn.com/image/fetch/$s_!gRjt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 1272w, https://substackcdn.com/image/fetch/$s_!gRjt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gRjt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png" width="1466" height="708" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:708,&quot;width&quot;:1466,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!gRjt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 424w, https://substackcdn.com/image/fetch/$s_!gRjt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 848w, https://substackcdn.com/image/fetch/$s_!gRjt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 1272w, https://substackcdn.com/image/fetch/$s_!gRjt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820d6d8b-51be-4263-ace2-992f2f438de7_800x386.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p>&#19968;&#20301;&#39015;&#23458;&#21521;AI&#23458;&#26381;&#35426;&#21839;&#65306;&#12300;&#25105;&#30340;&#35330;&#21934; #12345 &#24050;&#32147;&#20841;&#36913;&#20102;&#36996;&#27794;&#26377;&#25910;&#21040;&#65292;&#21487;&#20197;&#24171;&#25105;&#26597;&#19968;&#19979;&#21966;&#65311;&#12301;</p></li><li><p>&#27492;&#26178;MCP Client (&#20363;&#22914;Claude Chatbot)&#36879;&#36942;&#20839;&#24314;&#30340;LLM&#20998;&#26512;&#20351;&#29992;&#32773;&#38656;&#27714;&#65292;&#30693;&#36947;&#38656;&#35201;&#36879;&#36942;&#24037;&#20855;&#20358;&#23436;&#25104;&#27492;&#20219;&#21209;&#12290;&#23427;&#21205;&#24907;&#22320;&#21521; MCP Server&#35426;&#21839;&#65306;&#12300;&#30446;&#21069;&#26377;&#21738;&#20123;&#24037;&#20855;&#21487;&#29992;&#65311;&#12301;</p></li><li><p>MCP Server &#22238;&#20659;&#30446;&#21069;&#21487;&#29992;&#30340;&#24037;&#20855;&#28165;&#21934;&#21644;&#20351;&#29992;&#26041;&#24335;&#32102;Client&#12290;</p></li><li><p>AI&#21028;&#26039;&#24460;&#65292;&#27770;&#23450;&#20808;&#21628;&#21483;<strong>&#35330;&#21934;&#26597;&#35426;&#24037;&#20855;</strong>&#65292;&#36879;&#36942;&#23458;&#25142;&#25552;&#20379;&#30340;&#12300;#12345&#12301;&#26597;&#35426;&#35330;&#21934;&#29376;&#24907;&#12290;</p></li></ol><p><strong>&#20551;&#35373;&#35330;&#21934;&#29376;&#24907;&#39023;&#31034;&#65306;&#12300;&#20986;&#36008;&#24310;&#35492;&#65292;&#23578;&#26410;&#23492;&#20986;&#12301;&#12290;</strong></p><ol><li><p>LLM&#29702;&#35299;&#39015;&#23458;&#21487;&#33021;&#26371;&#22240;&#27492;&#19981;&#28415;&#24847;&#65292;&#26044;&#26159;&#21205;&#24907;&#22320;&#27770;&#23450;&#20877;&#36879;&#36942;<strong>&#20778;&#24800;&#21048;&#30332;&#36865;&#24037;&#20855;</strong>&#21521;&#39015;&#23458;&#25552;&#20379;&#19968;&#24373;&#20778;&#24800;&#21048;&#65292;&#20316;&#28858;&#35036;&#20767;&#12290;</p></li><li><p>&#26368;&#32066;AI&#23458;&#26381;&#22238;&#35206;&#39015;&#23458;&#65306;&#12300;&#24744;&#30340;&#35330;&#21934;&#22240;&#28858;&#29289;&#27969;&#24310;&#35492;&#23578;&#26410;&#23492;&#20986;&#65292;&#36896;&#25104;&#24744;&#30340;&#19981;&#20415;&#65292;&#25105;&#20497;&#28145;&#24863;&#25265;&#27465;&#65292;&#29305;&#21029;&#36104;&#36865;&#24744;&#19968;&#24373;&#25240;&#25187;&#20778;&#24800;&#21048;&#20197;&#34920;&#27465;&#24847;&#12290;&#12301;</p></li></ol><p><strong>&#20551;&#35373;&#35330;&#21934;&#29376;&#24907;&#39023;&#31034;&#65306;&#12300;&#23578;&#26410;&#20184;&#27454;&#12301;&#12290;</strong></p><ol><li><p>LLM&#29702;&#35299;&#27492;&#24773;&#22659;&#20006;&#38750;&#20986;&#36008;&#21839;&#38988;&#65292;&#32780;&#26159;&#20184;&#27454;&#21839;&#38988;&#65292;&#22240;&#27492;&#19981;&#26371;&#30332;&#36865;&#20778;&#24800;&#21048;&#65292;&#32780;&#26159;&#25552;&#37266;&#39015;&#23458;&#23436;&#25104;&#20184;&#27454;&#12290;</p></li><li><p>&#26368;&#32066;AI&#23458;&#26381;&#22238;&#35206;&#39015;&#23458;&#65306;&#12300;&#24744;&#30340;&#35330;&#21934;&#23578;&#26410;&#23436;&#25104;&#20184;&#27454;&#65292;&#35531;&#24744;&#23436;&#25104;&#20184;&#27454;&#24460;&#65292;&#25105;&#20497;&#23559;&#31435;&#21363;&#28858;&#24744;&#23433;&#25490;&#20986;&#36008;&#65292;&#35613;&#35613;&#65281;&#12301;</p></li></ol><div><hr></div><p>&#22312;&#36889;&#27171;&#30340;&#22580;&#26223;&#20013;&#65292;&#27880;&#24847;&#65292;&#25105;&#20497;&#19981;&#38656;&#35201;&#21435;&#25552;&#20379;&#24773;&#22659;&#21028;&#26039;&#30340;&#37007;&#36655;&#65292;&#21482;&#35201;&#36879;&#36942;MCP Server&#25552;&#20379;&#20841;&#20491;&#24037;&#20855;&#65292;LLM&#33258;&#24049;&#26377;&#36774;&#27861;&#20381;&#29031;&#24773;&#22659;&#21028;&#26039;&#35201;&#20351;&#29992;&#21738;&#20123;&#24037;&#20855;&#35299;&#27770;&#21839;&#38988;&#12290;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-o50!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-o50!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 424w, https://substackcdn.com/image/fetch/$s_!-o50!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 848w, https://substackcdn.com/image/fetch/$s_!-o50!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 1272w, https://substackcdn.com/image/fetch/$s_!-o50!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-o50!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png" width="1394" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-o50!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 424w, https://substackcdn.com/image/fetch/$s_!-o50!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 848w, https://substackcdn.com/image/fetch/$s_!-o50!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 1272w, https://substackcdn.com/image/fetch/$s_!-o50!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77224f73-9b4f-4f79-b83a-05e8dbde139b_800x414.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#24120;&#35211;&#21839;&#38988;</h3><p><strong>Q&#65306;MCP &#26159;&#30001;&#35504;&#38283;&#30332;&#30340;&#65311;</strong><br>A&#65306;MCP &#26159;&#30001; Anthropic &#20844;&#21496;&#25552;&#20986;&#30340;&#19968;&#22871;&#21332;&#35696;&#65292;&#30446;&#30340;&#26159;&#35731; AI &#27169;&#22411;&#33021;&#22816;&#26356;&#38728;&#27963;&#22320;&#33287;&#22806;&#37096;&#24037;&#20855;&#20114;&#21205;&#12290;&#19981;&#36942; MCP &#20006;&#19981;&#38480;&#26044; Anthropic &#33258;&#24049;&#30340; AI &#27169;&#22411;&#65288;&#22914; Claude&#65289;&#65292;&#32780;&#26159;&#38283;&#25918;&#19988;&#29544;&#31435;&#26044;&#29305;&#23450; AI &#24288;&#21830;&#30340;&#27161;&#28310;&#65292;&#22240;&#27492;&#20219;&#20309;&#31526;&#21512; MCP &#30340;&#27169;&#22411;&#37117;&#33021;&#25645;&#37197;&#20351;&#29992;&#12290;</p><p><strong>Q&#65306;MCP &#30340;&#24037;&#20316;&#21407;&#29702;&#26159;&#20160;&#40636;&#65311;</strong><br>A&#65306;MCP &#30340;&#24037;&#20316;&#27969;&#31243;&#22823;&#33268;&#22914;&#19979;&#65306;</p><ol><li><p><strong>MCP Client</strong>&#65288;&#20363;&#22914; Claude&#12289;Goose &#31561;&#65289;&#26371;&#20808;&#21521; <strong>MCP Server</strong> &#30332;&#20986;&#35531;&#27714;&#12290;</p></li><li><p><strong>MCP Server</strong> &#26371;&#22238;&#25033;&#20006;&#21578;&#35380; <strong>Client</strong> &#26377;&#21738;&#20123;&#24037;&#20855;&#65288;tools&#65289;&#12289;&#36039;&#28304;&#65288;resources&#65289;&#21450;&#25552;&#31034;&#35338;&#24687;&#65288;prompts&#65289;&#21487;&#29992;&#12290;</p></li><li><p><strong>MCP Client</strong> &#26681;&#25818; Server &#25552;&#20379;&#30340;&#36039;&#35338;&#65292;&#26234;&#24935;&#22320;&#21028;&#26039;&#35442;&#20351;&#29992;&#21738;&#20123; API&#65292;&#20006;&#27770;&#23450;&#35201;&#25552;&#20379;&#20160;&#40636;&#27171;&#30340;&#36039;&#26009;&#32102; AI &#27169;&#22411;&#65292;&#20197;&#28415;&#36275;&#20351;&#29992;&#32773;&#30340;&#38656;&#27714;&#12290;</p></li></ol><p>&#36879;&#36942;&#36889;&#27171;&#30340;&#26550;&#27083;&#65292;AI &#33021;&#26356;&#38728;&#27963;&#22320;&#33258;&#21205;&#36984;&#25799;&#12289;&#32068;&#21512;&#19981;&#21516;&#30340;&#24037;&#20855;&#20358;&#23436;&#25104;&#20219;&#21209;&#12290;</p><p><strong>Q&#65306;MCP &#26159;&#21542;&#19968;&#23450;&#35201;&#25645;&#37197; Claude &#20351;&#29992;&#65311;</strong><br>A&#65306;&#20006;&#19981;&#19968;&#23450;&#12290;Claude Desktop &#38614;&#28982;&#26159; Anthropic &#38283;&#30332;&#30340;&#19968;&#27454; MCP Client&#65292;&#20294; MCP &#26412;&#36523;&#20006;&#19981;&#20407;&#38480;&#26044;&#20219;&#20309;&#21934;&#19968; AI &#24288;&#21830;&#25110;&#27169;&#22411;&#12290;&#25105;&#20491;&#20154;&#25512;&#34214;&#21487;&#20197;&#22039;&#35430; <a href="https://github.com/block/goose">Goose</a>&#65292;&#23427;&#26159;&#19968;&#20491;&#36817;&#26399;&#38750;&#24120;&#29105;&#38272;&#30340; MCP Client &#23526;&#20316;&#65292;&#19981;&#20294;&#21487;&#20197;&#33258;&#30001;&#25509;&#20837;&#21508;&#23478; LLM API Key&#65292;&#22296;&#38538;&#20063;&#31309;&#26997;&#30332;&#23637; MCP Server &#24066;&#38598;&#65288;Marketplace&#65289;&#65292;&#25552;&#20379;&#35920;&#23500;&#30340;&#24037;&#20855;&#33287;&#36039;&#28304;&#12290;</p><p><strong>Q&#65306;&#20351;&#29992; MCP &#26371;&#26377;&#23433;&#20840;&#39080;&#38570;&#21966;&#65311;&#35442;&#22914;&#20309;&#30906;&#20445; MCP &#30340;&#23433;&#20840;&#24615;&#65311;</strong><br>A&#65306;MCP &#26412;&#36523;&#20006;&#19981;&#26371;&#24375;&#36843;&#23559;&#25935;&#24863;&#36039;&#26009;&#20659;&#36865;&#21040; AI &#27169;&#22411;&#31471;&#65292;&#32780;&#26159;&#23436;&#20840;&#30001; MCP Server &#27770;&#23450;&#36039;&#26009;&#30340;&#20659;&#36664;&#31684;&#22285;&#12290;&#22240;&#27492;&#65292;&#30906;&#20445; MCP &#23433;&#20840;&#24615;&#30340;&#37325;&#40670;&#22312;&#26044;&#22914;&#20309;&#35373;&#23450;&#33287;&#31649;&#29702; MCP Server&#65292;&#20855;&#39636;&#21253;&#21547;&#65306;</p><ul><li><p><strong>&#27402;&#38480;&#25511;&#21046;</strong>&#65306;&#36879;&#36942;&#32048;&#32251;&#30340;&#27402;&#38480;&#31649;&#29702;&#65292;&#22196;&#26684;&#38480;&#21046;&#27599;&#20491; API &#25110;&#24037;&#20855;&#33021;&#23384;&#21462;&#30340;&#36039;&#26009;&#31684;&#22285;&#65292;&#38450;&#27490;&#25935;&#24863;&#36039;&#26009;&#22806;&#27945;&#12290;</p></li><li><p><strong>API &#37329;&#38000;&#31649;&#29702;</strong>&#65306;&#22949;&#21892;&#20445;&#31649; API &#37329;&#38000;&#65292;&#36991;&#20813;&#22806;&#27969;&#65292;&#21516;&#26178;&#25505;&#29992;&#23433;&#20840;&#30340;&#37329;&#38000;&#20786;&#23384;&#33287;&#31649;&#29702;&#27231;&#21046;&#12290;</p></li><li><p><strong>&#30435;&#25511;&#33287;&#35352;&#37636;</strong>&#65306;&#23565;&#27599;&#19968;&#27425; API &#21628;&#21483;&#33287;&#36039;&#26009;&#23384;&#21462;&#36914;&#34892;&#30435;&#25511;&#65292;&#36879;&#36942;&#23450;&#26399;&#30340;&#35352;&#37636;&#33287;&#31293;&#26680;&#65292;&#25484;&#25569;&#31995;&#32113;&#29376;&#24907;&#65292;&#24555;&#36895;&#30332;&#29694;&#33287;&#34389;&#29702;&#28507;&#22312;&#30340;&#23433;&#20840;&#21839;&#38988;&#12290;</p></li></ul><p>&#36879;&#36942;&#20197;&#19978;&#25514;&#26045;&#65292;&#21363;&#21487;&#26377;&#25928;&#25511;&#21046; MCP &#21487;&#33021;&#30340;&#23433;&#20840;&#39080;&#38570;&#65292;&#20445;&#38556;&#36039;&#26009;&#23433;&#20840;&#24615;&#33287;&#31995;&#32113;&#31337;&#23450;&#24615;&#12290;</p><h3>&#22909;&#29992;&#36039;&#28304;</h3><ol><li><p><a href="https://modelcontextprotocol.io/introduction">MCP&#23448;&#26041;&#32178;&#31449;</a></p></li><li><p><a href="https://github.com/modelcontextprotocol/servers">MCP Reference Servers</a></p></li><li><p><a href="https://modelcontextprotocol.io/clients">MCP Clients &#36319;&#27599;&#20491; Client &#30446;&#21069;&#25903;&#25588;&#30340; protocol&#31684;&#22285;</a></p></li><li><p><a href="https://blog.schwannden.com/ai-agent-0-e5-88-b0-1-mcp-server-with-goose/">&#33258;&#24049;&#21205;&#25163;&#20570;&#19968;&#20491;MCP Server&#21543;</a></p></li></ol>]]></content:encoded></item><item><title><![CDATA[Accelerating Text Search in Django Admin for Large Tables]]></title><description><![CDATA[The Challenge of Searching Large Tables in Django Admin]]></description><link>https://blog.schwannden.com/p/accelerating-text-search-in-django-admin-for-large-tables</link><guid isPermaLink="false">https://blog.schwannden.com/p/accelerating-text-search-in-django-admin-for-large-tables</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 22 Nov 2024 09:55:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/eec0fd0a-6ac4-458c-a7e2-7059228b94f6_800x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kpjt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kpjt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!kpjt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!kpjt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!kpjt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kpjt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kpjt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!kpjt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!kpjt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!kpjt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef39cac4-42db-471f-a90d-d09e5bf6fa6f_800x800.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p><strong>The Challenge of Searching Large Tables in Django Admin</strong></p><p>At Ubiquiti, our systems often deal with enormous datasets&#8202;&#8212;&#8202;tables with over <strong>1 billion records</strong> are not uncommon. While Django Admin is a powerful tool for managing and interacting with data, its default search functionality can become a bottleneck in these scenarios. The built-in icontains query used in search_fields scans every column included, leading to sluggish performance as the dataset scales.</p><p>Consider a user management table with billions of records:</p><ul><li><p>We want <strong>email prefix search</strong> to quickly locate users whose email addresses start with a specific term (e.g., searching for john@domain.com should instantly find matches).</p></li><li><p>We also want <strong>email alias search</strong> that identifies aliases for a given email using regular expressions (e.g., searching for schwannden@gmail.com should also return schwannden+test1@gmail.com and other variants).</p></li><li><p>We also want to search user by UUID, using index would be very fast in support cases when we can obtain user&#8217;s UUID.</p></li></ul><p>Here&#8217;s the catch:</p><ul><li><p>These two searches are <strong>independent use cases by</strong>. A regex-based alias search is computationally expensive and shouldn&#8217;t be performed unless explicitly needed.</p></li><li><p>Django Admin&#8217;s <code>get_search_results</code> function only accepts a single <code>search_term</code>, making it impossible to differentiate between the prefix search and alias search.</p></li></ul><p>To make matters worse, adding multiple search fields by <a href="https://docs.djangoproject.com/en/5.1/howto/overriding-templates/">overwriting the change_list template</a> doesn&#8217;t help because Django passes all queries through the same q=&lt;some search term&gt; parameter, preventing us from distinguishing between search types.</p><h3><strong>The Solution: Adding Custom Filters for Large Tables</strong></h3><p>The Django <code>list_filter</code> feature could be an ideal solution for custom filtering logic. However, its default implementation generates choices for filtering, which is impractical for fields like UUIDs or emails where precomputing billions of choices is infeasible.</p><p>This problem led us to explore a creative approach to <strong>customize the </strong><code>list_filter</code><strong> </strong>component and integrate specialized search functionality directly into the Django Admin interface. After much research, we came across <a href="https://hakibenita.com/how-to-add-a-text-filter-to-django-admin">a post</a> that inspired us to extend Django&#8217;s <code>list_filter</code> to support dynamic input fields for our custom search needs.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CuxR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CuxR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 424w, https://substackcdn.com/image/fetch/$s_!CuxR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 848w, https://substackcdn.com/image/fetch/$s_!CuxR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 1272w, https://substackcdn.com/image/fetch/$s_!CuxR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CuxR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png" width="1648" height="264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:264,&quot;width&quot;:1648,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CuxR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 424w, https://substackcdn.com/image/fetch/$s_!CuxR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 848w, https://substackcdn.com/image/fetch/$s_!CuxR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 1272w, https://substackcdn.com/image/fetch/$s_!CuxR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ba784e-0a5a-48f3-a38c-869c5e8d93cc_800x128.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Customized Input&nbsp;Filters</figcaption></figure></div><p>Here&#8217;s how we implemented it:</p><h3><strong>Create a Custom Input Filter Template</strong></h3><p>First, we added a new template to render input fields dynamically in the admin filter area.</p><p>Create the file <code>templates/admin/input_filter.html</code>:</p><pre><code>{% load i18n %} 
 
&lt;details data-filter-title="{{ title }}" open class="filter-item"&gt; 
    &lt;summary&gt; 
      {% blocktranslate with filter_title=title %} {{ filter_title }} {% endblocktranslate %} 
    &lt;/summary&gt; 
    &lt;ul&gt; 
        &lt;li&gt; 
            {% with choices.0 as all_choice %} 
            &lt;form method="GET" action=""&gt; 
                {% for k, v in all_choice.query_parts %} 
                &lt;input type="hidden" name="{{ k }}" value="{{ v }}" /&gt; 
                {% endfor %} 
                &lt;input 
                    type="text" 
                    value="{{ spec.value|default_if_none:'' }}" 
                    name="{{ spec.parameter_name }}"/&gt; 
                {% if not all_choice.selected %} 
                    &lt;strong&gt;&lt;a href="{{ all_choice.query_string }}"&gt;&#10761; {% trans 'Remove' %}&lt;/a&gt;&lt;/strong&gt; 
                {% endif %} 
            &lt;/form&gt; 
            {% endwith %} 
        &lt;/li&gt; 
    &lt;/ul&gt; 
  &lt;/details&gt;</code></pre><p><strong>2. Define an InputFilter Base Class</strong></p><p>Next, we created an InputFilter class to manage custom input fields:</p><pre><code>class InputFilter(SimpleListFilter): 
    """ 
    Base class for filters that take a text input 
    """ 
 
    template = "admin/input_filter.html" 
    parameter_name: str 
    title: str 
 
    def lookups(self, request, model_admin): 
        # Dummy, required to show the filter. 
        return ((),) 
 
    def choices(self, changelist): 
        # Grab only the "all" option. 
        all_choices = super().choices(changelist) 
        try: 
            all_choice = next(all_choices) 
            all_choice["query_parts"] = ( 
                (k, v) for k, v in changelist.get_filters_params().items() if k != self.parameter_name 
            ) 
            yield all_choice 
        except StopIteration: 
            return  # Clean exit when no values remain 
 
    def queryset(self, request, queryset): 
        value = self.sanitized_value() 
        if value is not None: 
            return queryset.filter(**{f"{self.parameter_name}": value}) 
        return queryset 
 
    def sanitized_value(self): 
        value = self.value() 
        if value is None: 
            return None 
        return value.strip()</code></pre><p>With this base filter, we can now inplement our own filters, we can use <code>parameter_name</code> to overwrite the way we wish query is made, and we could overwrite <code>def queryset</code> to provide more customized search query like finding email aliases.</p><pre><code>class UUIDFilter(InputFilter): 
    """ 
    Filter for UUID exact match 
    Ignore filter if the value is not a valid UUID 
    """ 
 
    parameter_name = "id" 
    title = "By User ID" 
 
    def sanitized_value(self): 
        value = super().sanitized_value() 
        if value is None: 
            return None 
        try: 
            return uuid.UUID(value) 
        except ValueError: 
            return None 
 
 
class EmailFilter(InputFilter): 
    """ 
    Filter for email prefix search on the user model itself 
    """ 
 
    parameter_name = "email__startswith" 
    title = "By Email Prefix" 
 
 
class EmailAliasFilter(InputFilter): 
    """ 
    Filter for email alias search 
    For example, "test+alias@example.com" will be matched by "test@example.com" 
    """ 
 
    parameter_name = "email" 
    title = "Search Email Alias" 
 
    def queryset(self, request, queryset): 
        value = self.sanitized_value() 
        if value is not None: 
            split_result = value.split("@") 
            if len(split_result) != 2: 
                return queryset.none() 
            local_part, domain = split_result 
            # Adjust the local part to remove any existing '+' and its suffix 
            local_part = local_part.split("+")[0] 
            regex = rf"{local_part}(\+.+)?@{domain}" 
            return queryset.filter(email__iregex=regex) 
        return queryset</code></pre><p>And in our admin model, we can mix this custom filters with built in field filter like:</p><pre><code>class UserAdmin(admin.ModelAdmin): 
    list_filter = (UUIDFilter, EmailFilter, EmailAliasFilter, "is_legacy")</code></pre><p>The built in choice filter still work on fields with less options.</p><h3>Reusing filter</h3><p>Assuming we have another model with a foreign key poiting to <code>User</code>, and we wish to filter this record by its related user&#8217;s email, we simply need to inherit from the original <code>EmailFilter</code> and change the <code>parameter_name</code></p><pre><code>class ShoppingCartUserFilter(EmailFilter) 
    parameter_name = "user__email" 
 
class CartAdmin(admin.ModelAdmin): 
    list_filter = [ShoppingCartUserFilter, "cart_type"]</code></pre><h3>Bravo: A <strong>Scalable Solution</strong></h3><p>This approach transforms Django Admin&#8217;s search functionality into a powerful, scalable tool capable of handling massive datasets efficiently. By introducing customizable filters, you can address diverse search scenarios without compromising performance. Whether managing billions of records or implementing tailored search logic, this method ensures your admin remains user-friendly and lightning-fast.</p><p><em>&#8220;By wisdom a house is built, and by understanding it is established; by knowledge the rooms are filled with all precious and pleasant riches.&#8221;</em><br><strong>Proverbs 24:3&#8211;4</strong></p>]]></content:encoded></item><item><title><![CDATA[Lessons from the Django Atomic Block Exception Handling]]></title><description><![CDATA[Today we dive into this obscure exception: Unhandled exception: An error occurred in the current transaction. You can&#8217;t execute queries&#8230;]]></description><link>https://blog.schwannden.com/p/lessons-from-the-django-atomic-block-exception-handling</link><guid isPermaLink="false">https://blog.schwannden.com/p/lessons-from-the-django-atomic-block-exception-handling</guid><dc:creator><![CDATA[schwannden]]></dc:creator><pubDate>Fri, 22 Nov 2024 07:19:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/96ab696b-96e0-4a14-814f-542e8be15b04_800x653.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IoZX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IoZX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 424w, https://substackcdn.com/image/fetch/$s_!IoZX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 848w, https://substackcdn.com/image/fetch/$s_!IoZX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 1272w, https://substackcdn.com/image/fetch/$s_!IoZX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IoZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b74307-0462-4517-8fce-7abd60b6f789_800x653.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IoZX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 424w, https://substackcdn.com/image/fetch/$s_!IoZX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 848w, https://substackcdn.com/image/fetch/$s_!IoZX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 1272w, https://substackcdn.com/image/fetch/$s_!IoZX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b74307-0462-4517-8fce-7abd60b6f789_800x653.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Today we dive into this obscure exception: <strong>Unhandled exception: An error occurred in the current transaction. You can&#8217;t execute queries until the end of the &#8216;atomic&#8217; block.</strong></p><h3>What Happened</h3><p>On a sunny Wednesday, we were excited to release a new version of our service to production, which has around 1k~5k active requests per second. As usual, we monitored for unexpected exceptions that happened, and this popped up a few times: <strong>Unhandled exception: An error occurred in the current transaction. You can&#8217;t execute queries until the end of the &#8216;atomic&#8217; block.</strong></p><p>The root cause was found quickly, a <strong>race condition</strong> existed in how one of the tables arehandled, but what troubled us was the strange message that was not helping at all!</p><h3>Our Original Code</h3><pre><code>class A(Model): 
    id: int 
 
class B(Model): 
    id: int 
    a: OneToOneField(A, on_delete=models.CASCADE) 
 
def send_event(a): 
    print(f"{a.id} deleted") 
 
def delete_a(a): 
    with @transaction.atomic(): 
        try: 
            a.delete() 
            send_event(a) 
        except A.NotFound: 
            pass # it is ok 
        other_db_query()</code></pre><p>Note a race condition could already happen, when 2 requests delete the same instance of A, it is likely that we would send the event twice.</p><h3>A refactor that creates this obscure exception</h3><p>We thought making <code>send_event</code> into a signal could help make the main business more clear:</p><pre><code>class A(Model): 
    id: int 
 
class B(Model): 
    id: int 
    a: OneToOneField(A, on_delete=models.CASCADE) 
 
@receiver(post_delete, sender=B) 
def send_event(b): 
    a = b.a 
    print(f"{a.id} deleted") 
 
def delete_a(a): 
    with @transaction.atomic(): 
        try: 
            a.delete() 
        except A.NotFound: 
            pass # it is ok 
        other_db_query()</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dbio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dbio!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 424w, https://substackcdn.com/image/fetch/$s_!Dbio!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 848w, https://substackcdn.com/image/fetch/$s_!Dbio!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 1272w, https://substackcdn.com/image/fetch/$s_!Dbio!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dbio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png" width="975" height="796" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:796,&quot;width&quot;:975,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Dbio!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 424w, https://substackcdn.com/image/fetch/$s_!Dbio!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 848w, https://substackcdn.com/image/fetch/$s_!Dbio!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 1272w, https://substackcdn.com/image/fetch/$s_!Dbio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fcf0ecf-505c-488a-9885-030a9269f541_800x653.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What we expected to happen upon a race condition should be</p><ol><li><p>Request 1 delete A instance, cascade delete B, triggers signal in <code>send_event</code></p></li><li><p>Request 2 delete the same A instance, does the same thing, but finishes first.</p></li><li><p>In request 1, <code>send_event</code> should raise A.NotFound in line <code>a = b.a</code></p></li><li><p>The exception should be handled as disregarded in <code>delete_a</code> try-catch block.</p></li><li><p>Other query should proceed as normal.</p></li></ol><p>But in fact, we receive this <strong>Unhandled exception: An error occurred in the current transaction. You can&#8217;t execute queries until the end of the &#8216;atomic&#8217; block. </strong>And the line of error happens in <code>some other DB query</code>. Why?</p><h3>Django&#8217;s Official Warning</h3><p>In Django&#8217;s official document: <a href="https://docs.djangoproject.com/en/5.1/topics/db/transactions/#controlling-transactions-explicitly">https://docs.djangoproject.com/en/5.1/topics/db/transactions/#controlling-transactions-explicitly</a></p><p>It states that one should <strong>Avoid catching exceptions inside <code>atomic</code>!</strong></p><p>Why? Because inside an atomic session, when a DB query failed, it not only raises exception, but it mark the transaction state as being corrupted. This is so that during the <code>__exit__</code> handling of a <code>with transaction.atomic()</code> context, it can properly rollback the session.</p><p>In our case, the exception raised from <code>a = b.a</code> is caught indeed! but the atomic session state has been marked as corrupted. So in <code>some other DB query</code> , we have this obscure exception which is not helpful, and took us a long time to find the root cause.</p><p>What should be done in this situation?</p><p>Following Django&#8217;s document suggestion, if we are to handle an exception within a atomic session, it is best to create a nested session and try catch it. This update will fix the issue</p><pre><code>@receiver(post_delete, sender=B) 
def send_event(b): 
    try: 
        with transaction.atomic(): 
            a = b.a 
            print(f"{a.id} deleted") 
    except A.NotFound: 
        pass</code></pre><p>Since a NotFound exception is not something that actually breaks the database, we let the inner session handles the rollback (which does nothing), and set the session state back to normal, some that later DB query can be executed normally.</p><h3>Wrapping It All Up: The Art of Taming Transactions</h3><p>In high-concurrency systems, even caught exceptions can corrupt transactions. Django&#8217;s atomic blocks demand careful handling&#8202;&#8212;&#8202;use nested transactions to isolate risks and follow framework warnings. Resilient code isn&#8217;t just functional; it&#8217;s designed for real-world complexity. Remember, every obscure error is a chance to learn and improve.</p><p><em>&#8220;Unless the Lord builds the house, those who build it labor in vain.&#8221;</em></p><p>&#8212; <strong>Psalm 127:1</strong></p>]]></content:encoded></item></channel></rss>