<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>NikTech AI — Engineering notes</title>
  <link>https://niktechai.com/blog/</link>
  <atom:link href="https://niktechai.com/feed.xml" rel="self" type="application/rss+xml"/>
  <description>Field notes on shipping AI agents against real enterprise data.</description>
  <language>en-us</language>
  <item>
    <title>The credential you never created can&#x27;t leak</title>
    <link>https://niktechai.com/blog/zero-credential-workers/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/zero-credential-workers/</guid>
    <description>Reaching object storage from an edge function via the S3 API puts access keys inside the function. Native bindings remove the secret from the system entirely.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>A TLS handshake failure usually means the service was never provisioned</title>
    <link>https://niktechai.com/blog/tls-handshake-means-not-provisioned/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/tls-handshake-means-not-provisioned/</guid>
    <description>TLS errors against a managed cloud endpoint are rarely certificate problems. Usually the subdomain was never provisioned for your account.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>Sieve rules don&#x27;t run on imported or fetched mail</title>
    <link>https://niktechai.com/blog/sieve-rules-fetched-mail/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/sieve-rules-fetched-mail/</guid>
    <description>Your Sieve filter is correct and still does nothing. Sieve fires on delivery — mail pulled from another provider bypasses it entirely.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>Your launchd agent can&#x27;t reach the LAN, and macOS won&#x27;t tell you why</title>
    <link>https://niktechai.com/blog/launchd-macos-local-network-block/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/launchd-macos-local-network-block/</guid>
    <description>A LaunchAgent gets &quot;All connection attempts failed&quot; on your own network while the same code works in a shell. macOS enforces this per binary.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>The five rungs of agent engineering</title>
    <link>https://niktechai.com/blog/five-rungs-of-agent-engineering/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/five-rungs-of-agent-engineering/</guid>
    <description>Prompt, context, loop, graph, ownership. Most teams stall on rung one and wonder why their AI never leaves the demo. A ladder for what to fix next.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>Make your agent fail closed</title>
    <link>https://niktechai.com/blog/fail-closed-agent-tools/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/fail-closed-agent-tools/</guid>
    <description>The worst agent bug isn&#x27;t a wrong answer — it&#x27;s a confident answer built on a tool that quietly returned nothing. A design rule, and where to enforce it.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>Your Fabric data agent is answering from world knowledge — and not telling you</title>
    <link>https://niktechai.com/blog/fabric-data-agent-world-knowledge/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/fabric-data-agent-world-knowledge/</guid>
    <description>An on-behalf-of identity mismatch makes enterprise retrieval fail silently, so the model answers from world knowledge instead. It looks right. It isn&#x27;t.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>Cloudflare Pages returns 200 for pages that don&#x27;t exist</title>
    <link>https://niktechai.com/blog/cloudflare-pages-soft-404/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/cloudflare-pages-soft-404/</guid>
    <description>Without a 404.html, Pages serves your homepage with HTTP 200 for every unknown URL. Google reads that as an infinite site of duplicates. One file fixes it.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
  <item>
    <title>Capability URLs vs OAuth for a personal MCP server</title>
    <link>https://niktechai.com/blog/capability-urls-vs-oauth-mcp/</link>
    <guid isPermaLink="true">https://niktechai.com/blog/capability-urls-vs-oauth-mcp/</guid>
    <description>OAuth is right for a product. For a single-user MCP server it can be why the thing never ships. What a capability URL actually costs you, stated plainly.</description>
    <pubDate>2026-08-25</pubDate>
  </item>
</channel>
</rss>
