<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Latest</title>
    <description>The most recent articles on DEV Community.</description>
    <link>https://dev.to/latest</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/latest"/>
    <language>en</language>
    <item>
      <title>Java 21 Quarkus AWS Lambda: My Production Serverless Stack</title>
      <dc:creator>Amrendra N Mishra</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:58:25 +0000</pubDate>
      <link>https://dev.to/amrendra_n_mishra/java-21-quarkus-aws-lambda-my-production-serverless-stack-1kpj</link>
      <guid>https://dev.to/amrendra_n_mishra/java-21-quarkus-aws-lambda-my-production-serverless-stack-1kpj</guid>
      <description>&lt;h2&gt;
  
  
  The Problem With Cloud AI
&lt;/h2&gt;

&lt;p&gt;Every token costs money. Every API call adds up. And your data goes to their servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Local Alternative
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;ollama
ollama pull llama3.2
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a GPT-4 level model running on your MacBook. Free. Private. Fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Code Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_local_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Works immediately, no API key needed
&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_local_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain Docker in one paragraph&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Available Models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2&lt;/td&gt;
&lt;td&gt;2GB&lt;/td&gt;
&lt;td&gt;General use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;codellama&lt;/td&gt;
&lt;td&gt;4GB&lt;/td&gt;
&lt;td&gt;Code tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mistral&lt;/td&gt;
&lt;td&gt;4.4GB&lt;/td&gt;
&lt;td&gt;Fast reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;phi3&lt;/td&gt;
&lt;td&gt;2.2GB&lt;/td&gt;
&lt;td&gt;Lightweight tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma2&lt;/td&gt;
&lt;td&gt;5.4GB&lt;/td&gt;
&lt;td&gt;Complex reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What You Can Build
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;RAG systems for your documents&lt;/li&gt;
&lt;li&gt;Voice assistants that work offline&lt;/li&gt;
&lt;li&gt;Code reviewers on every git commit&lt;/li&gt;
&lt;li&gt;Content generators at zero cost&lt;/li&gt;
&lt;li&gt;Personal AI that remembers you&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Setup
&lt;/h2&gt;

&lt;p&gt;I built 45 tools using this stack. All free. All local. All open source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/amrendramishra/ai-tools" rel="noopener noreferrer"&gt;github.com/amrendramishra/ai-tools&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;VP at JPMorgan Chase. Building AI tools at amrendranmishra.dev&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>aws</category>
      <category>serverless</category>
      <category>backend</category>
    </item>
    <item>
      <title>Backlink Monitoring and SEO Audits in Practice</title>
      <dc:creator>Victor Disouza</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:58:17 +0000</pubDate>
      <link>https://dev.to/victordisouza39/backlink-monitoring-and-seo-audits-in-practice-fm</link>
      <guid>https://dev.to/victordisouza39/backlink-monitoring-and-seo-audits-in-practice-fm</guid>
      <description>&lt;p&gt;Backlinks are still one of the strongest signals a search engine uses to judge a page — a link from another site is, in effect, a vote of confidence. But votes can be lost, redirected or turn toxic, so monitoring them is an ongoing job, not a one-off task. Here is how backlink monitoring and SEO audits work in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an SEO audit actually checks
&lt;/h2&gt;

&lt;p&gt;A practical SEO audit looks at three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Technical health&lt;/strong&gt; — broken links, redirect chains, missing meta descriptions, mobile usability, and indexation status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-page content&lt;/strong&gt; — title tags, heading structure, thin or duplicate content, and keyword coverage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backlink profile&lt;/strong&gt; — who links to you, the quality of those linking domains, anchor text distribution, and whether links you once had have quietly disappeared.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Data from Google Search Console and Bing Webmaster Tools feeds the audit — clicks, impressions and indexing issues straight from the source — while PageSpeed data adds real performance numbers so you can see whether slow pages are costing you rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backlink monitoring: the daily watch
&lt;/h2&gt;

&lt;p&gt;Monitoring is really about change detection. The events that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lost backlinks&lt;/strong&gt; — a linking page is removed or the link is dropped. If it carried traffic or authority, you want to know quickly so you can ask for it back or reclaim it with a redirect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New backlinks&lt;/strong&gt; — fresh links to verify. Are they genuine editorial links, or low-quality spam you should disavow?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor text drift&lt;/strong&gt; — too much exact-match anchor text looks unnatural and can attract penalties.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linking domain quality&lt;/strong&gt; — a sudden flood of low-quality links can signal a negative SEO attack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A daily or weekly report of gained and lost links turns this from guesswork into a routine you can act on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you do with the findings
&lt;/h2&gt;

&lt;p&gt;A good audit produces a prioritised list of missions: fix the 404s, compress the images dragging down PageSpeed, write outreach emails to reclaim lost links, create content targeting gaps competitors already cover. When daily missions are generated from audit data, the work becomes a checklist instead of an overwhelming spreadsheet.&lt;/p&gt;

&lt;p&gt;Outreach and content generation close the loop: you need linkable content before anyone will link to you, and you need systematic outreach to earn the links.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing this on a budget
&lt;/h2&gt;

&lt;p&gt;You don't need an enterprise subscription. Start free: connect Google Search Console, run an audit, fix the technical issues first (they're free to fix), then build a weekly habit of reviewing gained and lost links. Freemium tools bundle this work for solo founders and side projects — RankRoot's Starter plan, for example, is free, with paid tiers (Solo $19/mo, Pro $29/mo, Agency $49/mo) as you grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where tools fit
&lt;/h2&gt;

&lt;p&gt;Services like &lt;a href="https://rankroot.app" rel="noopener noreferrer"&gt;RankRoot&lt;/a&gt; — an AI link-building and SEO copilot — combine SEO audits, daily missions, outreach and content generation, backlink monitoring, and Google Search Console / Bing / PageSpeed integrations, with a Chrome extension and WordPress plugin so the data is available where you work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work on &lt;a href="https://rankroot.app" rel="noopener noreferrer"&gt;RankRoot&lt;/a&gt;, an AI SEO copilot for link-building: SEO audits, daily missions, outreach and content generation, backlink monitoring, and GSC / Bing / PageSpeed integrations. Chrome extension + WordPress plugin; free Starter plan.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>marketing</category>
    </item>
    <item>
      <title>How Daily Gold Karat Prices Are Tracked and Calculated</title>
      <dc:creator>Victor Disouza</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:57:30 +0000</pubDate>
      <link>https://dev.to/victordisouza39/how-daily-gold-karat-prices-are-tracked-and-calculated-2kl8</link>
      <guid>https://dev.to/victordisouza39/how-daily-gold-karat-prices-are-tracked-and-calculated-2kl8</guid>
      <description>&lt;p&gt;Gold is one of the few things most people buy priced by purity. Walk into a jewellery shop in Riyadh or Dubai and the board behind the counter lists prices for 24K, 22K, 21K and 18K gold — each updated daily, often shown in both English and Arabic. But where do those numbers actually come from? Here is how daily gold karat prices are tracked and calculated.&lt;/p&gt;

&lt;h2&gt;
  
  
  It starts with the spot price
&lt;/h2&gt;

&lt;p&gt;Every calculation begins with the international spot price of pure gold — the 24K benchmark quoted in US dollars per troy ounce. It is derived from continuous trading on global markets and moves around the clock, so the baseline never sits still.&lt;/p&gt;

&lt;h2&gt;
  
  
  Karat maths: from 24K down to 18K
&lt;/h2&gt;

&lt;p&gt;A karat is a purity ratio out of 24. 24K gold is 99.9% pure gold. Every lower karat is a simple fraction of that price:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;22K = 22/24 = 91.6% of the 24K price&lt;/li&gt;
&lt;li&gt;21K = 21/24 = 87.5% of the 24K price&lt;/li&gt;
&lt;li&gt;18K = 18/24 = 75% of the 24K price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if a gram of 24K gold costs X, a gram of 18K gold is worth roughly 0.75 × X before anything else is added. These fractions are fixed maths — only the spot price moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Converting to local currency
&lt;/h2&gt;

&lt;p&gt;The spot price is quoted in US dollars per troy ounce (31.1035 grams), so publishing a daily local price takes two conversions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ounce to gram&lt;/strong&gt;: divide by 31.1035.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USD to SAR or AED&lt;/strong&gt;: multiply by the prevailing exchange rate. Both the Saudi riyal and the UAE dirham are pegged to the US dollar, which keeps this step stable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why the daily number can move even when the dollar price of gold is flat — any shift in the exchange rate shows up in the local price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it updates daily
&lt;/h2&gt;

&lt;p&gt;Because gold trades continuously across global markets, the spot price changes overnight while Gulf markets are closed. Daily updates capture all of that movement, so the morning board in a souk reflects last night's trading in New York and Asia.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the board doesn't show
&lt;/h2&gt;

&lt;p&gt;The published karat price is the metal's value. A shop's selling price adds VAT, the shop's margin and making charges — so two shops can quote slightly different retail numbers from the same base price. Knowing the base price first puts you in a much stronger position to negotiate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking the daily number
&lt;/h2&gt;

&lt;p&gt;Services like &lt;a href="https://karatindex.com" rel="noopener noreferrer"&gt;KaratIndex&lt;/a&gt; publish these daily karat prices — 24K, 22K, 21K and 18K — for Saudi Arabia and the UAE, in English and Arabic, so you can compare the day's base price before you shop.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work on &lt;a href="https://karatindex.com" rel="noopener noreferrer"&gt;KaratIndex&lt;/a&gt;, a daily gold-price reference for Saudi Arabia and the UAE with karat prices in English and Arabic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>data</category>
      <category>fintech</category>
    </item>
    <item>
      <title>The test that passed on Windows and failed on Linux</title>
      <dc:creator>pm25coder</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:56:58 +0000</pubDate>
      <link>https://dev.to/pm25coder/the-test-that-passed-on-windows-and-failed-on-linux-37ge</link>
      <guid>https://dev.to/pm25coder/the-test-that-passed-on-windows-and-failed-on-linux-37ge</guid>
      <description>&lt;p&gt;My CI went red on a pull request that was, as far as I could tell, correct.&lt;/p&gt;

