<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title><![CDATA[Sage Ideas — AI Engineering]]></title>
    <description><![CDATA[Practical writing on agents, AI apps, automation, evaluation, and production workflows from a solo AI-native studio.]]></description>
    <link>https://www.sageideas.dev/topics/ai-engineering</link>
    <atom:link href="https://www.sageideas.dev/feed/ai-engineering.xml" rel="self" type="application/rss+xml"/>
    <language>en-us</language>
    <managingEditor>sage@sageideas.dev (Jason Teixeira)</managingEditor>
    <lastBuildDate>Wed, 05 Aug 2026 06:02:27 GMT</lastBuildDate>
    <ttl>60</ttl>
    <item>
      <title><![CDATA[The AI Implementation Audit Before You Build]]></title>
      <description><![CDATA[Before you build an AI agent, copilot, RAG system, or workflow automation, audit the workflow, data, risk, cost, and measurement loop.]]></description>
      <content:encoded><![CDATA[<h1>The AI Implementation Audit Before You Build</h1>
<p>Most AI projects should not start with a model.</p>
<p>They should start with an audit.</p>
<p>Not a generic readiness survey. A real implementation audit that answers five questions:</p>
<ol>
<li>What workflow is actually broken?</li>
<li>What data can the system trust?</li>
<li>What actions should AI never take alone?</li>
<li>What does quality mean?</li>
<li>What would make the project worth the cost?</li>
</ol>
<p>:::system-diagram title=&quot;AI implementation audit loop&quot; label=&quot;workflow -&gt; risk -&gt; build&quot; nodes=&quot;Workflow,Data,Risk,Plan&quot;
The audit turns a messy workflow into a ranked build plan. The point is not to prove AI can be used. The point is to decide where it should be used first.
:::</p>
<h2>Start with the workflow</h2>
<p>The workflow tells you whether AI belongs there.</p>
<p>Look for repeated decisions, repeated writing, repeated triage, repeated lookup, repeated handoff, and repeated follow-up.</p>
<p>Then ask what happens when the system gets it wrong.</p>
<p>If a wrong answer is annoying, you can automate more aggressively.</p>
<p>If a wrong answer touches money, customers, legal exposure, health, safety, or trust, the system needs review, evals, and escalation.</p>
<h2>Map the data</h2>
<p>AI systems are limited by source quality.</p>
<p>The audit should identify:</p>
<ul>
<li>where the source data lives</li>
<li>whether it is current</li>
<li>who owns it</li>
<li>who is allowed to see it</li>
<li>what the system should cite</li>
<li>what the system should refuse to answer</li>
</ul>
<p>If nobody owns the source, the AI will inherit the mess.</p>
<p>:::proof-note title=&quot;Why RAG systems fail&quot; label=&quot;field note&quot;
Most weak RAG systems are not weak because the vector database is bad. They are weak because the corpus is messy, the chunking strategy ignores the source material, and nobody measures whether the answer is faithful.
:::</p>
<h2>Define the no-fly zone</h2>
<p>Every AI system needs a no-fly zone.</p>
<p>Examples:</p>
<ul>
<li>refunds over a threshold</li>
<li>legal advice</li>
<li>medical advice</li>
<li>firing decisions</li>
<li>customer-facing promises</li>
<li>price exceptions</li>
<li>production writes</li>
<li>destructive file operations</li>
</ul>
<p>The audit should decide what requires human review before the first prototype exists.</p>
<p>:::checklist title=&quot;Audit questions before writing code&quot; label=&quot;implementation&quot;</p>
<ul>
<li>What exact workflow is being replaced or assisted?</li>
<li>What source data is allowed?</li>
<li>What action requires approval?</li>
<li>What quality metric can be tested?</li>
<li>What cost ceiling is acceptable?</li>
<li>What dashboard will prove the system is working?
:::</li>
</ul>
<h2>Decide what to build first</h2>
<p>The first AI project should usually be narrow.</p>
<p>Good first builds:</p>
<ul>
<li>support triage</li>
<li>quote drafting</li>
<li>document extraction</li>
<li>internal knowledge assistant</li>
<li>lead qualification</li>
<li>customer follow-up</li>
<li>report generation</li>
</ul>
<p>Weak first builds:</p>
<ul>
<li>“AI for everything”</li>
<li>autonomous sales agent with no guardrails</li>
<li>executive dashboard with no source discipline</li>
<li>chatbot on top of unmaintained docs</li>
</ul>
<p>:::scorecard title=&quot;Build-first vs audit-first&quot; label=&quot;decision&quot;</p>
<table>
<thead>
<tr>
<th>Decision</th>
<th>Build-first risk</th>
<th>Audit-first output</th>
</tr>
</thead>
<tbody><tr>
<td>Workflow</td>
<td>vague automation</td>
<td>named process</td>
</tr>
<tr>
<td>Data</td>
<td>messy sources</td>
<td>source register</td>
</tr>
<tr>
<td>Risk</td>
<td>hidden liability</td>
<td>review boundaries</td>
</tr>
<tr>
<td>Quality</td>
<td>vibes</td>
<td>eval criteria</td>
</tr>
<tr>
<td>Cost</td>
<td>surprise invoice</td>
<td>spend model</td>
</tr>
<tr>
<td>:::</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h2>The output should be a build plan</h2>
<p>A good audit ends with a ranked plan:</p>
<ul>
<li>build now</li>
<li>build later</li>
<li>buy instead</li>
<li>skip entirely</li>
</ul>
<p>That last category matters.</p>
<p>The strongest AI strategy often includes the work you deliberately do not automate.</p>
<p>:::offer-cta title=&quot;Start with the audit&quot; label=&quot;studio route&quot; href=&quot;/services/ai-implementation-consulting&quot; cta=&quot;View AI implementation consulting&quot;
If the workflow is messy and the AI path is unclear, start with the implementation consulting route before buying a larger build.
:::</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/the-ai-implementation-audit-before-you-build</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/the-ai-implementation-audit-before-you-build</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[AI Engineering]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[What an AI-Native Studio Actually Builds]]></title>
      <description><![CDATA[An AI-native studio is not a prompt shop. It builds the product surface, the operating system underneath it, and the measurement loop that keeps it honest.]]></description>
      <content:encoded><![CDATA[<h1>What an AI-Native Studio Actually Builds</h1>
<p>An AI-native studio is not a prompt shop.</p>
<p>It is not a design agency with a chatbot added to the offer.</p>
<p>It is not a consultant writing “AI transformation” slides.</p>
<p>The useful version builds three layers at the same time:</p>
<ol>
<li>the product people touch</li>
<li>the operating system underneath it</li>
<li>the growth and measurement loop that makes the work compound</li>
</ol>
<p>That is the Sage Ideas model.</p>
<p>:::system-diagram title=&quot;AI-native studio model&quot; label=&quot;surface -&gt; system -&gt; growth&quot; nodes=&quot;Product,AI,Proof,Growth&quot;
The product is the visible surface. The AI is only useful when it is wired to real data, workflows, permissions, and measurement. Proof then becomes the growth asset.
:::</p>
<h2>The product surface</h2>
<p>The surface is what a buyer, user, customer, or team member actually experiences.</p>
<p>For a SaaS product, that might be onboarding, billing, dashboards, settings, and a support flow.</p>
<p>For an internal AI system, that might be a Slack assistant, admin queue, review dashboard, or approval workflow.</p>
<p>For a brand and growth system, that might be a homepage, service matrix, content engine, diagnostic tool, and academy funnel.</p>
<p>The surface has to feel premium because people judge the system through it.</p>
<p>But the surface is not the whole product.</p>
<h2>The system underneath</h2>
<p>The system is where most agency work falls apart.</p>
<p>An AI feature is not real because it responds in a demo. It becomes real when it has:</p>
<ul>
<li>source data</li>
<li>permissions</li>
<li>evals</li>
<li>cost limits</li>
<li>retry logic</li>
<li>human review</li>
<li>observability</li>
<li>fallback behavior</li>
<li>documentation</li>
</ul>
<p>That is why the Sage Ideas site uses the “Surface ⇄ System” pattern. It is not decoration. It is the actual way the work should be sold and built.</p>
<p>:::proof-note title=&quot;Real proof inside Sage Ideas&quot; label=&quot;receipt&quot;
Nexural is presented with 185 database tables, 69 endpoints, Stripe billing, Discord AI, real product screenshots, architecture diagrams, and a proof board. Those are the kinds of receipts a serious buyer should expect from a technical studio.
:::</p>
<h2>The growth loop</h2>
<p>The growth loop is where the work starts to become a machine.</p>
<p>Every shipped product should create new proof:</p>
<ul>
<li>a screenshot</li>
<li>a case-study diagram</li>
<li>a technical teardown</li>
<li>a before/after workflow</li>
<li>a metric</li>
<li>a reusable template</li>
<li>a course module</li>
<li>a diagnostic question</li>
</ul>
<p>Those assets can become SEO pages, newsletter issues, academy lessons, sales enablement, and route-finder logic.</p>
<p>That is how one build becomes ten distribution assets without pretending the content is separate from the product.</p>
<p>:::scorecard title=&quot;What the studio actually ships&quot; label=&quot;scorecard&quot;</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Good output</th>
<th>Bad output</th>
</tr>
</thead>
<tbody><tr>
<td>Product</td>
<td>working surface users can inspect</td>
<td>mockup-only presentation</td>
</tr>
<tr>
<td>AI</td>
<td>eval-gated workflow</td>
<td>prompt demo</td>
</tr>
<tr>
<td>Brand</td>
<td>clear offer and route</td>
<td>pretty words</td>
</tr>
<tr>
<td>Growth</td>
<td>search and nurture system</td>
<td>random posts</td>
</tr>
<tr>
<td>Proof</td>
<td>receipts and case diagrams</td>
<td>fake testimonials</td>
</tr>
<tr>
<td>:::</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h2>The buyer should know the route quickly</h2>
<p>A premium studio site has to route people fast.</p>
<p>There are usually three visitor types:</p>
<ul>
<li>buyers who want the studio to build the system</li>
<li>operators who want a diagnostic first</li>
<li>builders who want to learn through an academy</li>
</ul>
<p>The homepage, services matrix, blog, academy, and route finder should all push those people into the right path.</p>
<p>:::checklist title=&quot;AI-native studio page checklist&quot; label=&quot;route logic&quot;</p>
<ul>
<li>The first screen explains the offer without a sales call.</li>
<li>The services matrix names the buyer state and next action.</li>
<li>Work pages show surface and system proof.</li>
<li>Blog posts include a route into Studio, Academy, or diagnostics.</li>
<li>Claims are backed by real projects, screenshots, docs, or public work.
:::</li>
</ul>
<h2>The standard</h2>
<p>The standard is simple:</p>
<p>do not sell AI as magic.</p>
<p>Sell the business system it powers.</p>
<p>Show the product.</p>
<p>Show the architecture.</p>
<p>Show the proof.</p>
<p>Then route the buyer into the right next step.</p>
<p>:::offer-cta title=&quot;Find the right route&quot; label=&quot;next step&quot; href=&quot;/tools/route-finder&quot; cta=&quot;Run the route finder&quot;
If you are not sure whether you need a studio build, an audit, or an academy path, use the route finder first. It is built to diagnose the buyer state before forcing a call.
:::</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/what-an-ai-native-studio-actually-builds</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/what-an-ai-native-studio-actually-builds</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[AI Engineering]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[How to Evaluate AI Features Before You Ship Them]]></title>
      <description><![CDATA[A practical evaluation loop for AI features: define the promise, build a failure set, test the boring cases, and keep a human in the loop until the system earns trust.]]></description>
      <content:encoded><![CDATA[<h1>How to Evaluate AI Features Before You Ship Them</h1>
<p>An AI feature is not done when it works in the demo.</p>
<p>That is the trap. You ask it three friendly questions, it answers two and a half of them, everyone sees the shape of the future, and suddenly the product roadmap has a feature called &quot;AI assistant&quot; sitting where a spec should be.</p>
<p>I do not trust that version of the process. I trust the slower one: name the promise, write the failure cases, test the boring path, and keep a human close until the system proves it can behave.</p>
<p>:::system-diagram title=&quot;AI evaluation loop&quot; label=&quot;promise -&gt; proof&quot; nodes=&quot;Promise,Failures,Review,Ship&quot;
The feature is not evaluated once. It moves through a loop: define the promise, build the failure set, review real outputs, and only then decide what can ship.
:::</p>
<h2>Start with the promise</h2>
<p>The first question is not &quot;Which model should we use?&quot;</p>
<p>The first question is: what is the user allowed to believe after this feature responds?</p>
<p>That sentence matters. If the feature summarizes a document, the user believes the summary is faithful. If it drafts a support reply, the user believes it will not invent a refund policy. If it explains a trading signal, the user believes it is not financial advice wearing a friendly tone.</p>
<p>Write the promise in one line:</p>
<ul>
<li>&quot;This feature classifies the request and routes it to the right workflow.&quot;</li>
<li>&quot;This feature drafts a response that a human approves before sending.&quot;</li>
<li>&quot;This feature searches internal docs and cites the source it used.&quot;</li>
</ul>
<p>If the promise takes a paragraph, the feature is not scoped yet.</p>
<h2>Build the failure set before the happy path</h2>
<p>Most AI demos are trained by accident to pass the demo.</p>
<p>The real evaluation set should include the inputs that make the product uncomfortable:</p>
<ul>
<li>vague requests</li>
<li>conflicting instructions</li>
<li>missing context</li>
<li>malicious prompt injection</li>
<li>old policy docs</li>
<li>duplicate records</li>
<li>customer messages with anger in them</li>
<li>edge cases that cost money if mishandled</li>
</ul>
<p>For a client-facing AI workflow, I want at least 25 examples before I trust the shape of the system. Not 25 perfect benchmark rows. Twenty-five ugly examples that represent the actual work.</p>
<p>The evaluation set is not paperwork. It is the boundary of the product.</p>
<h2>Separate model quality from product quality</h2>
<p>A model can be good and the product can still be bad.</p>
<p>The model might produce a correct answer with no citation. The workflow might cite the right document but bury the important warning. The UI might make the answer look final when it is only a draft.</p>
<p>I score AI features in layers:</p>
<ol>
<li>Did it understand the task?</li>
<li>Did it use the right source or tool?</li>
<li>Did it avoid making claims outside the source?</li>
<li>Did it return the result in a shape the user can act on?</li>
<li>Did the UI make the system&#39;s confidence and limits clear?</li>
</ol>
<p>Only the first two are mostly model questions. The rest are product questions.</p>
<h2>Keep a human in the loop longer than feels convenient</h2>
<p>The first production version of an AI workflow should usually be draft-first, not send-first.</p>
<p>That sounds less magical. Good.</p>
<p>Draft-first gives you review data. It shows where users edit the output, where they reject it, which fields they correct, and which tasks should never have been automated in the first place.</p>
<p>The human review step is not a permanent crutch. It is instrumentation.</p>
<p>When the edits become predictable, automate the edit. When the rejects cluster around one input type, change the router. When the reviewer keeps checking the same source manually, add retrieval and citation.</p>
<p>You do not remove the human because the demo worked. You remove the human when the review log says the system has earned it.</p>
<h2>The shipping checklist</h2>
<p>Before I ship an AI feature, I want these in place:</p>
<p>:::checklist title=&quot;AI feature shipping checklist&quot; label=&quot;checklist&quot;</p>
<ul>
<li><p>A one-sentence promise.</p>
</li>
<li><p>An evaluation set with ugly examples.</p>
</li>
<li><p>Pass/fail criteria for each example.</p>
</li>
<li><p>Logging for prompt, tool calls, sources, and outcome.</p>
</li>
<li><p>A human-review path for high-risk outputs.</p>
</li>
<li><p>A fallback when the model is unavailable.</p>
</li>
<li><p>A way to report bad output from the UI.
:::</p>
</li>
<li><p>a one-sentence promise</p>
</li>
<li><p>an evaluation set with ugly examples</p>
</li>
<li><p>pass/fail criteria for each example</p>
</li>
<li><p>logging for prompt, tool calls, sources, and outcome</p>
</li>
<li><p>a human-review path for high-risk outputs</p>
</li>
<li><p>a fallback when the model is unavailable</p>
</li>
<li><p>a way to report bad output from the UI</p>
</li>
</ul>
<p>None of this makes the feature less impressive.</p>
<p>It makes the feature real.</p>
<p>:::offer-cta title=&quot;Need an AI feature evaluated before launch?&quot; label=&quot;next step&quot; href=&quot;/tools/route-finder&quot; cta=&quot;Find your route&quot;
Use the Route Finder to decide whether this needs an AI audit, automation scope, academy path, or full product build.
:::</p>
<p>Related system: <a href="/blog/the-ai-implementation-audit-before-you-build">The AI implementation audit before you build</a> breaks this same idea into a pre-build audit path for teams deciding what to automate first.</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/how-to-evaluate-ai-features-before-you-ship-them</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/how-to-evaluate-ai-features-before-you-ship-them</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[AI]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[RAG Evaluation Without the Benchmark Theater]]></title>
      <description><![CDATA[A grounded way to evaluate retrieval-augmented generation: source coverage, citation faithfulness, refusal behavior, and task-level usefulness.]]></description>
      <content:encoded><![CDATA[<h1>RAG Evaluation Without the Benchmark Theater</h1>
<p>The first RAG demo always works.</p>
<p>You upload the clean PDF. You ask the obvious question. The model finds the obvious paragraph and answers in the tone of a well-funded consultant.</p>
<p>Then a user asks the question with the wrong acronym, the policy changed three weeks ago, the answer lives across two docs, and the system cites a paragraph that sounds related but does not actually support the claim.</p>
<p>That is when the product starts.</p>
<h2>Retrieval is the first product decision</h2>
<p>RAG quality starts before the model sees anything.</p>
<p>The retrieval layer decides what the model is allowed to know. If the wrong chunks come back, the answer is already compromised. A better prompt might hide the problem. It will not fix it.</p>
<p>I evaluate retrieval with boring questions:</p>
<ul>
<li>Did the right document appear in the top results?</li>
<li>Did the right section appear, not just the right file?</li>
<li>Did newer material outrank older material?</li>
<li>Did the query work when phrased like a real user would phrase it?</li>
<li>Did the system return nothing when nothing was the honest answer?</li>
</ul>
<p>That last one matters. A search system that always returns something teaches the model to always say something.</p>
<h2>Citation faithfulness beats answer confidence</h2>
<p>The answer is not enough.</p>
<p>For any knowledge system, I want to know whether the cited source actually supports the sentence being claimed.</p>
<p>That means evaluating at the claim level, not just the response level. If the answer has four claims and only two are supported, the answer is not &quot;mostly right.&quot; It is dangerous in a way that looks polished.</p>
<p>A simple rubric works:</p>
<ul>
<li>Supported: the citation directly proves the claim.</li>
<li>Partial: the citation is related but does not fully prove it.</li>
<li>Unsupported: the citation does not prove the claim.</li>
<li>Contradicted: the citation says the opposite.</li>
</ul>
<p>You do not need an elaborate benchmark to start. You need 30 real questions and the discipline to mark the misses honestly.</p>
<h2>Refusal is a feature</h2>
<p>RAG systems need to know when not to answer.</p>
<p>That means testing questions where the corpus does not contain the answer. It also means testing questions where the answer is sensitive, outdated, or depends on context the user did not provide.</p>
<p>Good refusal behavior sounds like:</p>
<p>&quot;I do not see that in the available sources. The closest related document is X, but it does not answer the question directly.&quot;</p>
<p>Bad refusal behavior sounds like:</p>
<p>&quot;Based on the available information, it appears...&quot;</p>
<p>That phrase is where hallucinations put on a blazer.</p>
<h2>The useful scorecard</h2>
<p>For an internal RAG system, I would rather track five grounded metrics than one impressive benchmark score:</p>
<ol>
<li>Retrieval hit rate: did the right source appear?</li>
<li>Citation faithfulness: did the source support the answer?</li>
<li>Refusal accuracy: did it decline unsupported questions?</li>
<li>Answer usefulness: could the user take the next step?</li>
<li>Edit distance: how much did a human need to change?</li>
</ol>
<p>The last metric is the most honest one. If users keep rewriting the answer, the system is not saving them time. It is creating a polite first draft they have to supervise.</p>
<h2>Start small enough to measure</h2>
<p>The right first RAG system is usually not &quot;company brain.&quot;</p>
<p>It is one corpus, one workflow, one user type, and one clear action after the answer. Support macros. Sales enablement. Policy lookup. Internal engineering docs. Contract clause search.</p>
<p>Narrow scope makes evaluation possible.</p>
<p>Evaluation makes trust possible.</p>
<p>Trust makes expansion possible.</p>
<p>That order matters.</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/rag-evaluation-without-the-benchmark-theater</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/rag-evaluation-without-the-benchmark-theater</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[AI]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[The AI Agent Boundary Problem]]></title>
      <description><![CDATA[The hard part of AI agents is not giving them tools. It is deciding where the agent stops, where software starts, and where a human must stay accountable.]]></description>
      <content:encoded><![CDATA[<h1>The AI Agent Boundary Problem</h1>
<p>The easiest way to make an AI agent look powerful is to give it too much authority.</p>
<p>Let it read everything. Let it write everywhere. Let it call the API, send the email, update the CRM, refund the invoice, and explain itself afterward in a confident paragraph.</p>
<p>That is not a product. That is a permissions incident waiting for a calendar invite.</p>
<p>The hard part of agents is not tool use. The hard part is the boundary.</p>
<p>:::proof-note title=&quot;The boundary is the product&quot; label=&quot;field note&quot;
An AI agent is not safer because the prompt sounds careful. It is safer when the surrounding system controls tools, permissions, approvals, logs, and stop conditions.
:::</p>
<h2>An agent is not a job title</h2>
<p>&quot;Sales agent&quot; is not a spec.</p>
<p>Neither is &quot;support agent,&quot; &quot;research agent,&quot; or &quot;ops agent.&quot; Those phrases describe a fantasy employee, not a software boundary.</p>
<p>A useful agent spec names the actual loop:</p>
<ul>
<li>read these inputs</li>
<li>choose from these actions</li>
<li>ask for approval under these conditions</li>
<li>write to these systems</li>
<li>log these decisions</li>
<li>stop when this happens</li>
</ul>
<p>The smaller the loop, the better the agent.</p>
<p>The agent should own one decision surface. Routing. Drafting. Extracting. Checking. Reconciling. Not &quot;run operations.&quot;</p>
<p>:::system-diagram title=&quot;Agent boundary map&quot; label=&quot;surface -&gt; system&quot; nodes=&quot;Input,Policy,Approval,Audit&quot;
The visible agent is only the surface. The durable product is the system around it: policy, tool boundaries, approval gates, and an audit trail.
:::</p>
<h2>Tools should be narrow, not impressive</h2>
<p>Most agent demos show a tool list like a trophy case.</p>
<p>The better production pattern is boring:</p>
<ul>
<li>one search tool</li>
<li>one structured read tool</li>
<li>one draft tool</li>
<li>one write tool with an approval gate</li>
<li>one escalation path</li>
</ul>
<p>Each tool should do less than the model wants it to do. The model can ask. The system decides.</p>
<p>If a tool can mutate data, it needs constraints outside the prompt. Schema validation. Allow lists. Rate limits. Idempotency keys. Audit logs. Human approval when money, access, or reputation is involved.</p>
<p>The prompt is not the permission model.</p>
<h2>Humans are not a fallback for bad design</h2>
<p>&quot;Human in the loop&quot; gets used as a decorative phrase.</p>
<p>It should mean a real control point. A human sees the proposed action, the source evidence, the reason, the risk, and the exact diff. They can approve, edit, reject, or route it somewhere else.</p>
<p>If the review screen only shows the final answer, the reviewer is not reviewing. They are guessing with better typography.</p>
<p>A good approval screen shows:</p>
<ul>
<li>what changed</li>
<li>why the agent thinks it should change</li>
<li>which sources it used</li>
<li>what it could not verify</li>
<li>what happens if the reviewer says yes</li>
</ul>
<p>That is the difference between a workflow and a magic trick.</p>
<h2>Regular software is still allowed</h2>
<p>Not every workflow needs an agent.</p>
<p>If the decision tree is stable, write software. If the output must be exact, write software. If the input is structured and the action is deterministic, write software.</p>
<p>Use an agent where language, ambiguity, and judgment are the actual problem.</p>
<p>That usually means the agent sits at the edge of a system, translating messy human input into structured work. It does not replace the system. It feeds it.</p>
<h2>The boundary checklist</h2>
<p>Before building an agent, I want five sentences:</p>
<p>:::checklist title=&quot;Agent boundary checklist&quot; label=&quot;checklist&quot;</p>
<ul>
<li>The agent is allowed to decide one narrow thing.</li>
<li>The agent is not allowed to mutate money, access, or reputation without review.</li>
<li>Every write action has schema validation outside the prompt.</li>
<li>Human approval shows evidence, reason, risk, and exact diff.</li>
<li>Every action lands in an audit log.
:::</li>
</ul>
<ol>
<li>The agent is allowed to decide ___.</li>
<li>The agent is not allowed to decide ___.</li>
<li>The agent can call these tools: ___.</li>
<li>The agent must ask a human before ___.</li>
<li>Every action is logged in ___.</li>
</ol>
<p>If those sentences are hard to write, the agent is not ready to build.</p>
<p>The boundary is the product.</p>
<p>:::offer-cta title=&quot;Need an AI workflow scoped safely?&quot; label=&quot;next step&quot; href=&quot;/tools/route-finder&quot; cta=&quot;Find your route&quot;
Use the Route Finder to decide whether this should be an automation audit, a full studio build, or an academy learning path.
:::</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/the-ai-agent-boundary-problem</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/the-ai-agent-boundary-problem</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[AI]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[Building an AI Discord Bot for a Trading Community]]></title>
      <description><![CDATA[How I built the Nexural Discord AI Engine — 30+ commands, GPT-4o integration, auto-moderation, and market intelligence. Lessons on AI safety in financial contexts.]]></description>
      <content:encoded><![CDATA[<h1>Building an AI Discord Bot for a Trading Community</h1>
<p>Trading communities have unique needs that generic bots can&#39;t handle. Traders need market data, not memes. They need AI that understands financial context, not generic chatbots. They need moderation that catches pump-and-dump schemes, not just spam.</p>
<p>I built the Nexural Discord AI Engine to solve these problems. Here&#39;s what went into it.</p>
<h2>The Architecture</h2>
<p>The bot runs as a Node.js service with:</p>
<ul>
<li><strong>Discord.js</strong> for the bot framework</li>
<li><strong>GPT-4o</strong> for natural language interactions</li>
<li><strong>Supabase</strong> for persistent storage (user data, conversation history, moderation logs)</li>
<li><strong>Alpaca API</strong> for real-time market data</li>
<li><strong>Custom middleware</strong> for rate limiting, permission checks, and audit logging</li>
</ul>
<h2>30+ Commands, 12 Phases</h2>
<p>I built this iteratively across 12 development phases:</p>
<ul>
<li><strong>Phase 0-2:</strong> Core commands, welcome system, basic moderation</li>
<li><strong>Phase 3-5:</strong> Market data integration, AI chat, portfolio tracking</li>
<li><strong>Phase 6-8:</strong> Auto-moderation, community management, role management</li>
<li><strong>Phase 9-12:</strong> Analytics, alerting, performance optimization</li>
</ul>
<p>Each phase had its own test suite and rollback plan. I never deployed more than one phase at a time.</p>
<h2>AI Safety in Financial Contexts</h2>
<p>This is where it gets serious. An AI bot in a trading community can&#39;t:</p>
<ul>
<li>Give financial advice (legal liability)</li>
<li>Generate trading signals (regulatory issues)</li>
<li>Confirm or deny specific trade ideas (responsibility)</li>
</ul>
<p>My approach:</p>
<p><strong>Strict system prompts:</strong> GPT-4o receives a 2,000-word system prompt that explicitly defines what it can and cannot discuss. Every response is framed as educational, never advisory.</p>
<p><strong>Response validation:</strong> Before any AI response is sent to Discord, it passes through a filter that checks for:</p>
<ul>
<li>Price predictions (&quot;will go up/down&quot;)</li>
<li>Specific trade recommendations (&quot;buy/sell X&quot;)</li>
<li>Guarantees or promises of returns</li>
<li>Inappropriate content</li>
</ul>
<p><strong>Disclaimers:</strong> Every AI response includes a footer: &quot;This is educational content, not financial advice.&quot;</p>
<p><strong>Audit logging:</strong> Every AI interaction is logged to Supabase with the prompt, response, and whether any filters triggered.</p>
<h2>Market Data Integration</h2>
<p>The Alpaca API provides real-time market data:</p>
<p>\</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/building-an-ai-discord-bot-for-a-trading-community</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/building-an-ai-discord-bot-for-a-trading-community</guid>
      <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[AI]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[The Solo Engineer's Toolkit: Tools That Replace a Team]]></title>
      <description><![CDATA[How I operate as a solo engineer building production systems — the tools, workflows, and automations that let one person do the work of a small team.]]></description>
      <content:encoded><![CDATA[<h1>The Solo Engineer&#39;s Toolkit: Tools That Replace a Team</h1>
<p>As a solo engineer building production systems, I need tools that replace an entire team: project manager, QA engineer, DevOps engineer, security analyst, and designer.</p>
<p>Here&#39;s my actual toolkit — not aspirational, but what I use daily.</p>
<h2>Development</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Replaces</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Claude Code (CLI)</strong></td>
<td>Pair programmer</td>
<td>Code reviews, architecture discussions, debugging</td>
</tr>
<tr>
<td><strong>GitHub Copilot</strong></td>
<td>Junior developer</td>
<td>Boilerplate, test generation, documentation</td>
</tr>
<tr>
<td><strong>VS Code</strong></td>
<td>IDE (obviously)</td>
<td>Extensions: ESLint, Prettier, GitLens, Tailwind</td>
</tr>
<tr>
<td><strong>Cursor</strong></td>
<td>Code navigation</td>
<td>When I need to understand a large codebase fast</td>
</tr>
</tbody></table>
<h2>Operations</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Replaces</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td><strong>GitHub Actions</strong></td>
<td>CI/CD engineer</td>
<td>Free for public repos, YAML-based, matrix builds</td>
</tr>
<tr>
<td><strong>Vercel</strong></td>
<td>DevOps team</td>
<td>Zero-config Next.js deploys, preview URLs, analytics</td>
</tr>
<tr>
<td><strong>Supabase</strong></td>
<td>Database admin</td>
<td>Managed Postgres, auth, real-time, backups</td>
</tr>
<tr>
<td><strong>Better Stack</strong></td>
<td>On-call engineer</td>
<td>Uptime monitoring, incident alerts, status pages</td>
</tr>
</tbody></table>
<h2>Quality</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Replaces</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Playwright</strong></td>
<td>QA engineer</td>
<td>E2E tests that run in CI, visual regression</td>
</tr>
<tr>
<td><strong>pytest</strong></td>
<td>Test framework</td>
<td>Fixtures, parametrize, plugins ecosystem</td>
</tr>
<tr>
<td><strong>Lighthouse CI</strong></td>
<td>Performance reviewer</td>
<td>Automated performance budgets per deploy</td>
</tr>
<tr>
<td><strong>Bandit</strong></td>
<td>Security reviewer</td>
<td>Python security linting in CI</td>
</tr>
</tbody></table>
<h2>Design</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Replaces</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td><strong>v0 by Vercel</strong></td>
<td>UI designer</td>
<td>Generate component code from descriptions</td>
</tr>
<tr>
<td><strong>Tailwind CSS</strong></td>
<td>Design system</td>
<td>Consistent, utility-first, no custom CSS needed</td>
</tr>
<tr>
<td><strong>Lucide Icons</strong></td>
<td>Icon designer</td>
<td>Consistent icon set, tree-shakeable</td>
</tr>
<tr>
<td><strong>Excalidraw</strong></td>
<td>Diagramming tool</td>
<td>Architecture diagrams, dark theme, exports to PNG</td>
</tr>
</tbody></table>
<h2>Communication</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Replaces</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Loom</strong></td>
<td>Meeting facilitator</td>
<td>Async video updates for clients</td>
</tr>
<tr>
<td><strong>Notion</strong></td>
<td>Project manager</td>
<td>Docs, task tracking, knowledge base</td>
</tr>
<tr>
<td><strong>Cal.com</strong></td>
<td>Scheduling assistant</td>
<td>Free calendar booking for discovery calls</td>
</tr>
<tr>
<td><strong>Discord</strong></td>
<td>Team chat</td>
<td>Community management, bot testing</td>
</tr>
</tbody></table>
<h2>The Workflow</h2>
<p>My daily workflow:</p>
<p>\</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/the-solo-engineer</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/the-solo-engineer</guid>
      <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
      <category><![CDATA[Career]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
    <item>
      <title><![CDATA[The Automation Mindset: If You Do It Twice, Script It]]></title>
      <description><![CDATA[I have 47 shell scripts, 6 CI workflows, and a cron job that texts me when my SSL cert is expiring. Here's the mindset behind automating everything.]]></description>
      <content:encoded><![CDATA[<h1>The Automation Mindset: If You Do It Twice, Script It</h1>
<p>Last Tuesday, I ran a database migration, tested 3 API endpoints, checked the Stripe webhook logs, verified the CI pipeline was green, and deployed to production. Total time: 4 minutes.</p>
<p>It used to take 45.</p>
<p>The difference isn&#39;t that I got faster at clicking buttons. It&#39;s that I stopped clicking buttons entirely.</p>
<h2>The Rule</h2>
<p><strong>If I do something manually twice, I automate it the third time.</strong></p>
<p>Not &quot;when I have time.&quot; Not &quot;next sprint.&quot; The third time. Because the fourth time is coming, and the fifth, and the hundredth.</p>
<h2>My Automation Stack</h2>
<h3>Deploy Script (replaced 12 manual steps)</h3>
<p>\\</p>
]]></content:encoded>
      <link>https://www.sageideas.dev/blog/the-automation-mindset-if-you-do-it-twice-script-it</link>
      <guid isPermaLink="true">https://www.sageideas.dev/blog/the-automation-mindset-if-you-do-it-twice-script-it</guid>
      <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
      <category><![CDATA[Engineering]]></category>
      <author>sage@sageideas.dev (Jason Teixeira)</author>
    </item>
  </channel>
</rss>