&lt;p&gt;The change was small and boring: an OAuth helper in a CLI tool used to discover a free port by binding it, reading the number, and closing the socket — which leaves a window in which any other process can take the port before the callback server binds it. The fix binds once and hands the already-bound socket to the HTTP server, so there is no window. I measured it on my machine: with the old helper another process could take the port; with the new one it could not. I added a test, ran it, and pushed.&lt;/p&gt;

&lt;p&gt;Then CI came back: &lt;strong&gt;Test 3.12, 3.13, Canary — all failed&lt;/strong&gt;, on the &lt;strong&gt;Linux&lt;/strong&gt; legs, while the identical suite was green on &lt;strong&gt;Windows&lt;/strong&gt; on the same commit. The one failing test was the one I had just written:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSError: [Errno 98] Address already in use
809 passed, 1 failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix was fine. The test I shipped with the fix was not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test that broke
&lt;/h2&gt;

&lt;p&gt;The test asked a simple question: after the OAuth flow finishes, is the redirect port released? And it answered it in the most obvious way — by trying to bind the port again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_port_is_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;OSError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a fresh listener can bind, the port is free. That is the intuitive phrasing. It is also the wrong instrument, and the reason is entirely about &lt;strong&gt;which states of a TCP connection&lt;/strong&gt; a rebind is willing to forgive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt one: blaming TIME_WAIT
&lt;/h2&gt;

&lt;p&gt;My first hypothesis was the classic one: the server has closed, but the connection sits in &lt;code&gt;TIME_WAIT&lt;/code&gt;, and &lt;code&gt;TIME_WAIT&lt;/code&gt; blocks a rebind. The standard fix for that is &lt;code&gt;SO_REUSEADDR&lt;/code&gt;, so I set it on the probe socket and pushed again.&lt;/p&gt;

&lt;p&gt;CI went red again — with a new signal that killed the hypothesis. The probe now returned &lt;code&gt;False&lt;/code&gt; &lt;strong&gt;even with &lt;code&gt;SO_REUSEADDR&lt;/code&gt; set&lt;/strong&gt;. If &lt;code&gt;TIME_WAIT&lt;/code&gt; were the cause, &lt;code&gt;SO_REUSEADDR&lt;/code&gt; is exactly what would have forgiven it. It didn't, so the port was not merely in &lt;code&gt;TIME_WAIT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The tell was sitting right next to it. There were two tests: one where the flow completes (the failing one) and one where it does not. &lt;strong&gt;The sibling, which also rebinds the port, passed.&lt;/strong&gt; The only difference between them was that in the failing test a client had actually connected and received a response. That points at a &lt;strong&gt;lingering accepted connection&lt;/strong&gt; — a socket in &lt;code&gt;FIN_WAIT_2&lt;/code&gt; or &lt;code&gt;ESTABLISHED&lt;/code&gt; — and &lt;code&gt;SO_REUSEADDR&lt;/code&gt; deliberately does not forgive &lt;em&gt;those&lt;/em&gt;. It forgives &lt;code&gt;TIME_WAIT&lt;/code&gt; because a timed-out connection is genuinely gone from the application's point of view; it does not forgive a live connection because that would let two listeners fight over the same 4-tuple.&lt;/p&gt;

&lt;p&gt;So the failure had two independent halves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the probe used an instrument (&lt;code&gt;bind&lt;/code&gt;) that is sensitive to connection state I did not control;&lt;/li&gt;
&lt;li&gt;the test's fake client never closed its response, so a connection really was left hanging — a genuine leak in the test itself, the same kind of leak the production fix was about.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Attempt two: change the question, not the port
&lt;/h2&gt;

&lt;p&gt;The fix was to stop asking "can something bind here" and start asking &lt;strong&gt;"is anything still listening here"&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_nothing_is_listening&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;          &lt;span class="c1"&gt;# something answered
&lt;/span&gt;        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ConnectionRefusedError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;OSError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;           &lt;span class="c1"&gt;# nothing there
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;connect()&lt;/code&gt; that is &lt;em&gt;refused&lt;/em&gt; tells you there is no listener — and it does not care what state some old connection is in, because it never touches that connection's 4-tuple. That is the property I actually wanted to assert: "the server is gone", not "the kernel will let me rebind". I also closed the response in the fake client, removing the leak underneath.&lt;/p&gt;

&lt;p&gt;CI returned 5/5 green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proving the probe isn't vacuous
&lt;/h2&gt;

&lt;p&gt;A negative assertion has a failure mode that a positive one does not: it can be &lt;strong&gt;vacuously true&lt;/strong&gt;. A probe that always says "nothing is listening" would pass the test perfectly and tell you nothing. So I added a control arm that runs the same probe against three states:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;state&lt;/th&gt;
&lt;th&gt;&lt;code&gt;_nothing_is_listening&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a listener is up&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;listener just closed, cleanly&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a connection lingers, no listener&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first row is the one that matters: the probe &lt;em&gt;can&lt;/em&gt; return &lt;code&gt;False&lt;/code&gt;, so the &lt;code&gt;True&lt;/code&gt; in the test means something. Without that row, "nothing is listening" is an unfalsifiable claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  What generalises
&lt;/h2&gt;

&lt;p&gt;Three things, and none of them are about OAuth or Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fix's own test is part of the fix.&lt;/strong&gt; The pull request was not "the socket handoff"; it was "the socket handoff &lt;em&gt;and a test that verifies it on every platform the suite runs on&lt;/em&gt;". A green local run on one OS is a sample, not a verdict — and when a CI leg fails where you did not look, the bug is often in the &lt;strong&gt;instrument&lt;/strong&gt;, not the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a negative assertion, choose an instrument that is insensitive to the state you do not control.&lt;/strong&gt; "The port is released" is a claim about the &lt;em&gt;server&lt;/em&gt; being gone. &lt;code&gt;bind&lt;/code&gt;-succeeds smuggles in an assumption about kernel connection bookkeeping; &lt;code&gt;connect&lt;/code&gt;-refused does not. Pick the phrasing that says only what you mean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give every negative probe a control arm.&lt;/strong&gt; A probe that cannot fail is not evidence. One extra case — the state in which it must return the other answer — is what turns "the test passed" into "the property held".&lt;/p&gt;

&lt;p&gt;The second attempt was smaller than the first and took less time to write. The expensive part was not the fix; it was noticing that the instrument, not the code, was the thing that needed changing.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>linux</category>
      <category>python</category>
    </item>
    <item>
      <title>How Voice AI Is Making the Internet More Accessible</title>
      <dc:creator>VoiceDeveloper</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:56:34 +0000</pubDate>
      <link>https://dev.to/voice_developer/how-voice-ai-is-making-the-internet-more-accessible-1kli</link>
      <guid>https://dev.to/voice_developer/how-voice-ai-is-making-the-internet-more-accessible-1kli</guid>
      <description>&lt;h2&gt;
  
  
  Why Voice AI Matters for Accessibility
&lt;/h2&gt;

&lt;p&gt;The web was built to be a universal information highway, but for many people—those with visual impairments, dyslexia, or motor challenges—reading text on a screen isn’t always feasible. Voice AI bridges that gap by turning written content into natural‑sounding speech and, increasingly, by letting users &lt;em&gt;speak&lt;/em&gt; to applications instead of typing.  &lt;/p&gt;

&lt;p&gt;From screen readers that read articles aloud to voice‑driven assistants that let you browse hands‑free, developers now have a toolbox that makes the internet genuinely inclusive. In this post we’ll explore the core pieces of voice AI, see how text‑to‑speech (TTS) and voice cloning are reshaping accessibility, and walk through a quick Python example using &lt;strong&gt;ElevenLabs&lt;/strong&gt;—a modern TTS platform that delivers high‑fidelity, customizable voices.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Building Blocks of Voice AI
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Why It Helps Accessibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Text‑to‑Speech (TTS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Converts written text into spoken audio.&lt;/td&gt;
&lt;td&gt;Gives sight‑impaired users instant auditory access to content.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatic Speech Recognition (ASR)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turns spoken words into text.&lt;/td&gt;
&lt;td&gt;Enables hands‑free navigation and input for users with motor limitations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Voice Cloning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Replicates a specific speaker’s timbre from a short audio sample.&lt;/td&gt;
&lt;td&gt;Allows personalized audio experiences, such as reading in a familiar voice for people with cognitive challenges.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Voice Activity Detection (VAD)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detects when a person is speaking vs. silent.&lt;/td&gt;
&lt;td&gt;Improves the responsiveness of voice‑controlled interfaces, reducing false triggers.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you combine these pieces, you can build applications that &lt;strong&gt;listen&lt;/strong&gt;, &lt;strong&gt;understand&lt;/strong&gt;, &lt;strong&gt;respond&lt;/strong&gt;, and &lt;strong&gt;speak&lt;/strong&gt;—all in real time. The result is a more inclusive web experience where the barrier between a user and the content is a single voice command away.&lt;/p&gt;

&lt;h2&gt;
  
  
  ElevenLabs: A Developer‑Friendly TTS Engine
&lt;/h2&gt;

&lt;p&gt;If you’ve tried older TTS services, you know the trade‑off between voice quality and flexibility. &lt;strong&gt;ElevenLabs&lt;/strong&gt; (&lt;a href="https://try.elevenlabs.io/kr07zfuqn1bp" rel="noopener noreferrer"&gt;https://try.elevenlabs.io/kr07zfuqn1bp&lt;/a&gt;) offers a cloud API that produces ultra‑realistic speech while giving you granular control over tone, speed, and even speaker style.  &lt;/p&gt;

&lt;p&gt;Key reasons developers love it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neural‑level quality&lt;/strong&gt; – The generated speech sounds like a human narrator, not a robot.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice cloning&lt;/strong&gt; – Upload a 30‑second sample and get a custom voice you can reuse across projects.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple REST API&lt;/strong&gt; – Works with any language that can make HTTP calls, plus official Python and JavaScript SDKs.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below we’ll see how to integrate ElevenLabs into a tiny Flask app that reads any article aloud with a single endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start: Turning Text into Speech with Python
&lt;/h2&gt;

&lt;p&gt;First, sign up for an API key at the ElevenLabs affiliate link: &lt;a href="https://try.elevenlabs.io/kr07zfuqn1bp" rel="noopener noreferrer"&gt;https://try.elevenlabs.io/kr07zfuqn1bp&lt;/a&gt;. Keep the key safe; you’ll need it for every request.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install the SDK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;elevenlabs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Basic TTS Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;elevenlabs&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;set_api_key&lt;/span&gt;

&lt;span class="c1"&gt;# Set your API key (never hard‑code in production!)
&lt;/span&gt;&lt;span class="nf"&gt;set_api_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ELEVENLABS_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;text_to_speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;voice_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXAVITQu4vr4xnSDxMaL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Sends `text` to ElevenLabs and returns the audio bytes.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;voice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;voice_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# Use a default voice or a cloned voice ID
&lt;/span&gt;        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eleven_monolingual_v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;audio&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome to the future of web accessibility. With voice AI, everyone can consume content effortlessly.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;audio_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;text_to_speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Plays back locally; you could stream to a client instead
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;voice_id&lt;/code&gt; can be any of the pre‑built voices listed in the ElevenLabs docs, or the ID of a cloned voice you created earlier.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model&lt;/code&gt; selects the neural model; the default &lt;code&gt;eleven_monolingual_v1&lt;/code&gt; works great for English.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Adding a Flask Endpoint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_file&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BytesIO&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/speak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;voice_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;voice_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXAVITQu4vr4xnSDxMaL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;

    &lt;span class="n"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;text_to_speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;voice_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;audio_io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;send_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;audio_io&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;mimetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio/mpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;as_attachment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;download_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;speech.mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now any client—browser, mobile app, or assistive device—can POST JSON like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your article content goes here."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"voice_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EXAVITQu4vr4xnSDxMaL"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and receive an MP3 stream that can be played back instantly. This pattern is the backbone of many accessibility tools: fetch the article, send it to &lt;code&gt;/speak&lt;/code&gt;, and let the user listen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice Cloning in Action
&lt;/h2&gt;

&lt;p&gt;Imagine a user with a cognitive disability who benefits from hearing information in a familiar voice—perhaps a family member’s. With ElevenLabs, you can create a &lt;strong&gt;personalized voice&lt;/strong&gt; in under a minute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Record a 30‑second sample of the target speaker (clear, noise‑free).
&lt;/li&gt;
&lt;li&gt;Upload it via the ElevenLabs dashboard or the &lt;code&gt;/v1/voices/add&lt;/code&gt; endpoint.
&lt;/li&gt;
&lt;li&gt;Receive a &lt;code&gt;voice_id&lt;/code&gt; you can plug into the &lt;code&gt;text_to_speech&lt;/code&gt; function above.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;elevenlabs&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;clone_voice&lt;/span&gt;

&lt;span class="n"&gt;voice_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clone_voice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Grandma&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;audio_file_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grandma_sample.wav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New voice ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;voice_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now any article read aloud will sound like Grandma, making the experience more comforting and easier to understand. This level of personalization is what sets modern voice AI apart from the generic, monotone TTS of the past.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Building Accessible Voice Experiences
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provide a fallback&lt;/strong&gt; – Not every user wants audio. Keep a visual version of the content alongside the voice option.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow user control&lt;/strong&gt; – Let users pause, skip, adjust speed, and change voice. A simple UI with a speed slider and a voice selector covers most needs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect privacy&lt;/strong&gt; – When using ASR or voice cloning, store audio only as long as necessary and be transparent about data handling.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with real assistive tech&lt;/strong&gt; – Run your app through screen readers (NVDA, VoiceOver) and voice assistants (Google Assistant, Siri) to catch edge cases.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By following these guidelines, you ensure that your voice‑enabled features truly enhance accessibility rather than becoming another hidden layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead: Multimodal Accessibility
&lt;/h2&gt;

&lt;p&gt;Voice AI is just the first step. Combine it with &lt;strong&gt;image captioning&lt;/strong&gt;, &lt;strong&gt;real‑time translation&lt;/strong&gt;, and &lt;strong&gt;gesture recognition&lt;/strong&gt;, and you’ll have a web that adapts to any user’s preferred modality. The APIs are getting better, and platforms like ElevenLabs are pushing the envelope on naturalness, making it easier than ever to embed high‑quality speech into everyday apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Give Your Users a Voice?
&lt;/h2&gt;

&lt;p&gt;If you’re looking for a plug‑and‑play solution that delivers studio‑grade audio, supports voice cloning, and comes with clear documentation, give &lt;strong&gt;ElevenLabs&lt;/strong&gt; a spin today: &lt;a href="https://try.elevenlabs.io/kr07zfuqn1bp" rel="noopener noreferrer"&gt;https://try.elevenlabs.io/kr07zfuqn1bp&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Add the endpoint to your existing services, let your users pick a voice they love, and watch your app become a lot more inclusive. Happy coding!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🛑 Stop Writing Code Like It's 2025: How I Built an Autonomous Agent Pipeline That Actually Works</title>
      <dc:creator>ℋℐ𝒵ℬ𝒜 (✿◠‿◠)⭐</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:56:03 +0000</pubDate>
      <link>https://dev.to/hizba_cloud/stop-writing-code-like-its-2025-how-i-built-an-autonomous-agent-pipeline-that-actually-works-2hhn</link>
      <guid>https://dev.to/hizba_cloud/stop-writing-code-like-its-2025-how-i-built-an-autonomous-agent-pipeline-that-actually-works-2hhn</guid>
      <description>&lt;p&gt;"The biggest innovation in software engineering isn't new JavaScript framework - it's the shift from syntactic development to orchestrating intent".&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ The Cognitive Shift
&lt;/h2&gt;

&lt;p&gt;Recall the days when we spent 3 hours debugging CORS issues or writing custom router middleware for a particular use case? Adorable.&lt;/p&gt;

&lt;p&gt;In this era of development, if you're still thinking about artificial intelligence as a copilot for syntax completion you're wasting 10x your time. We have entered the age of agentic delegation - systems that don't merely answer questions but perform work.&lt;/p&gt;

&lt;p&gt;Today, we'll be exploring how to build production grade multistep automation pipelines using n8n, Google AI Studio, and API routing patterns that abstract away the heavy lifting.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ The Development Stack
&lt;/h2&gt;

&lt;p&gt;Orchestration: &lt;code&gt;n8n&lt;/code&gt; / &lt;code&gt;Make.com&lt;/code&gt; for bulletproof webhook workflows&lt;br&gt;
Intelligence Layer: &lt;code&gt;Google AI Studio&lt;/code&gt; (Gemini API) for context parsing&lt;br&gt;
Interface: React + Tailwind CSS implementation with dark mode&lt;br&gt;
Protocol: Event driven architecture + JSON payload standard&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Implementing The Architecture
&lt;/h2&gt;

&lt;p&gt;Rather than writing monolithic backend services that collapse at the first sign of production traffic, we'll be designing our system in modular nodes:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
// Example implementation of core agent event dispatcher
async function dispatchAgentEvent(userInput, contextToken) {
const endpoint = "[https://api.hooklabs.ai/v1/orchestrate](https://api.hooklabs.ai/v1/orchestrate)";

const payload = {
sender: "client_node",
intent: userInput,
security_tier: "bounded_autonomy",
timestamp: Date.now()
};

let response = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});

return await response.json();
}






&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>automation</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Heirloom: Grandpa's Voice-to-Recipe Kitchen Companion https://ai.studio/apps/04d39775-f526-4776-8963-abcd37504ff6</title>
      <dc:creator>Shaik Mohseen</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:52:48 +0000</pubDate>
      <link>https://dev.to/shaik_mohseen_d463b0d4a36/heirloom-grandpas-voice-to-recipe-kitchen-companion-57d2</link>
      <guid>https://dev.to/shaik_mohseen_d463b0d4a36/heirloom-grandpas-voice-to-recipe-kitchen-companion-57d2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>opus 5.5 video guide: Debug Destinations, Cues, and Narration in Tidy’s Dark Tech Launch Film</title>
      <dc:creator>朱峰</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:52:11 +0000</pubDate>
      <link>https://dev.to/vulcanfeynman/opus-55-video-guide-debug-destinations-cues-and-narration-in-tidys-dark-tech-launch-film-5663</link>
      <guid>https://dev.to/vulcanfeynman/opus-55-video-guide-debug-destinations-cues-and-narration-in-tidys-dark-tech-launch-film-5663</guid>
      <description>&lt;p&gt;Start here: &lt;a href="https://h3max.io/opus-5-5-video-generator" rel="noopener noreferrer"&gt;prepare a Tidy debugging brief through H3Max&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://github.com/lemomo-ai/lemo-opuscar/releases/download/web/dark-keynote.mp4" rel="noopener noreferrer"&gt;the author artifact for tracing Tidy’s sorting behavior&lt;/a&gt;, or &lt;a href="https://ei7ymlbpau.feishu.cn/file/Xdfab2qF3oUIcBxwN4icekqTnHh" rel="noopener noreferrer"&gt;the matching Feishu archive for inspecting the reference&lt;/a&gt;. &lt;strong&gt;Tidy is fictional&lt;/strong&gt;: this is a code-animated launch film, not desktop footage, SaaS verification, or evidence of H3Max performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lemomo-ai/lemo-opuscar" rel="noopener noreferrer"&gt;The upstream project’s account of its author and model&lt;/a&gt; credits Claude Opus 5.5. Those sessions have not been independently verified. These commands are reader instructions, not our run log; the entry page does not establish local-terminal access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm88mql7fn3iml3bypx90.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm88mql7fn3iml3bypx90.jpg" alt="Original LemoLab author-film frame; fictional Tidy" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;LemoLab author-film frame at approximately 5.04 seconds, also the cover.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Diagnose the destination before changing the easing
&lt;/h2&gt;

&lt;p&gt;Preserve the reference unchanged. Watch the story, then inspect cursor movement, reading holds, and sound. Compare &lt;a href="https://github.com/lemomo-ai/lemo-opuscar/blob/main/styles/dark-keynote/STYLE.md" rel="noopener noreferrer"&gt;the intended layout and dark-stage hierarchy&lt;/a&gt; with &lt;a href="https://github.com/lemomo-ai/lemo-opuscar/blob/main/styles/dark-keynote/DEMO.md" rel="noopener noreferrer"&gt;the documented relationship between elements and sorting cues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The generator contains &lt;strong&gt;264 mixed-category elements&lt;/strong&gt;, not 264 application windows. Fictional product figures are not measured benchmarks.&lt;/p&gt;

&lt;p&gt;Separate wrong destinations, mistimed cues, and obscured narration. Record the timestamp and source before editing. These are diagnostic categories, not reported failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Preserve an identifiable environment
&lt;/h2&gt;

&lt;p&gt;Prepare Git, Node 20+, FFmpeg/ffprobe, and Python 3.11–3.13 or uv. Use a new directory, without overwriting existing work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/lemomo-ai/lemo-opuscar.git tidy-case
&lt;span class="nb"&gt;cd &lt;/span&gt;tidy-case
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LEMO_OPUSCAR_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
sh plugin/skills/lemo-opuscar/scripts/setup.sh deps voice
sh tools/fetch.sh instruments vcsl
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; evidence
&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;styles/dark-keynote/demo
git rev-parse HEAD &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; evidence/tidy-commit.txt
npm &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; evidence/tidy-dependencies.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep locks/Python versions; check fonts, source, Kokoro/transcription and VCSL samples. Separate reference and output. Setup is not acceptance.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Give the agent a testable reproduction brief
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;New prompt—not the author’s original instructions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reproduce and debug LemoLab's Room to Think from existing dark-keynote source.
Read commit, locks, STYLE.md, DEMO.md, demo/CREDITS, core/README.md, build.sh,
reference and assets. Report missing dependencies; otherwise follow the
documented build without extra approval gates.

Preserve fictional Tidy, dark staging, original mixed-category elements,
cursor-led sorting, shared sound cues and credits. The 264 items are not
264 windows. No real screenshots, fabricated benchmarks, desktop-success
claims or external media-generation APIs.

Inspect timeline.js, world.js, film.js, engine, voice lines, score and mix.
Verify 42 seconds/24 fps from source; record release differences without
silent retiming. Use absolute render(t), fixed seeds, stable identities
and destinations, and shared note/event tables. No wall-clock state.

Test forward, reverse and arbitrary seeks. Save repeated-time comparisons
separately so a later capture cannot overwrite the earlier evidence.
Check destinations, cue alignment, click, flights, landing, captions,
reading holds, narration, intentional silence and complete ending.
Save actual model/provider/effort/session records, prompts, dependencies,
diffs and genuine checks. Do not infer success from the author film,
publish, or identify the reproduction as an H3Max original.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft4hbhnich56zo000xcls.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft4hbhnich56zo000xcls.jpg" alt="Original LemoLab author-film frame; fictional Tidy" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Original-release frame at approximately 20.16 seconds; not a local debugging capture.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Build, isolate, and repeat the same check
&lt;/h2&gt;

&lt;p&gt;Run &lt;a href="https://github.com/lemomo-ai/lemo-opuscar/blob/main/styles/dark-keynote/demo/build.sh" rel="noopener noreferrer"&gt;the checked-in implementation of Tidy’s full build&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh styles/dark-keynote/demo/build.sh
node core/render/still.mjs &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$D&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 0 14.9 16.45 26 41.9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--out&lt;/span&gt; evidence/tidy-stills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script builds narration, score, events, checks, mix, subtitles, and a 24 fps/two-worker render, then muxes. Still arguments are seconds; inspect press/landing neighbors. Do not mix renderer flags.&lt;/p&gt;

&lt;p&gt;Revisit a time after seeking elsewhere. Changed destinations suggest playback-history dependence; inspect shared state, not camera tricks. Restore missing fonts before adjusting coordinates.&lt;/p&gt;

&lt;p&gt;Read the final ASR spot-check and listen: its failure need not stop the script. Resolve Chromium or missing voice/sample dependencies explicitly; never silently remove audio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repair only the observed destination, cue, caption or narration defect.
Preserve the fictional case and source timing. Show the responsible data
and code diff, repeat the original seek/frame/audio checks, and replay the
whole action. Do not conceal jumps with cuts or report untested fixes as passed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Validate the complete artifact
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;styles/dark-keynote/dark-keynote.mp4
ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="nt"&gt;-count_frames&lt;/span&gt; &lt;span class="nt"&gt;-show_streams&lt;/span&gt; &lt;span class="nt"&gt;-show_format&lt;/span&gt; &lt;span class="nt"&gt;-of&lt;/span&gt; json &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; null -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unchanged 42-second/24 fps settings imply &lt;strong&gt;1,008 picture frames&lt;/strong&gt;. Check dimensions, rate, audio, and ending; watch and listen throughout. Decoding does not certify cue alignment, and web/local encodes need not be byte-identical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F633h7fn12jt3rzr4l0tk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F633h7fn12jt3rzr4l0tk.jpg" alt="Original LemoLab author-film frame; fictional Tidy" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;LemoLab reference frame at approximately 34.02 seconds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Archive source, inputs, versions, prompts, session records, edits, checks, and MP4. Retain &lt;a href="https://github.com/lemomo-ai/lemo-opuscar/blob/main/styles/dark-keynote/demo/CREDITS" rel="noopener noreferrer"&gt;the credited origins of Tidy’s lettering, samples, and voices&lt;/a&gt;: MIT code, OFL fonts, CC0-credited VCSL samples, and separate voice licenses.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>DUNS Number for Google Play: What It Is and How to Get One</title>
      <dc:creator>vmzavas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:50:08 +0000</pubDate>
      <link>https://dev.to/vmzavas/duns-number-for-google-play-what-it-is-and-how-to-get-one-57l7</link>
      <guid>https://dev.to/vmzavas/duns-number-for-google-play-what-it-is-and-how-to-get-one-57l7</guid>
      <description>&lt;p&gt;Here's the tradeoff in one line: a DUNS number costs you paperwork and waiting time up front, and in return an organization account skips the 12 testers for 14 days that personal accounts have to get through. Whether that's a good deal depends on one question. Do you already have a registered business?&lt;/p&gt;

&lt;p&gt;If you do, getting a DUNS number is mostly a form and some patience. If you don't, you'd be setting up a company just to avoid a two-week test, and that's rarely worth it for one app.&lt;/p&gt;

&lt;p&gt;What a DUNS number actually is&lt;br&gt;
DUNS stands for Data Universal Numbering System. It's a nine-digit number that Dun &amp;amp; Bradstreet assigns to a business so it can be identified in their database. It isn't a tax number and it isn't a business license. It's closer to a public ID card for a company, used by governments, large suppliers and platforms like Google and Apple to check that a business is real.&lt;/p&gt;

&lt;p&gt;Google Play uses it during developer account verification. When you create an account as an organization, Google asks for your DUNS number and checks your organization's name and address against what Dun &amp;amp; Bradstreet has on file.&lt;/p&gt;

&lt;p&gt;Why it matters for closed testing&lt;br&gt;
The 12-tester requirement applies to personal developer accounts created on or after November 13, 2023. Organization accounts are currently exempt. That's the whole reason this topic keeps coming up.&lt;/p&gt;

&lt;p&gt;When I wrote about PeerPlay on Indie Hackers, one of the most useful replies pointed out exactly this: an organization account with a DUNS number skips the 12-tester rule altogether. It's true, and for some developers it's the better route. It's just not free of friction, and Google's rules for both account types can change, so check Play Console Help before you commit.&lt;/p&gt;

&lt;p&gt;Who can get one&lt;br&gt;
You need a legal business entity. Depending on your country that might be a limited company, an LLC, or in many places a registered sole trader. What you can't do is register a hobby project with no legal form behind it.&lt;/p&gt;

&lt;p&gt;Before you request anything, search for your company first. Dun &amp;amp; Bradstreet may already have created a record for your business from public registers, in which case you only need to look up the existing number and make sure the details are current.&lt;/p&gt;

&lt;p&gt;How to request it&lt;br&gt;
Dun &amp;amp; Bradstreet offers a free DUNS request. Google Play's own help pages link to the lookup and request flow, and that's the safest place to start, because it routes you to the right form for your country instead of a paid service with a similar name.&lt;/p&gt;

&lt;p&gt;Fill in the legal name exactly as it appears in your business registration, plus the registered address, phone number and a contact person. Small differences cause problems later. If D&amp;amp;B has "Example Apps d.o.o." and you type "Example Apps" in Play Console, verification can stall.&lt;/p&gt;

&lt;p&gt;Then wait. The free route can take weeks; Dun &amp;amp; Bradstreet's own guidance has mentioned up to 30 business days, and in some countries it's faster. They also sell expedited options. I'd only pay for those if a launch date truly depends on it, since closed testing on a personal account takes about two weeks anyway.&lt;/p&gt;

&lt;p&gt;After you have the number&lt;br&gt;
Use it when creating the organization developer account, or when your existing organization account asks you to verify. Google may ask for additional documents, and it also verifies a contact email and phone number. Keep the business details identical everywhere: D&amp;amp;B, Play Console and your public developer profile.&lt;/p&gt;

&lt;p&gt;One practical note: an organization account shows your organization's details to users on Google Play. If your business is registered at your home address, think about whether you're comfortable with that before you go down this path.&lt;/p&gt;

&lt;p&gt;So which route should you take?&lt;br&gt;
If you already run a registered business, get the DUNS number and open an organization account. You'll skip the tester requirement and look more established on the store.&lt;/p&gt;

&lt;p&gt;If you're a solo developer with one app and no company, I'd stay with a personal account and run the closed test. Two weeks of testing with real people is less work than forming a company, and you'll come out of it with actual feedback. That's the situation PeerPlay was built for: developers swap testing in tracked 14-day rounds, so you're not stuck trying to find 12 people on your own.&lt;/p&gt;

</description>
      <category>android</category>
      <category>howto</category>
      <category>mobile</category>
      <category>startup</category>
    </item>
    <item>
      <title>AI Wasn't the Beginning. We Had Already Started Outsourcing Parts of Ourselves to Smartphones</title>
      <dc:creator>nocklock</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:49:53 +0000</pubDate>
      <link>https://dev.to/nocklock/ai-wasnt-the-beginning-we-had-already-started-outsourcing-parts-of-ourselves-to-smartphones-3fnc</link>
      <guid>https://dev.to/nocklock/ai-wasnt-the-beginning-we-had-already-started-outsourcing-parts-of-ourselves-to-smartphones-3fnc</guid>
      <description>&lt;p&gt;People worry that we're becoming too dependent on AI.&lt;/p&gt;

&lt;p&gt;It writes for us.&lt;/p&gt;

&lt;p&gt;Searches for us.&lt;/p&gt;

&lt;p&gt;Helps us code.&lt;/p&gt;

&lt;p&gt;And increasingly, we ask it what we should do next.&lt;/p&gt;

&lt;p&gt;I understand the concern.&lt;/p&gt;

&lt;p&gt;I think about it too.&lt;/p&gt;

&lt;p&gt;But recently I started wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did this really begin with AI?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The more I thought about it, the less it seemed that way.&lt;/p&gt;

&lt;p&gt;We've been outsourcing small parts of ourselves to technology for a long time.&lt;/p&gt;

&lt;p&gt;AI is just making it much easier to notice.&lt;/p&gt;




&lt;h2&gt;
  
  
  I used to memorize phone numbers
&lt;/h2&gt;

&lt;p&gt;When I was younger, I knew several phone numbers by memory.&lt;/p&gt;

&lt;p&gt;Family.&lt;/p&gt;

&lt;p&gt;Friends.&lt;/p&gt;

&lt;p&gt;Sometimes even friends' home numbers.&lt;/p&gt;

&lt;p&gt;You needed to know the number if you wanted to call someone.&lt;/p&gt;

&lt;p&gt;I barely do that anymore.&lt;/p&gt;

&lt;p&gt;I search for a name and tap it.&lt;/p&gt;

&lt;p&gt;The phone remembers for me.&lt;/p&gt;

&lt;p&gt;And honestly, this doesn't feel like a loss most of the time.&lt;/p&gt;

&lt;p&gt;It's convenient.&lt;/p&gt;

&lt;p&gt;There is very little reason for me to store dozens of phone numbers in my head when a device can do it better.&lt;/p&gt;

&lt;p&gt;So I stopped.&lt;/p&gt;

&lt;p&gt;Not because someone forced me to.&lt;/p&gt;

&lt;p&gt;Because the technology made remembering unnecessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  I stopped memorizing routes too
&lt;/h2&gt;

&lt;p&gt;Something similar happened with navigation.&lt;/p&gt;

&lt;p&gt;If I visited the same place often enough, I used to remember the route.&lt;/p&gt;

&lt;p&gt;Which station.&lt;/p&gt;

&lt;p&gt;Which street.&lt;/p&gt;

&lt;p&gt;Which building meant I needed to turn.&lt;/p&gt;

&lt;p&gt;Today, I can visit somewhere completely unfamiliar without thinking much about it.&lt;/p&gt;

&lt;p&gt;I open a map.&lt;/p&gt;

&lt;p&gt;If I take the wrong turn, it recalculates.&lt;/p&gt;

&lt;p&gt;If traffic changes, it finds another route.&lt;/p&gt;

&lt;p&gt;Again, this is better in almost every practical way.&lt;/p&gt;

&lt;p&gt;I don't want to go back.&lt;/p&gt;

&lt;p&gt;But there is a difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I know how to get there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My phone knows how to get there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I notice that difference whenever my battery gets low in an unfamiliar place.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discovery changed too
&lt;/h2&gt;

&lt;p&gt;Restaurants are another example.&lt;/p&gt;

&lt;p&gt;There was a time when finding a place meant remembering somewhere you'd visited, hearing about it from someone, or just walking past it.&lt;/p&gt;

&lt;p&gt;Now I usually search first.&lt;/p&gt;

&lt;p&gt;Ratings.&lt;/p&gt;

&lt;p&gt;Reviews.&lt;/p&gt;

&lt;p&gt;Photos.&lt;/p&gt;

&lt;p&gt;Maps.&lt;/p&gt;

&lt;p&gt;Social media.&lt;/p&gt;

&lt;p&gt;Recommendation algorithms.&lt;/p&gt;

&lt;p&gt;The chance of making a bad choice goes down.&lt;/p&gt;

&lt;p&gt;But something else goes down too:&lt;/p&gt;

&lt;p&gt;the number of times I discover something without already knowing that other people liked it.&lt;/p&gt;

&lt;p&gt;Technology didn't remove choice.&lt;/p&gt;

&lt;p&gt;It changed how I arrive at the choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then AI arrived
&lt;/h2&gt;

&lt;p&gt;Contacts remember phone numbers.&lt;/p&gt;

&lt;p&gt;GPS remembers routes.&lt;/p&gt;

&lt;p&gt;Search engines retrieve information.&lt;/p&gt;

&lt;p&gt;Recommendation systems decide what might be worth our attention.&lt;/p&gt;

&lt;p&gt;Now generative AI is moving into a slightly different layer.&lt;/p&gt;

&lt;p&gt;It doesn't just remember or retrieve.&lt;/p&gt;

&lt;p&gt;It participates in the process of thinking.&lt;/p&gt;

&lt;p&gt;How should I structure this?&lt;/p&gt;

&lt;p&gt;What am I missing?&lt;/p&gt;

&lt;p&gt;How could I implement this?&lt;/p&gt;

&lt;p&gt;What are the alternatives?&lt;/p&gt;

&lt;p&gt;That might be why AI feels different.&lt;/p&gt;

&lt;p&gt;Previous tools outsourced pieces of memory and navigation.&lt;/p&gt;

&lt;p&gt;AI can outsource pieces of reasoning.&lt;/p&gt;




&lt;h2&gt;
  
  
  I'm not arguing that we should stop using it
&lt;/h2&gt;

&lt;p&gt;I use AI constantly.&lt;/p&gt;

&lt;p&gt;I use it while developing.&lt;/p&gt;

&lt;p&gt;I use it to explore ideas.&lt;/p&gt;

&lt;p&gt;I use it to find gaps in my own thinking.&lt;/p&gt;

&lt;p&gt;I use it when writing.&lt;/p&gt;

&lt;p&gt;I'm not interested in pretending that avoiding useful tools somehow makes the work more authentic.&lt;/p&gt;

&lt;p&gt;I don't carry a paper map just to prove I can navigate without GPS.&lt;/p&gt;

&lt;p&gt;But I do think there is a useful question hidden underneath all of this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What do I still want to keep as mine?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't care that I can't remember everyone's phone number.&lt;/p&gt;

&lt;p&gt;I don't care that Google Maps remembers streets better than I do.&lt;/p&gt;

&lt;p&gt;But I do care whether I can explain why I made a decision.&lt;/p&gt;

&lt;p&gt;I care whether I understand the code I'm shipping.&lt;/p&gt;

&lt;p&gt;I care whether an opinion is actually mine or something I accepted because a system gave me a convincing answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Convenience has always had a trade
&lt;/h2&gt;

&lt;p&gt;Smartphones didn't suddenly make us incapable.&lt;/p&gt;

&lt;p&gt;They made certain abilities less necessary.&lt;/p&gt;

&lt;p&gt;And when an ability becomes unnecessary often enough, we naturally practice it less.&lt;/p&gt;

&lt;p&gt;AI may be another step in the same direction.&lt;/p&gt;

&lt;p&gt;Only this time the thing becoming less necessary might not be remembering a number or memorizing a route.&lt;/p&gt;

&lt;p&gt;It might be parts of the thinking process itself.&lt;/p&gt;

&lt;p&gt;That doesn't automatically make AI bad.&lt;/p&gt;

&lt;p&gt;But it does make the boundary worth noticing.&lt;/p&gt;

&lt;p&gt;Technology rarely arrives and says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give me this part of yourself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It gives us something useful.&lt;/p&gt;

&lt;p&gt;Something convenient.&lt;/p&gt;

&lt;p&gt;Something we quickly stop wanting to live without.&lt;/p&gt;

&lt;p&gt;And little by little, we decide what we no longer need to do ourselves.&lt;/p&gt;

&lt;p&gt;So when people ask whether AI is making us too dependent on technology, I'm starting to think the answer didn't begin with ChatGPT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI wasn't the beginning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've been making this trade for a long time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>techtalks</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>AME vs Aeronautical vs Aerospace Engineering After 12th PCM: Courses, Eligibility, Career Scope &amp; Salary in India</title>
      <dc:creator>Garvit Rajput</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:49:32 +0000</pubDate>
      <link>https://dev.to/garvit_rajput_e56c9e4bd02/ame-vs-aeronautical-vs-aerospace-engineering-after-12th-pcm-courses-eligibility-career-scope--4hpp</link>
      <guid>https://dev.to/garvit_rajput_e56c9e4bd02/ame-vs-aeronautical-vs-aerospace-engineering-after-12th-pcm-courses-eligibility-career-scope--4hpp</guid>
      <description>&lt;p&gt;Students who complete Class 12 with Physics, Chemistry and Mathematics (PCM) have several options in the aviation and aerospace sector. Among the popular choices are Aircraft Maintenance Engineering (AME), Aeronautical Engineering and Aerospace Engineering. Although all three are connected with aircraft and aviation technology, their course structure, work profile, eligibility requirements and career pathways are different.&lt;br&gt;
Choosing the right course after 12th PCM depends on whether a student is interested in aircraft maintenance, aircraft design, aviation technology, space systems or aerospace research.&lt;br&gt;
What Is AME After 12th PCM?&lt;br&gt;
AME stands for Aircraft Maintenance Engineering. It is a specialized aviation programme focused on the maintenance, inspection, servicing and airworthiness of aircraft.&lt;br&gt;
AME students learn about aircraft systems, engines, avionics, maintenance practices, aviation regulations and safety procedures. The training is designed around the requirements of aircraft maintenance and aviation safety.&lt;br&gt;
AME is particularly suitable for students who want to build a career in the aircraft maintenance and technical aviation sector rather than primarily focusing on aircraft design.&lt;br&gt;
What Do AME Students Study?&lt;br&gt;
Depending on the training category and institute, subjects may include:&lt;br&gt;
Aircraft Structures&lt;br&gt;
Aircraft Systems&lt;br&gt;
Aircraft Engines&lt;br&gt;
Aerodynamics&lt;br&gt;
Aircraft Maintenance Practices&lt;br&gt;
Aviation Safety&lt;br&gt;
Avionics&lt;br&gt;
Electrical Systems&lt;br&gt;
Maintenance Procedures&lt;br&gt;
Aviation Regulations&lt;br&gt;
AME Career Areas&lt;br&gt;
After completing the required training, examinations and applicable licensing requirements, career opportunities can include roles related to:&lt;br&gt;
Aircraft maintenance&lt;br&gt;
Aircraft inspection&lt;br&gt;
Aircraft servicing&lt;br&gt;
Aviation technical operations&lt;br&gt;
Maintenance, Repair and Overhaul (MRO)&lt;br&gt;
Airlines&lt;br&gt;
Aircraft maintenance organisations&lt;br&gt;
Aviation support organisations&lt;br&gt;
Important: AME is a regulated aviation pathway, so students should check the current DGCA requirements, approved training organisation status and applicable licensing requirements before taking admission.&lt;br&gt;
What Is Aeronautical Engineering After 12th PCM?&lt;br&gt;
Aeronautical Engineering focuses primarily on aircraft that operate within the Earth's atmosphere.&lt;br&gt;
Students learn how aircraft are designed, developed, tested and operated from an engineering perspective.&lt;br&gt;
The course generally covers areas such as:&lt;br&gt;
Aerodynamics&lt;br&gt;
Aircraft Structures&lt;br&gt;
Propulsion&lt;br&gt;
Flight Mechanics&lt;br&gt;
Aircraft Design&lt;br&gt;
Materials&lt;br&gt;
Avionics&lt;br&gt;
Aircraft Manufacturing&lt;br&gt;
Control Systems&lt;br&gt;
Aeronautical Engineering can be suitable for students interested in the engineering and technological aspects of aircraft.&lt;br&gt;
Career Areas in Aeronautical Engineering&lt;br&gt;
Graduates may explore opportunities in areas such as:&lt;br&gt;
Aircraft design&lt;br&gt;
Aircraft manufacturing&lt;br&gt;
Aerospace companies&lt;br&gt;
Aviation engineering&lt;br&gt;
Aircraft testing&lt;br&gt;
Production engineering&lt;br&gt;
Maintenance-related engineering support&lt;br&gt;
Research and development&lt;br&gt;
Government and private engineering organisations&lt;br&gt;
What Is Aerospace Engineering After 12th PCM?&lt;br&gt;
Aerospace Engineering is a broader field covering both aeronautics and astronautics.&lt;br&gt;
While aeronautical engineering primarily deals with aircraft operating in the atmosphere, aerospace engineering can also cover spacecraft, satellites, launch vehicles and other systems associated with space technology.&lt;br&gt;
Typical areas of study include:&lt;br&gt;
Aerodynamics&lt;br&gt;
Propulsion&lt;br&gt;
Aerospace Structures&lt;br&gt;
Flight Mechanics&lt;br&gt;
Spacecraft Systems&lt;br&gt;
Rocket Propulsion&lt;br&gt;
Avionics&lt;br&gt;
Satellite Technology&lt;br&gt;
Computational Methods&lt;br&gt;
Aerospace Materials&lt;br&gt;
Students interested in aircraft as well as space technology may consider aerospace engineering as a pathway.&lt;br&gt;
AME vs Aeronautical vs Aerospace Engineering&lt;br&gt;
Factor&lt;br&gt;
AME&lt;br&gt;
Aeronautical Engineering&lt;br&gt;
Aerospace Engineering&lt;br&gt;
Full Form&lt;br&gt;
Aircraft Maintenance Engineering&lt;br&gt;
Aeronautical Engineering&lt;br&gt;
Aerospace Engineering&lt;br&gt;
Main Focus&lt;br&gt;
Aircraft maintenance and airworthiness&lt;br&gt;
Aircraft engineering and technology&lt;br&gt;
Aircraft and space technology&lt;br&gt;
Main Orientation&lt;br&gt;
Maintenance/technical aviation&lt;br&gt;
Engineering/design&lt;br&gt;
Engineering/design + space&lt;br&gt;
Aircraft Systems&lt;br&gt;
Strong focus&lt;br&gt;
Strong focus&lt;br&gt;
Strong focus&lt;br&gt;
Aircraft Maintenance&lt;br&gt;
Core area&lt;br&gt;
Supporting/related area&lt;br&gt;
Supporting/related area&lt;br&gt;
Aircraft Design&lt;br&gt;
Limited focus&lt;br&gt;
Major area&lt;br&gt;
Major area&lt;br&gt;
Space Technology&lt;br&gt;
Limited&lt;br&gt;
Limited&lt;br&gt;
Major area&lt;br&gt;
Suitable Interest&lt;br&gt;
Aircraft maintenance&lt;br&gt;
Aircraft engineering&lt;br&gt;
Aircraft + space technology&lt;br&gt;
Career Environment&lt;br&gt;
Airlines, MRO, maintenance organisations&lt;br&gt;
Aviation/aerospace engineering organisations&lt;br&gt;
Aerospace, space and engineering organisations&lt;/p&gt;

&lt;p&gt;The three pathways are related but not interchangeable. The appropriate choice depends on the student's career interest and the specific qualification or licence they want to pursue.&lt;br&gt;
Eligibility After 12th PCM&lt;br&gt;
For students completing 12th PCM, eligibility varies according to the programme and institution.&lt;br&gt;
AME Eligibility&lt;br&gt;
AME admission requirements can vary by approved training organisation and programme. Students should check:&lt;br&gt;
10+2 or equivalent qualification&lt;br&gt;
Physics and Mathematics requirements&lt;br&gt;
Applicable minimum marks&lt;br&gt;
Age requirements, where applicable&lt;br&gt;
Medical requirements, where applicable&lt;br&gt;
Current DGCA requirements&lt;br&gt;
Aeronautical Engineering Eligibility&lt;br&gt;
For undergraduate engineering programmes, students generally need:&lt;br&gt;
10+2 with Physics and Mathematics&lt;br&gt;
Chemistry/another eligible subject as specified by the institution&lt;br&gt;
Required minimum marks&lt;br&gt;
Applicable entrance examination requirements&lt;br&gt;
Aerospace Engineering Eligibility&lt;br&gt;
Eligibility for undergraduate aerospace engineering programmes generally includes:&lt;br&gt;
10+2 with Physics and Mathematics&lt;br&gt;
Required qualifying subjects&lt;br&gt;
Minimum marks prescribed by the institution&lt;br&gt;
Applicable entrance examination requirements&lt;br&gt;
Students should always verify the latest admission criteria of the particular college or university because requirements can differ.&lt;br&gt;
Which Course Is More Suitable After 12th PCM?&lt;br&gt;
Instead of choosing a course only because it has the word aviation or aerospace in its name, students should first identify their preferred career direction.&lt;br&gt;
Choose AME if you are interested in:&lt;br&gt;
Aircraft maintenance&lt;br&gt;
Aircraft inspection&lt;br&gt;
Aircraft systems&lt;br&gt;
Aviation safety&lt;br&gt;
Technical aviation operations&lt;br&gt;
Airline and MRO environments&lt;br&gt;
Consider Aeronautical Engineering if you are interested in:&lt;br&gt;
Aircraft design&lt;br&gt;
Aerodynamics&lt;br&gt;
Aircraft structures&lt;br&gt;
Aircraft manufacturing&lt;br&gt;
Engineering and testing&lt;br&gt;
Aviation technology&lt;br&gt;
Consider Aerospace Engineering if you are interested in:&lt;br&gt;
Aircraft technology&lt;br&gt;
Spacecraft&lt;br&gt;
Satellites&lt;br&gt;
Launch vehicles&lt;br&gt;
Propulsion&lt;br&gt;
Aerospace research and development&lt;br&gt;
Career Scope After AME, Aeronautical and Aerospace Engineering&lt;br&gt;
The aviation and aerospace sectors include multiple technical and engineering career areas. However, career opportunities depend on factors such as qualification, licensing, practical training, technical skills, employer requirements and experience.&lt;br&gt;
AME Career Scope&lt;br&gt;
AME professionals can work toward careers involving:&lt;br&gt;
Aircraft maintenance&lt;br&gt;
Line maintenance&lt;br&gt;
Base maintenance&lt;br&gt;
Aircraft inspection&lt;br&gt;
MRO operations&lt;br&gt;
Aviation technical services&lt;br&gt;
Aeronautical Engineering Career Scope&lt;br&gt;
Aeronautical engineering graduates can explore:&lt;br&gt;
Aircraft engineering&lt;br&gt;
Aircraft design&lt;br&gt;
Manufacturing&lt;br&gt;
Testing&lt;br&gt;
Production&lt;br&gt;
Research and development&lt;br&gt;
Aviation technology&lt;br&gt;
Aerospace Engineering Career Scope&lt;br&gt;
Aerospace engineering graduates can explore areas such as:&lt;br&gt;
Aircraft systems&lt;br&gt;
Spacecraft systems&lt;br&gt;
Satellite technology&lt;br&gt;
Propulsion&lt;br&gt;
Aerospace manufacturing&lt;br&gt;
Research and development&lt;br&gt;
Defence and space technology&lt;br&gt;
Salary After AME, Aeronautical and Aerospace Engineering&lt;br&gt;
Salary is not fixed by the course name alone. It depends on the employer, job role, location, technical skills, experience, licensing status and industry segment.&lt;br&gt;
Factors That Can Affect Salary&lt;br&gt;
Educational qualification&lt;br&gt;
AME licence or applicable certification&lt;br&gt;
Type of organisation&lt;br&gt;
Technical specialisation&lt;br&gt;
Practical experience&lt;br&gt;
Job location&lt;br&gt;
Employer&lt;br&gt;
Aircraft or aerospace systems expertise&lt;br&gt;
Students should therefore avoid selecting a course solely on the basis of advertised salary figures.&lt;br&gt;
AME vs Aeronautical vs Aerospace: Course Selection Guide&lt;br&gt;
A simple way to understand the difference is:&lt;br&gt;
Aircraft Maintenance → AME&lt;br&gt;
Aircraft Engineering → Aeronautical Engineering&lt;br&gt;
Aircraft + Space Engineering → Aerospace Engineering&lt;br&gt;
However, these fields can overlap in subjects such as aerodynamics, propulsion, aircraft systems and materials. The major difference is the professional direction and depth of specialisation.&lt;br&gt;
Why 12th PCM Students Consider Aviation and Aerospace Courses&lt;br&gt;
Physics and Mathematics provide a strong academic foundation for understanding aircraft and aerospace technology. Chemistry can also support the study of engineering materials and related technical subjects.&lt;br&gt;
Students who enjoy:&lt;br&gt;
Physics&lt;br&gt;
Mathematics&lt;br&gt;
Aircraft technology&lt;br&gt;
Machines and systems&lt;br&gt;
Engineering&lt;br&gt;
Space technology&lt;br&gt;
Problem-solving&lt;br&gt;
may find aviation and aerospace-related education relevant to their interests.&lt;br&gt;
Conclusion&lt;br&gt;
After 12th PCM, AME, Aeronautical Engineering and Aerospace Engineering offer different pathways into the aviation and aerospace ecosystem.&lt;br&gt;
AME is primarily focused on aircraft maintenance, inspection and airworthiness. Aeronautical Engineering focuses on aircraft engineering and related technologies, while Aerospace Engineering provides a broader engineering scope that can include both aircraft and space systems.&lt;br&gt;
Before taking admission, students should compare the course curriculum, eligibility, institute recognition/approval, practical training, licensing requirements, career pathway and total fees rather than selecting a programme based only on its name or expected salary.&lt;/p&gt;

</description>
      <category>amecee</category>
    </item>
    <item>
      <title>An AI hardware advisor that walks every path — and gets its math checked by the rules in Sanity</title>
      <dc:creator>Helgard</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:49:32 +0000</pubDate>
      <link>https://dev.to/helgard_orlm/an-ai-hardware-advisor-that-walks-every-path-and-gets-its-math-checked-by-the-rules-in-sanity-21db</link>
      <guid>https://dev.to/helgard_orlm/an-ai-hardware-advisor-that-walks-every-path-and-gets-its-math-checked-by-the-rules-in-sanity-21db</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;An agent that answers "what computer do I need to run &lt;em&gt;this&lt;/em&gt; AI model?" — including "don't buy, rent" and&lt;br&gt;
"you already have enough". It reads a &lt;strong&gt;Sanity dataset of criteria&lt;/strong&gt;, not a catalog: laws (formulas for weights&lt;br&gt;
memory, KV cache, speed ceiling, own-vs-rent breakeven), machine-checkable rules, 11 &lt;strong&gt;solution paths&lt;/strong&gt;&lt;br&gt;
(keep what you have · upgrade · used · one GPU · multi-GPU · unified memory · MoE experts in system RAM ·&lt;br&gt;
CPU-only small model · smaller model · cloud API · rented GPU), run reports and reference hardware.&lt;br&gt;
New models appear every week, so anything not in the base is looked up on the web &lt;strong&gt;by the base's own checklist&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sanity project: &lt;code&gt;onwa0wvs&lt;/code&gt;, public dataset &lt;code&gt;v2&lt;/code&gt; (200 documents), Studio: &lt;a href="https://hw-for-ai-lab-v2.sanity.studio" rel="noopener noreferrer"&gt;https://hw-for-ai-lab-v2.sanity.studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agent connection: &lt;strong&gt;Sanity Context MCP&lt;/strong&gt; on the full dataset with &lt;strong&gt;embeddings enabled&lt;/strong&gt;
(&lt;code&gt;/context/mcp/onwa0wvs/v2&lt;/code&gt;); all numbers below are measured through this connection&lt;/li&gt;
&lt;li&gt;Second entry: a &lt;strong&gt;Knowledge Base&lt;/strong&gt; (&lt;code&gt;kbW7wsbtJQkl&lt;/code&gt;, built from the core 138 documents of the same dataset, refreshed weekly)
behind its own Context MCP endpoint in KB mode — created and connected, &lt;strong&gt;not measured separately&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo — try it with your own agent:&lt;/strong&gt; &lt;a href="https://hw-advisor.helgardorlm.tech" rel="noopener noreferrer"&gt;https://hw-advisor.helgardorlm.tech&lt;/a&gt; (MCP &lt;code&gt;https://hw-advisor.helgardorlm.tech/mcp&lt;/code&gt;, no login) · &lt;strong&gt;Replay of all 27 measured runs:&lt;/strong&gt; &lt;a href="https://helgard-orlm.github.io/sanity-ai-hardware-advisor/" rel="noopener noreferrer"&gt;https://helgard-orlm.github.io/sanity-ai-hardware-advisor/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/helgard-orlm/sanity-ai-hardware-advisor" rel="noopener noreferrer"&gt;https://github.com/helgard-orlm/sanity-ai-hardware-advisor&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live — bring your own agent (no login, no keys):&lt;/strong&gt; &lt;a href="https://hw-advisor.helgardorlm.tech" rel="noopener noreferrer"&gt;https://hw-advisor.helgardorlm.tech&lt;/a&gt; · MCP endpoint &lt;code&gt;https://hw-advisor.helgardorlm.tech/mcp&lt;/code&gt;&lt;br&gt;
Replay of all 27 measured runs: &lt;a href="https://helgard-orlm.github.io/sanity-ai-hardware-advisor/" rel="noopener noreferrer"&gt;https://helgard-orlm.github.io/sanity-ai-hardware-advisor/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/helgard-orlm/sanity-ai-hardware-advisor" rel="noopener noreferrer"&gt;https://github.com/helgard-orlm/sanity-ai-hardware-advisor&lt;/a&gt; (the public proxy with &lt;code&gt;check_answer&lt;/code&gt; is in &lt;a href="https://github.com/helgard-orlm/sanity-ai-hardware-advisor/tree/main/public_mcp" rel="noopener noreferrer"&gt;&lt;code&gt;public_mcp/&lt;/code&gt;&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project ID &lt;strong&gt;&lt;code&gt;onwa0wvs&lt;/code&gt;&lt;/strong&gt;, public dataset &lt;strong&gt;&lt;code&gt;v2&lt;/code&gt;&lt;/strong&gt; — 200 documents, 15 types (law, rule, solutionPath, aiModel, gpu, cpu, runReport, offer, cloudOffer, situationTemplate, …)&lt;/li&gt;
&lt;li&gt;Query it directly: &lt;a href="https://onwa0wvs.api.sanity.io/v2025-01-01/data/query/v2?query=*%5B_type==%22law%22%5D" rel="noopener noreferrer"&gt;https://onwa0wvs.api.sanity.io/v2025-01-01/data/query/v2?query=*[_type=="law"]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Studio: &lt;a href="https://hw-for-ai-lab-v2.sanity.studio" rel="noopener noreferrer"&gt;https://hw-for-ai-lab-v2.sanity.studio&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it with your own agent (no keys, no login)
&lt;/h2&gt;

&lt;p&gt;The demo is a public MCP endpoint, not a hosted chatbot: &lt;strong&gt;you bring the agent, the base brings the knowledge and the checking.&lt;/strong&gt;&lt;br&gt;
Add &lt;code&gt;https://hw-advisor.helgardorlm.tech/mcp&lt;/code&gt; to ChatGPT (developer mode), Claude, Claude Code, Codex, Cursor or VS Code.&lt;br&gt;
There are one-click buttons for Cursor and VS Code on the page. Or paste one line into any agent that can run commands:&lt;br&gt;
&lt;em&gt;"Read &lt;a href="https://hw-advisor.helgardorlm.tech/setup.md" rel="noopener noreferrer"&gt;https://hw-advisor.helgardorlm.tech/setup.md&lt;/a&gt; and follow it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Behind it is a ~230-line stdlib proxy. It passes the four &lt;strong&gt;Sanity Context MCP&lt;/strong&gt; tools through unchanged and keeps the token&lt;br&gt;
server-side. It puts today's date and the advisor's work order in front of &lt;code&gt;initial_context&lt;/code&gt;. It adds one tool, &lt;strong&gt;&lt;code&gt;check_answer&lt;/code&gt;&lt;/strong&gt;,&lt;br&gt;
which is the same validator the app uses: it recomputes every calculation with the &lt;code&gt;law.formula&lt;/code&gt; stored in Sanity.&lt;br&gt;
In the first outside test (Codex, its own subscription), &lt;code&gt;check_answer&lt;/code&gt; rejected the first draft with 4 errors. The second draft passed:&lt;br&gt;
5 calculations recomputed, 11/11 solution paths walked. A test from ChatGPT (developer mode) also went through to a passing check. Agents that can only browse get the same tools as plain HTTPS links&lt;br&gt;
(&lt;code&gt;/api/context&lt;/code&gt;, &lt;code&gt;/api/query?q=…&lt;/code&gt;, &lt;code&gt;/api/check&lt;/code&gt;), listed in &lt;code&gt;/llms.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Known limit:&lt;/strong&gt; the check covers numbers, completeness, sources and identity. It does not cover whether a verdict makes sense. In one test an agent said &lt;em&gt;yes&lt;/em&gt; to "MoE experts in RAM" for a dense model, and the check passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;Sanity Context MCP tools the agent calls: &lt;code&gt;initial_context&lt;/code&gt;, &lt;code&gt;groq_query&lt;/code&gt;, &lt;code&gt;schema_explorer&lt;/code&gt;, &lt;code&gt;array_field_reader&lt;/code&gt; (plus our &lt;code&gt;check_answer&lt;/code&gt;). What it does with the content it retrieves — the structure is used, not just searched:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paths are data.&lt;/strong&gt; The agent must give a yes/no/maybe with a number for &lt;em&gt;every&lt;/em&gt; &lt;code&gt;solutionPath&lt;/code&gt; document.
Before this, the same model answered a 321B-MoE question with "4×H200" and never mentioned the
one-GPU + large-RAM path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules are the search checklist.&lt;/strong&gt; For any model/card/CPU that is not in the base, the app requires the
fields that the base's &lt;code&gt;rule&lt;/code&gt; documents test for that type (e.g. &lt;code&gt;cpu.instructionSets&lt;/code&gt;, &lt;code&gt;aiModel.variants.fileGb&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laws are recomputed by code.&lt;/strong&gt; The agent writes every calculation with its inputs into a hidden check block;
the app evaluates the &lt;code&gt;law.formula&lt;/code&gt; from Sanity and sends the answer back if the number is wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The person's situation is stored&lt;/strong&gt;, not remembered: country, budget, existing PC survive a change of mind.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same code checks the &lt;strong&gt;base itself&lt;/strong&gt;: every &lt;code&gt;law&lt;/code&gt; variable and &lt;code&gt;rule&lt;/code&gt; path must be a real schema field&lt;br&gt;
(coverage check), and laws get property tests. That caught the filler model writing an own-vs-rent formula that&lt;br&gt;
&lt;em&gt;added&lt;/em&gt; electricity instead of subtracting it and billed rent for 24 h/day — &lt;strong&gt;12.3 vs 110 months&lt;/strong&gt; on the same inputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real trace (GLM-5.3-Flash, not in the base) — &lt;a href="https://helgard-orlm.github.io/sanity-ai-hardware-advisor/?sc=A2_not_in_base&amp;amp;run=1" rel="noopener noreferrer"&gt;open it in the replay&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;GROQ over the base → no &lt;code&gt;aiModel&lt;/code&gt; document → 8 web searches &lt;strong&gt;by the base's own checklist&lt;/strong&gt;: the model card and
&lt;code&gt;config.json&lt;/code&gt; (layers, KV heads, head dim), file sizes, and the GPU fields the base's rules test (slots, bandwidth, compute capability).&lt;/li&gt;
&lt;li&gt;Laws from Sanity: weights &lt;code&gt;320 × 4 / 8 = 160 GB&lt;/code&gt; (NVFP4), KV for 8k context 22.5 GiB (flagged as rough for hybrid attention).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validator round 1 sent the answer back:&lt;/strong&gt; the speed ceiling was written as &lt;strong&gt;19.91&lt;/strong&gt; tok/s — code evaluated the
&lt;code&gt;law.formula&lt;/code&gt; from Sanity with the agent's own inputs and got &lt;strong&gt;199.1&lt;/strong&gt; (a 10× slip); plus three entities missing
fields that the base's rules check (e.g. &lt;code&gt;variants.fileGb&lt;/code&gt;, &lt;code&gt;slots&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Round 2: no errors. All 11 solution paths get a verdict — multi-GPU = yes, MoE-in-RAM / unified memory = maybe, cloud = no
(the person ruled it out) — and the build is 3 × RTX PRO 6000 (288 GB) with the numbers above.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other catches by the same recomputation in the measured run: KV cache 0.949 → 6.75 GiB (A4), monthly electricity cost 0.675 → 2.025 (A5).&lt;/p&gt;

&lt;h2&gt;
  
  
  Measured, honestly
&lt;/h2&gt;

&lt;p&gt;Blind grader (a different model, sees only the dialogue and a frozen checklist), 9 scenarios × 3 runs,&lt;br&gt;
78 checklist items, same base state for all arms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;version&lt;/th&gt;
&lt;th&gt;score&lt;/th&gt;
&lt;th&gt;median time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v2: base + instructions&lt;/td&gt;
&lt;td&gt;47/78&lt;/td&gt;
&lt;td&gt;62 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3: + solution paths, validator&lt;/td&gt;
&lt;td&gt;53/78&lt;/td&gt;
&lt;td&gt;104 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3.1 via &lt;strong&gt;Sanity Context MCP&lt;/strong&gt;: + rules-as-checklist, recomputed laws, dated prices&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;59/78&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;181 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What this does &lt;strong&gt;not&lt;/strong&gt; show: that structured retrieval beats plain text for reading. The same 200 documents&lt;br&gt;
pasted as text notes scored the same as v3 (53/78) — at this size the model reads either. Where structure&lt;br&gt;
mattered in our runs is &lt;strong&gt;checking&lt;/strong&gt;: fewer first answers rejected by the validator with structured queries&lt;br&gt;
(8/27 vs 14/27), and the gains of v3.1 are exactly in the scenarios where code recomputes Sanity's laws&lt;br&gt;
(KV for 8 users 7/9 → 9/9, own vs rent 5/12 → 7/12, "don't buy" 4/6 → 6/6, v2 → v3.1). The price: answers take ~3× longer.&lt;br&gt;
An earlier full run of v3.1 scored 62/78 with two bugs in my own checker (nested fields, European number format) that sent&lt;br&gt;
correct answers back for rework; after fixing them the clean run scored 59/78 — with N=3 per scenario, 59 vs 62 is noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it was built
&lt;/h2&gt;

&lt;p&gt;Architect method: a &lt;strong&gt;risk catalog&lt;/strong&gt; (16 classes of agent failure seen in earlier sessions) → acceptance scenarios&lt;br&gt;
written &lt;em&gt;before&lt;/em&gt; changes → build → blind grading. The base was filled by a model (GPT Luna) from an empty schema and&lt;br&gt;
two prompts; I never wrote data by hand. An independent judge model watched the session and corrected the method&lt;br&gt;
several times (frozen checklist, snapshot baseline, text control).&lt;/p&gt;

&lt;h2&gt;
  
  
  Known limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Answers are slow (minutes) because the validator can send them back up to twice.&lt;/li&gt;
&lt;li&gt;Ratings N=3 per scenario; differences of 1–2 points are noise.&lt;/li&gt;
&lt;li&gt;"unknown after search" is allowed and can be abused for vague entities.&lt;/li&gt;
&lt;li&gt;In the measured run 12 of 27 answers came out in Russian to English questions (an account language setting leaked in);
the app now checks the answer's language in code and sends it back (3/3 English on a re-test).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
